5.2 物体の変換
著者:梅谷 武
語句:トポスオブジェクト, 属性, オイラー角, 運動軌跡
トポスオブジェクトの属性を設定することにより、物体を変換する例を示す。
作成:2010-07-25
更新:2011-03-08
 ToposNoteにおいては、空間内の物体をトポスオブジェクトと呼ばれる内部データ形式で格納している。トポスオブジェクトは次の共通属性をもっている。
  1. 物体座標系の位置:(Mx, My, Mz)
  2. 物体座標系の姿勢:Posture(四元数)
  3. 拡大縮小係数:Scale
  4. 運動軌跡配列:Trajectories
  5. データファイル名:FileName
  6. 関連付けファイル名:Association
物体が静止している場合は、位置と姿勢を使い、物体を運動させる場合は、運動軌跡配列を使う。
 tnLoadObjectのオイラー角はヨー(Z軸,方位角)、ピッチ(X軸,仰角)、ロール(Y軸,傾斜角)により表現される。方位は北を基準とするので、次の例では最初に機種を北に向けてから変換している。
package.path = "std/?.lua"
require( "Geometry" )
PI_180 = 3.14159265358979 / 180.0
 
function Zerosen( name, v, e )
  if ( ( v.type == "Vector3" ) and ( e.type == "EulerAngles" ) ) then
    local e0 = EulerAngles.new( 180.0*PI_180, 0.0, 0.0 )
    local q0 = Quaternion.new( e0 )
    local q1 = Quaternion.new( e )
    q1 = q1 * q0
    local e1 = EulerAngles.new( q1 )
    tnLoadObject(
      name, [[.\obj\zerosen.obj]],
      v.x, v.y, v.z, e1.yaw / PI_180, e1.pit / PI_180, e1.rol / PI_180,
      1.0
    )
  else
    return
  end
end
 
O = Vector3.new( 0.0, 0.0, 0.0 )
E = EulerAngles.new( 0.0, 0.0, 0.0 )
TX = Vector3.new( 3.0, 0.0, 0.0 )
TY = Vector3.new( 0.0, 3.0, 0.0 )
TZ = Vector3.new( 0.0, 0.0, 3.0 )
Yaw = EulerAngles.new( 60.0*PI_180, 0.0, 0.0 )
Pit = EulerAngles.new( 0.0, 60.0*PI_180, 0.0 )
Rol = EulerAngles.new( 0.0, 0.0, 60.0*PI_180 )
 
Zerosen( "z0",  O,   E )
Zerosen( "z1", TZ, Yaw )
Zerosen( "z2", TX, Pit )
Zerosen( "z3", TY, Rol )
 運動軌跡は、物体座標系で定義された剛体の運動を世界座標系から見た物体座標系の位置・姿勢・時刻データ列として表現するもので、ある時刻のデータは
中心座標 (Cx, Cy, Cz):世界座標系における座標
姿勢 (Yaw, Pitch, Roll):世界座標系におけるオイラー角[度]
時刻 t:1985年1月1日0時0分0秒からのミリ秒数(0はデータ無効の意味)
という7つの実数値の組で表現される。但し、この時刻表現の換算においてはうるう秒が考慮されない。
 運動軌跡は次の例のように、物体を名前で参照して関連付ける。
tnLoadObject( "z0", [[.\obj\zerosen.obj]] )
tnSetTrajectory( "z0", 21, {
  0.00, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.05, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.30, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.35, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.40, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.45, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.55, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.60, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.65, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.70, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.80, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.85, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.90, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  0.95, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
  1.00, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
} )
Published by SANENSYA Co.,Ltd.