- 締切済み
C++でObjectの正面(Z+)に進む処理
Objectを座標で動かす際、Z+に動かすとワールド座標でZ+に移動します。 ワールドでの移動はObjectのY軸に回転がかかっている状態でも動く方向は同じです。 それを例として、ObjectにY軸45度回転がかかっていたら そのObjectnの正面である、ワールド座標でZとXの間を斜め移動するようにしたいです。 三角関数などを利用すればできると思うのですがどうすればできるのか分りません。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
オブジェクト座標系でZ+に動かしてから、新しい座標をワールド座標系に変換します。 具体的には、以下の処理をします。 1.オブジェクトを原点に平行移動する 2.オブジェクトから見た時の、移動量ベクトル行列を求める 3.オブジェクトが向いている方向の、方向ベクトルを求める 4.2と3を行列演算する 5.4で求めた行列を、1で平行移動したのと逆に平行移動する 最初の平行移動は、オブジェクトのワールド座標系での位置と同じなので、計算は要りません。 原点にあるオブジェクトがY軸に45度回転している時は (x' y' z' 1) = { ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( x y z 1 ) となります。 オブジェクトから見ての正面に10進んだ位置は、オブジェクトの現在位置を原点とした時 ( 0 0 10 1 ) ですから、上記の式の「( x y z 1 )」に「( 0 0 10 1 )」を代入して { ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( 0 0 10 1 ) を行列計算します。 そして、それをワールド座標系に平行移動します。 平行移動は (x' y' z' 1) = { ( 0 0 0 tx ) ( 0 0 0 ty ) ( 0 0 0 tz ) ( 0 0 0 1 ) } ( x y z 1 ) で行列計算します。 この時のtx ty tzは「移動前のオブジェクトのワールド座標系での座標位置」で、「( x y z 1)」は、その前の行列計算で求めた「( x' y' z' 1)」の事です。 「何を言っているのか判らない」って場合は「行列」と「ベクトル」についての学習が必要です。