VRML(20051008)
VRMLで車両を作ってみたい、と思ったのであった。
いや、心配ご無用。もちろん、VRMLに関する知識ならある。
「名前は知っている」とゆー程度だが。(-_-)また、かい。
まぁ、為せば成るだ。つまり、成るように成るだ。(-_-)それ、だいぶ違う。
まずは、車輪から。
形を作るには「Shape」なるものを使うらしい。
「Shape」には、いろいろな形が用意されていて、例えば車輪を作るなら「Cylinder(円柱)」が適。
↓こんなものを書いて「○○.wrl」という名前で保存して、VRMLを表示するアドオンソフトをインストールすると、3次元でグリグリできるのだ。
#形状を生成する(車輪)
Shape {
geometry Cylinder { #円柱
height 0.001 #厚さ
radius 0.0025 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
図 車輪のモデル(クリックでVRMLを表示)
次は、車輪をもう一つ。
「Cylinder」を増やせばいーだけだが、位置を指定しないと、同じ場所(原点=0,0,0)に重なってしまう。
で、位置を指定するには「Transform」を使うらしい。
「Transform」で「Shape」を囲う形。しかし、なんだか、カッコだらけ、カッコつけ過ぎじゃん。
#形状を生成する(車輪1/2)
Transform {
translation 0 0 -0.005 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.001 #厚さ
radius 0.0025 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
#形状を生成する(車輪2/2)
Transform {
translation 0 0 0.005 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.001 #厚さ
radius 0.0025 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
図 車輪のモデル(クリックでVRMLを表示)
形を作って位置を指定できれば、もはや何でもできそーな気分に。(-_-)オイオイ。
同じく「Cylinder」で、フランジと車軸を追加。
ついでに、線路面の高さを0(z=0)にすることにして車輪ほかの高さを調整。
#形状を生成する(フランジ1/2)
Transform {
translation 0 0.0025 0.004525 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.0005 #厚さ
radius 0.003 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
#形状を生成する(フランジ2/2)
Transform {
translation 0 0.0025 -0.004525 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.0005 #厚さ
radius 0.003 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
#形状を生成する(車軸)
Transform {
translation 0 0.0025 0 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.009 #厚さ
radius 0.001 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
図 車輪と車軸のモデル(クリックでVRMLを表示)
さて、ここから先に進むには、作る車両を決めなきゃいけないが。
なんとなく、コキ10000なんか選んでみたり。
もし途中で面倒になったら、コンテナ省略という逃げ道もあるし。(-_-)すでに逃げ腰。
写真 KATOのコキ10000
まずは車輪を増やすところから。
また一から作るのも悪くはないが、できればコピーで済ませたい。
で、コピーをするには「DEF」と「USE」を、対象をまとめるには「Group」を使うらしい。
ついでに、車両中心を原点(x=0、y=0)にすることにして車輪ほかの位置を調整。
#グループ化する
#↓ここからグループ化
DEF Obj2 Group {
children [
#グループ化する
#↓ここからグループ化
DEF Obj1 Group {
children [
#形状を生成する(車輪1/2)
Transform {
translation -0.051 0.025 -0.005 #移動距離
children [
Shape {
geometry Cylinder { #円柱
height 0.001 #厚さ
radius 0.0025 #半径
}
appearance Appearance {
material Material {
diffuseColor 0.5 0.5 0.5 #色
}
}
}
]
}
・
・
]
}
#↑ここまでグループ化(Obj1)
#グループ化したものを使う(車輪、フランジ、車軸)
Transform {
children USE Obj1
translation 0.014 0 0
}
]
}
#↑ここまでグループ化(Obj2)
#グループ化したものを使う(車輪、フランジ、車軸の組)
Transform {
children USE Obj2
center 0 0 0 #回転中心
rotation 0 1 0 3.1417159 #回転軸と角度
}
図 車輪と車軸のモデル(クリックでVRMLを表示)
とりあえず、車輪はこれで切り上げて、次は車体を。
車体を作るには「Box(直方体)」や「IndexedFaceSet(ポリゴン)」が適。
ただし、「IndexedFaceSet」は、ちと面倒。ホントは三角柱とか角錐台があると良いのに。
#形状を生成する(車体中央)
Transform {
translation 0 0.008 0 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.118 0.001 0.014 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0 0.5 #色
}
}
}
]
}
#グループ化する
#↓ここからグループ化
DEF Obj4 Group {
children [
#グループ化する
#↓ここからグループ化
DEF Obj3 Group {
children [
#形状を生成する(車体側面1/5)
Transform {
translation -0.04825 0.0075 -0.00775 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.0215 0.002 -0.0015 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0 0.5 #色
}
}
}
]
}
#形状を生成する(車体側面2/5)
Transform {
translation -0.0275 0.0085 -0.00775 #移動距離
children [
Shape {
geometry IndexedFaceSet {
solid FALSE
coord Coordinate {
point [
-0.01 0 -0.00075, 0.01 0 -0.00075, 0.01 -0.005 -0.00075, -0.01 -0.002 -0.00075,
-0.01 0 0.00075, 0.01 0 0.00075, 0.01 -0.005 0.00075, -0.01 -0.002 0.00075
]
}
color Color {
color [
0 0 0.5
]
}
coordIndex [
0 1 2 -1 2 3 0 -1 4 5 6 -1 6 7 4 -1
0 4 7 -1 7 3 0 -1 1 5 6 -1 6 2 1 -1
0 1 5 -1 5 4 0 -1 3 2 6 -1 6 7 3 -1
]
colorIndex [
0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1
0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1
0 0 0 -1 0 0 0 -1 0 0 0 -1 0 0 0 -1
]
}
}
]
}
]
}
#↑ここまでグループ化(Obj3)
#形状を生成する(車体側面3/5)
Transform {
translation 0 0.006 -0.00775 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.035 0.005 0.0015 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0 0.5 #色
}
}
}
]
}
#グループ化したものを使う(車体側面4/5、5/5)
Transform {
children USE Obj3
center 0 0 -0.00775 #回転中心
rotation 0 1 0 3.1417159 #回転軸と角度
}
]
}
#↑ここまでグループ化(Obj4)
#グループ化したものを使う(反対側の車体側面)
Transform {
children USE Obj4
center 0 0 0 #回転中心
rotation 0 1 0 3.1417159 #回転軸と角度
}
#形状を生成する(車体端面)
Transform {
translation 0.05875 0.0115 0 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.0005 0.006 0.017 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0 0.5 #色
}
}
}
]
}
図 車体のモデル(クリックでVRMLを表示)
って、これじゃ、わからんなぁ。ちょっと視点を変えないと。
視点を設定するのは「Viewpoint」。
視点の位置は簡単だが、視線の方向は、ちと厄介。ってゆーか、コンガラガる。
図 視線の方向とモデルの見え方
斜め上方から見下ろすように。
おー、なんとなく、それらしーフンイキが。
#視点を設定する
Viewpoint {
position 0 0.1 0.1 #視点の位置
orientation 1 0 0 -0.78539816 #視線の方向
}
図 コキ10000のモデル(クリックでVRMLを表示)
最後はコンテナだ。
コンテナを作るには「Box(直方体)」が適。
オマケの文字は「Text(文字)」で。でも日本語の書き方がわからない。
ここでも、コピーは使い甲斐があり。
#グループ化する
#↓ここからグループ化
DEF Obj7 Group {
children [
Transform {
translation -0.0475 0.017 0 #移動距離
children [
#形状を生成する(コンテナ本体)
Shape {
geometry Box { #直方体
size0.022 0.015 0.016 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0.7 0 #色
}
}
}
#グループ化する
#↓ここからグループ化
DEF Obj6 Group {
children [
#形状を生成する(コンテナ文字1/2)
Transform {
translation 0 0.003 0.008 #移動距離
children [
Shape {
geometry Text { #文字
string ["GAGAARIN"]
fontStyle FontStyle {
justify "MIDDLE"
style "BOLD"
size 0.004
}
}
appearance Appearance {
material Material {
diffuseColor 0 0 0 #色
}
}
}
]
}
]
}
#↑ここまでグループ化(Obj6)
#グループ化したものを使う(コンテナ文字2/2)
Transform {
children USE Obj6
center 0 0 0 #回転中心
rotation 0 1 0 3.1415926 #回転軸と角度
}
#グループ化する
#↓ここからグループ化
DEF Obj5 Group {
children [
#形状を生成する(コンテナ脚部1/4)
Transform {
translation -0.009 -0.008 -0.006 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.004 0.001 0.004 #長さ、高さ、巾
}
appearance Appearance {
material Material {
diffuseColor 0 0.7 0 #色
}
}
}
]
}
#形状を生成する(コンテナ脚部2/4)
Transform {
translation -0.009 -0.008 0.006 #移動距離
children [
Shape {
geometry Box { #直方体
size 0.004 0.001 0.004 #長さ、巾、高さ
}
appearance Appearance {
material Material {
diffuseColor 0 0.7 0 #色
}
}
}
]
}
]
}
#↑ここまでグループ化(Obj5)
#グループ化したものを使う(コンテナ脚部3/4、4/4)
Transform {
children USE Obj5
center 0 0 0 #回転中心
rotation 0 1 0 3.1415926 #回転軸と角度
}
]
}
]
}
#↑ここまでグループ化(Obj7)
#グループ化したものを使う(コンテナ2/5)
Transform {
children USE Obj7
translation 0.023 0 0 #移動距離
}
#グループ化したものを使う(コンテナ3/5)
Transform {
children USE Obj7
translation 0.046 0 0 #移動距離
}
#グループ化したものを使う(コンテナ4/5)
Transform {
children USE Obj7
translation 0.069 0 0 #移動距離
}
#グループ化したものを使う(コンテナ5/5)
Transform {
children USE Obj7
translation 0.092 0 0 #移動距離
}
図 コキ10000のモデル(クリックでVRMLを表示)
いやー、もうできちゃったよ。
簡単すぎて、ホント、マイった。(-_-)ウソつけ。
謝辞
VRMLの情報については、「VRMLリファレンス&サンプル」のHPを利用させていただきました。
(http://www.cwbp.com/vrml/ref/)
有用なサービスをご提供いただきまして、本当にありがとうございます。
追記(20211017)
フツーのXYZ座標系とVRMLのXYZ座標系が違う、という衝撃(笑撃?)的事実に基づき、座標系を変更。
ついでに、長年シカトして放置していた、距離の値をメートル基準に変更。
まずは、1題目。でも、今さら感、満載。(-_-)だな。