目次
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のスカラー値として宣言