VRMLを使ってみよう (時間軸に沿った着色、移動、回転全部のせ)

とりあえずやってみる

これまでに使ってきたサンプルをベースに、

  • 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部品の世界ではおおよそできたと思われる。

やったこと

  • 部品の定義(形状、動作回り)を別ファイルにわける
  • 時間軸に沿って移動・回転させる
  • 部品の一部を時間軸に沿って変色させる