目次
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/
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を起動させると立方体が表示される。
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>をとすることで、モデルに高さを与えることができる。
モデルのデータへのリンクは
<Link>
<href>models/Untitled.dae</href>
</Link>
で、
モデルの位置は
<Location>
<longitude>-105.283000000000</longitude>
<latitude>40.017000000000</latitude>
<altitude>0.000000000000</altitude>
</Location>
で表されている。ここを変更することで、任意の位置にモデルを表示させることが出来る。(カメラ位置等も同時に変更する必要がある)
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>
注)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')
Earthモデルでこんなこともできる
次に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')
Colladaのスキーマ参照
<phong>要素の子要素 <emission>このオブジェクトから放射される光源の量 <ambient>このオブジェクトから放射される環境光の量 <diffuse>このオブジェクトから反射される拡散光の量 <specular>このオブジェクトから反射される鏡面反射光の量 <transparency>反射されたカラーに追加する完全鏡面反射の量を0.0〜1.0のスカラー値として宣言