目次

目的

Colladaは多くの3Dアプリケーションで作成できる3次元モデリングの標準的なフォーマットです。
GoogleEarthのKMLフォーマットと組み合わせることで、GoogleEarth上で高度な表現が可能となります。
また、ColladaはKMLと同様XMLファイルなのでXMLパッケージを用いて根気さえあれば、Rのプログラムで作成可能ですが、
根気がない方はGoogle3DギャラリーからColladaデータを仕入れることができます。
仕入れたColladaデータを種にして、KMLを作成することで、GoogleEarth上で3Dモデルを自由に表示できます。
注)この方法はTMEを参考にしています。http://thematicmapping.org/

コメント


本家および参考

サンプルデータ

Google3Dギャラリー:http://www.google.com/intl/ja/sketchup/3dwh/

Cube

http://sketchup.google.com/3dwarehouse/details?mid=27544873c4d76907c1fae53e8cd38b70&prevstart=0

Cubeをダウンロードした後、zipを解凍する。(このデータは基本的にkmzです。拡張子をkmzにすれば、圧縮されたままGEに表示可能です)

フォルダ名:Cube
doc.kml :kmlデータ
models - Untitled.dae :Colladaデータ本体。拡張子は.dae
textures.txt :テクスチャーのパス


doc.kmlをダブルクリックして、GoogleEarthを起動させると立方体が表示される。

cube.png

doc.kml

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.1'>
<Folder>
   <name>model</name>
   <description><![CDATA[Created with <a href="http://sketchup.google.com/">Google SketchUp 7.0.1</a>]]></description>
   <DocumentSource>SketchUp</DocumentSource>
<visibility>1</visibility>
<LookAt>
<heading>262.191</heading>
<tilt>44.1136</tilt>
<latitude>40.01699238066453</latitude>
<longitude>-105.28299564475</longitude>
<range>24.53937342688344</range>
<altitude>19.53467884911257</altitude>
</LookAt>
<Folder>
<name>Tour</name>
<Placemark>
<name><![CDATA[Camera]]></name>
<visibility>1</visibility>
<LookAt>
<heading>262.191</heading>
<tilt>44.1136</tilt>
<latitude>40.01699238066453</latitude>
<longitude>-105.28299564475</longitude>
<range>24.53937342688344</range>
<altitude>19.53467884911257</altitude>
</LookAt>
</Placemark>
</Folder>
 <Placemark>
   <name>Model</name>
   <description><![CDATA[]]></description>
   <Style id='default'>
   </Style>
   <Model>
       <altitudeMode>relativeToGround</altitudeMode>
       <Location>
           <longitude>-105.283000000000</longitude>
           <latitude>40.017000000000</latitude>
           <altitude>0.000000000000</altitude>
       </Location>
       <Orientation>
           <heading>0</heading>
           <tilt>0</tilt>
           <roll>0</roll>
       </Orientation>
       <Scale>
           <x>1.0</x>
           <y>1.0</y>
           <z>1.0</z>
       </Scale>
       <Link>
           <href>models/Untitled.dae</href>
       </Link>
   </Model>
 </Placemark></Folder>
</kml>

モデルの大きさをコントロールしているのは、

       <Scale>
           <x>1.0</x>
           <y>1.0</y>
           <z>1.0</z>
       </Scale>

の部分なので、この部分を調整することでモデルを変形させることができる。
例えば、<z>10.0</z>をとすることで、モデルに高さを与えることができる。

cube2.png

モデルのデータへのリンクは

      <Link>
          <href>models/Untitled.dae</href>
      </Link>

で、
モデルの位置は

      <Location>
          <longitude>-105.283000000000</longitude>
          <latitude>40.017000000000</latitude>
          <altitude>0.000000000000</altitude>
      </Location>

で表されている。ここを変更することで、任意の位置にモデルを表示させることが出来る。(カメラ位置等も同時に変更する必要がある)

cube3.png

Earth(テクスチャー付きモデル)

http://sketchup.google.com/3dwarehouse/details?mid=e28ae2b252fb673dd3dc6a02a09b40ca&prevstart=0

フォルダ名:Earth
doc.kml :kmlデータ
models - Earth.dae :Colladaデータ本体
images - texture0.jpg :テクスチャー画像本体
textures.txt :テクスチャーのパス


doc.kmlの構造は、Cubeと同じ。imagesフォルダ内にテクスチャー画像本体、textures.txtにテクスチャーのパスが書かれている。

textures.txt

<../images/texture0.jpg> <../images/texture0.jpg>
earth.PNG

XMLパッケージでdoc.kmlを変更

注)R2.9.0 XML1.96で実行。R2.9.0 XML2.3だと ' がうまく処理できない。(Mac,Win)

library(XML)
doc<-xmlTreeParse("c:/Cube/doc.kml")
x<-xmlRoot(doc)

nameの取り出し

> x[["Folder"]][["name"]]
<name>Untitled</name>

LookAtの取り出し

> x[["Folder"]][["LookAt"]]
<LookAt>
 <heading>262.191</heading>
 <tilt>44.1136</tilt>
 <latitude>40.01701377579173</latitude>
 <longitude>-105.2827974289775</longitude>
 <range>21.03339538452086</range>
 <altitude>19.53467884911257</altitude>
</LookAt>

カメラ位置

> x[["Folder"]][["Folder"]][["Placemark"]][["LookAt"]]
<LookAt>
 <heading>262.191</heading>
 <tilt>44.1136</tilt>
 <latitude>40.01701377579173</latitude>
 <longitude>-105.2827974289775</longitude>
 <range>21.03339538452086</range>
 <altitude>19.53467884911257</altitude>
