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 0 1 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 10 10 #視点の位置
  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題目。でも、今さら感、満載。(-_-)だな。


トップ /前ページ /次ページ