とりあえずやってみる
これまでに使ってきたサンプルをベースに、
- PROTO側 : 形状側を2部品(ローカル原点を除いて)に分け、部分着色をできるようにする
- EXTERNPROTO側 : 時間軸に沿って移動やら回転やら
をやってみた。
PROTO側
#VRML V2.0 utf8 #Right Upper Arm PROTO filename=RUpperArm.wrl PROTO RUpperArm [ exposedField SFColor shouldercolor 0.8 0.8 0.5 exposedField SFColor elbowcolor 0.8 0.8 0.5 exposedField SFVec3f objscale 1 1 1 ] { # PROTO ここから Transform { children [ # ローカル座標系 Transform { scale 0.1 0.1 0.1 children [ Inline { url ["localcoord.wrl"] } ] } # ZX平面の押し出し -> XY平面の押し出しに変える Transform { rotation 0 1 0 1.57 children [ Transform { rotation 0 0 1 1.57 scale IS objscale children[ # 形状 # 肩側 Shape { appearance Appearance { material Material { diffuseColor IS shouldercolor } } geometry Extrusion { crossSection [ 0 0.7, 0.7 0.5, 0.85 0, 0.7 -0.3, 0 -0.5, -0.7 -0.3, -0.85 0, -0.7 0.5, 0 0.7 ] spine [ 0 -0.5 0, 0 -0.3 0, 0 0 0 ] scale [ 0.25 0.25 0.27 0.27 0.2 0.2 ] solid TRUE beginCap TRUE endCap TRUE } } # ひじ側 Shape { appearance Appearance { material Material { diffuseColor IS elbowcolor } } geometry Extrusion { crossSection [ 0 0.7, 0.7 0.5, 0.85 0, 0.7 -0.3, 0 -0.5, -0.7 -0.3, -0.85 0, -0.7 0.5, 0 0.7 ] spine [ 0 -1 0, 0 -0.5 0 ] scale [ 0.2 0.2 0.25 0.25 ] solid TRUE beginCap TRUE endCap TRUE } } ] } ] } ] } # PROTO ここまで }
EXTERNPROTO側
#VRML V2.0 utf8 #Inlineの練習 filename=testexternproto2.wrl EXTERNPROTO RUpperArm [ exposedField SFColor shouldercolor # exposedField SFcolor elbowcolor exposedField SFVec3f objscale ] [ "RUpperArm.wrl" ] DEF WORLD Transform { # Zが縦になるように座標変換 # ここは固定で必ずつける translation 0 0 0 rotation -1 -1 -1 2.09 # 固定でつけるところここまで children [ Inline { url ["localcoord.wrl"] } # 右上腕 DEF TRUpperArm Transform { children [ DEF YRUpperArm Transform { children[ DEF XRUpperArm Transform { children[ DEF ZRUpperArm Transform { children[ DEF Rua RUpperArm { objscale 1 1 1 } ] } ] } ] } ] } ] } # 時間軸の操作 cycleIntervalは12秒の動作なら12にするべき DEF TS TimeSensor { cycleInterval 10 loop TRUE } # 移動・回転 #右上腕 DEF RuaPosition PositionInterpolator { key [0, 1] keyValue [ 0 0 0, 1 1 1 ] } DEF ZRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 0 0 1 0, 0 0 1 1.57 ] } DEF XRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 1 0 0 0, 1 0 0 1.57 ] } DEF YRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 0 1 0 0, 0 1 0 3.14 ] } ROUTE TS.fraction_changed TO RuaPosition.set_fraction ROUTE TS.fraction_changed TO ZRuaRotation.set_fraction ROUTE TS.fraction_changed TO XRuaRotation.set_fraction ROUTE TS.fraction_changed TO YRuaRotation.set_fraction ROUTE RuaPosition.value_changed TO TRUpperArm.translation ROUTE ZRuaRotation.value_changed TO ZRUpperArm.rotation ROUTE XRuaRotation.value_changed TO XRUpperArm.rotation ROUTE YRuaRotation.value_changed TO YRUpperArm.rotation # 色の変化 # 肩用 DEF shoulderCI ColorInterpolator { key [0, 1] keyValue [ 0.8 0.8 0.5, 1 0 0 ] } ROUTE TS.fraction_changed TO shoulderCI.set_fraction ROUTE shoulderCI.value_changed TO Rua.shouldercolor
できたはいいけど、EXTERNPROTO側に回転の指示を与えているためすこぶる長くなってしまう。
これを全身部品数分、とかもう苦行にしか思えないよね…
ということで、回転の指示もPROTO側に与える、という方針で作り直してみた。
PROTO側
#VRML V2.0 utf8 #Right Upper Arm PROTO filename=RUpperArm.wrl PROTO RUpperArm [ exposedField SFVec3f TRUpperArm 0 0 0 exposedField SFRotation XRUpperArm 1 0 0 0 exposedField SFRotation YRUpperArm 0 1 0 0 exposedField SFRotation ZRUpperArm 0 0 1 0 exposedField SFColor shouldercolor 0.8 0.8 0.5 exposedField SFColor elbowcolor 0.8 0.8 0.5 exposedField SFVec3f objscale 1 1 1 ] { # PROTO ここから Transform { children [ # ローカル座標系 Transform { scale 0.1 0.1 0.1 children [ Inline { url ["localcoord.wrl"] } ] } # 移動・回転の指定 Transform { translation IS TRUpperArm children [ Transform { rotation IS YRUpperArm children [ Transform { rotation IS XRUpperArm children [ Transform { rotation IS ZRUpperArm children [ # ZX平面の押し出し -> XY平面の押し出しに変える Transform { rotation 0 1 0 1.57 children [ Transform { rotation 0 0 1 1.57 scale IS objscale children[ # 形状 # 肩側 Shape { appearance Appearance { material Material { diffuseColor IS shouldercolor } } geometry Extrusion { crossSection [ 0 0.7, 0.7 0.5, 0.85 0, 0.7 -0.3, 0 -0.5, -0.7 -0.3, -0.85 0, -0.7 0.5, 0 0.7 ] spine [ 0 -0.5 0, 0 -0.3 0, 0 0 0 ] scale [ 0.25 0.25 0.27 0.27 0.2 0.2 ] solid TRUE beginCap TRUE endCap TRUE } } # ひじ側 Shape { appearance Appearance { material Material { diffuseColor IS elbowcolor } } geometry Extrusion { crossSection [ 0 0.7, 0.7 0.5, 0.85 0, 0.7 -0.3, 0 -0.5, -0.7 -0.3, -0.85 0, -0.7 0.5, 0 0.7 ] spine [ 0 -1 0, 0 -0.5 0 ] scale [ 0.2 0.2 0.25 0.25 ] solid TRUE beginCap TRUE endCap TRUE } } ] } ] } ] } ] } ] } ] } ] } # PROTO ここまで }
EXTERNPROTO側
#VRML V2.0 utf8 #externprotoの練習 filename=testexternproto2.wrl EXTERNPROTO RUpperArm [ exposedField SFVec3f TRUpperArm exposedField SFRotation XRUpperArm exposedField SFRotation YRUpperArm exposedField SFRotation ZRUpperArm exposedField SFColor shouldercolor exposedField SFColor elbowcolor exposedField SFVec3f objscale ] [ "RUpperArm.wrl" ] DEF WORLD Transform { # Zが縦になるように座標変換 # ここは固定で必ずつける translation 0 0 0 rotation -1 -1 -1 2.09 children [ Inline { url ["localcoord.wrl"] } # 右上腕 DEF Rua RUpperArm { objscale 1 1 1 } ] } ############### # 時間軸の操作 cycleIntervalは12秒の動作なら12にするべき ############### DEF TS TimeSensor { cycleInterval 10 loop TRUE } ############ # 移動・回転(値を代入するところ) ############ #右上腕 DEF RuaPosition PositionInterpolator { key [0, 1] keyValue [ 0 0 0, 1 1 1 ] } DEF XRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 1 0 0 0, 1 0 0 1.57 ] } DEF YRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 0 1 0 0, 0 1 0 3.14 ] } DEF ZRuaRotation OrientationInterpolator { key [0, 1] keyValue [ 0 0 1 0, 0 0 1 1.57 ] } #################### # 時間軸の設定(移動・回転) #################### # 右上腕 ROUTE TS.fraction_changed TO RuaPosition.set_fraction ROUTE TS.fraction_changed TO XRuaRotation.set_fraction ROUTE TS.fraction_changed TO YRuaRotation.set_fraction ROUTE TS.fraction_changed TO ZRuaRotation.set_fraction ROUTE RuaPosition.value_changed TO Rua.TRUpperArm ROUTE XRuaRotation.value_changed TO Rua.XRUpperArm ROUTE YRuaRotation.value_changed TO Rua.YRUpperArm ROUTE ZRuaRotation.value_changed TO Rua.ZRUpperArm # ほか ########### # 色の変化(値を代入するところ) ########### # 肩用 DEF shoulderCI ColorInterpolator { key [0, 1] keyValue [ 0.8 0.8 0.5, 1 0 0 ] } # ひじ用 DEF elbowCI ColorInterpolator { key [0, 1] keyValue [ 1 0 0, 0.8 0.8 0.5 ] } #################### # 時間軸の設定(色) #################### # 肩 ROUTE TS.fraction_changed TO shoulderCI.set_fraction ROUTE shoulderCI.value_changed TO Rua.shouldercolor # ひじ ROUTE TS.fraction_changed TO elbowCI.set_fraction ROUTE elbowCI.value_changed TO Rua.elbowcolor
やった!これで1部品の世界ではおおよそできたと思われる。
やったこと
- 部品の定義(形状、動作回り)を別ファイルにわける
- 時間軸に沿って移動・回転させる
- 部品の一部を時間軸に沿って変色させる