</LookAt>
> 

Locationの取り出し

> x[["Folder"]][["Placemark"]][["Model"]][["Location"]]
<Location>
 <longitude>-105.283000000000</longitude>
 <latitude>40.017000000000</latitude>
 <altitude>0.000000000000</altitude>
</Location>
> 

Scaleの取り出し

> x[["Folder"]][["Placemark"]][["Model"]][["Scale"]]
<Scale>
 <x>1.0</x>
 <y>1.0</y>
 <z>1.0</z>
</Scale>
> 

モデルの高さを10倍にしてノードに書き込む。書き込む時はxmlNode()を使う。

> x[["Folder"]][["Placemark"]][["Model"]][["Scale"]][["z"]]<-xmlNode("z","10.0")
> x[["Folder"]][["Placemark"]][["Model"]][["Scale"]][["z"]]
[1] "<z>10.0</z>"

保存

>saveXML(x,"c:/Cube/doc2.kml",prefix = '<?xml version="1.0" encoding="UTF-8"?>\n')
cube2.png

Earthモデルでこんなこともできる

earth2.PNG

XMLパッケージでColladaデータ(***.dae)を変更

次にColladaデータを変更してみよう。変更場所は、主に色関係の所だけだ。

<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
〜中略〜
  <library_effects>
     <effect id="FrontColorNoCulling-effect" name="FrontColorNoCulling-effect">
        <profile_COMMON>
           <technique sid="COMMON">
              <phong>
                 <emission>
                    <color>0.000000 0.000000 0.000000 1</color>
                 </emission>
                 <ambient>
                    <color>0.000000 0.000000 0.000000 1</color>
                 </ambient>
                 <diffuse>
                    <color>1.000000 1.000000 1.000000 1</color>
                 </diffuse>
                 <specular>
                    <color>0.330000 0.330000 0.330000 1</color>
                 </specular>
                 <shininess>
                    <float>20.000000</float>
                 </shininess>
                 <reflectivity>
                    <float>0.100000</float>
                 </reflectivity>
                 <transparent>
                    <color>1 1 1 1</color>
                 </transparent>
                 <transparency>
                    <float>0.000000</float>
                 </transparency>
              </phong>
           </technique>
           <extra>
              <technique profile="GOOGLEEARTH">
                 <double_sided>1</double_sided>
              </technique>
           </extra>
        </profile_COMMON>
     </effect>
     <effect id="ForegroundColor-effect" name="ForegroundColor-effect">
        <profile_COMMON>
           <technique sid="COMMON">
              <phong>
                 <emission>
                    <color>0.000000 0.000000 0.000000 1</color>
                 </emission>
                 <ambient>
                    <color>0.000000 0.000000 0.000000 1</color>
                 </ambient>
                 <diffuse>
                    <color>0.000000 0.000000 0.000000 1</color>
                 </diffuse>
                 <specular>
                    <color>0.330000 0.330000 0.330000 1</color>
                 </specular>
                 <shininess>
                    <float>20.000000</float>
                 </shininess>
                 <reflectivity>
                    <float>0.100000</float>
                 </reflectivity>
                 <transparent>
                    <color>1 1 1 1</color>
                 </transparent>
                 <transparency>
                    <float>0.000000</float>
                 </transparency>
              </phong>
           </technique>
           <extra>
              <technique profile="GOOGLEEARTH">
                 <double_sided>1</double_sided>
              </technique>
           </extra>
        </profile_COMMON>
     </effect>
  </library_effects>
〜中略〜
  <scene>
     <instance_visual_scene url="#SketchUpScene"/>
  </scene>
</COLLADA>

色関係のタグは2種類ある。ここでは最初のタグだけ変えてみる。
で、プログラムは

library(XML)
doc<-xmlTreeParse("c:/Cube/models/Untitled.dae")
x<-xmlRoot(doc)

各要素の値を取り出す

> x[["library_effects"]][[1]][[1]][[1]][["phong"]][["emission"]][["color"]]
<color>0.000000 0.000000 0.000000 1</color>
> x[["library_effects"]][[1]][[1]][[1]][["phong"]][["ambient"]][["color"]]
<color>0.000000 0.000000 0.000000 1</color>
> x[["library_effects"]][[1]][[1]][[1]][["phong"]][["diffuse"]][["color"]]
<color>1.000000 1.000000 1.000000 1</color>
> x[["library_effects"]][[1]][[1]][[1]][["phong"]][["transparency"]][["float"]]
<float>0.000000</float>

値の変更(emissionを赤に)

> x[["library_effects"]][[1]][[1]][[1]][["phong"]][["emission"]][["color"]]<-xmlNode("color","1 0 0 1")
> saveXML(x,"c:/Cube/models/Untitled.dae",prefix = '<?xml version="1.0" encoding="UTF-8"?>\n')
cube4.PNG

Colladaのタグ<phong>要素

Colladaのスキーマ参照

<phong>要素の子要素
<emission>このオブジェクトから放射される光源の量
<ambient>このオブジェクトから放射される環境光の量
<diffuse>このオブジェクトから反射される拡散光の量
<specular>このオブジェクトから反射される鏡面反射光の量
<transparency>反射されたカラーに追加する完全鏡面反射の量を0.0〜1.0のスカラー値として宣言

添付ファイル: filecube3.png 1199件 [詳細] filecube.png 1204件 [詳細] filecube4.PNG 1159件 [詳細] fileearth.PNG 1187件 [詳細] fileearth2.PNG 1198件 [詳細] filecube2.png 1194件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:17