DXライブラリを使ったカメラ回転の中心

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
abeat

DXライブラリを使ったカメラ回転の中心

#1

投稿記事 by abeat » 12年前

DXライブラリを使ってカメラをグリグリ動かしてモデルを見るというプログラムを作っているのですが、カメラを回転移動させるとターゲットに対しての距離が変わってしまうのです。
カメラのターゲットを原点に見立ててそこを通る軸に対して回っていると思っていたのですが、カメラが楕円のように動いてターゲットまでの距離が変わっています。普通、原点までの距離というのは回転運動では変わりませんよね。

コード:

float yaw = 0, pitch = 0, roll = 0;
if (EXP_RIGHT(key)) yaw -= DTOR;
if (EXP_LEFT(key)) yaw += DTOR;
if (EXP_UP(key)) pitch -= DTOR;
if (EXP_DOWN(key)) pitch += DTOR;
if (EXP_RUP(key)) roll -= DTOR;
if (EXP_LUP(key)) roll += DTOR;
VECTOR z_axis = VNorm(VSub(target, camera.coord));
VECTOR x_axis = VNorm(VCross(z_axis, up));
MATRIX t = MMult(MGetRotAxis(z_axis, roll), MMult(MGetRotAxis(x_axis, pitch), MGetRotAxis(up, yaw)));
camera.coord = VTransform(camera.coord, t);
up = VNorm(VTransform(up, t));
の後にSetCameraPositionAndTargetAndUpVec()を呼んでいます。DTORは(DX_PI_F/180.f)で1°をradに変換したものです。あとtargetやcamera,upはstaticなので一つ前の値が入っています。
モデルを水平に見ているのヨーの操作のみが正常なのですが、ピッチやロールを操作するとずれてしまいます。特にロールの操作は一回転すると正面からモデルの横に回りこむようなことになってしまいます。
自分の予想では現在位置から1°ずつ回すようなことをしているから誤差が出ているような気もするのですが、ロールなんかはカメラとターゲットを結んだ線をZ軸に設定して回しているのでカメラの上方向が変わっても位置自体が変わるようなことはないような気がするのです。
私が行列とベクトルを理解できていないのが一番の原因かと思いますが、何かアドバイスをいただけたらと思います。よろしくお願いします。

abeat

Re: DXライブラリを使ったカメラ回転の中心

#2

投稿記事 by abeat » 12年前

自己解決しました。
楕円だと思っていたので試しに原点までの距離を表示してみたら全く変わってなかったため、ターゲットではなく原点を中心に回転していたことが原因だと判明しました。
DXライブラリにはクォータニオンを使う方法は実装されていないため、カメラからターゲットの座標を減算して、ターゲットの座標を原点に合わせ、回転を行った後、ターゲットの座標を足して元に戻してやることで、求めていた動きが実現できました。
こんなかんじです。http://imagingsolution.blog107.fc2.com/ ... y-111.html
考えていてくれた方がいたらありがとうございました。

コード:

VECTOR z_axis = VNorm(VSub(target, camera.coord));
VECTOR x_axis = VNorm(VCross(z_axis, up));
MATRIX t = MMult(MGetRotAxis(z_axis, roll), MMult(MGetRotAxis(x_axis, pitch), MGetRotAxis(up, yaw)));
camera.coord = VAdd(target, VTransform(VSub(camera.coord, target), t));
up = VNorm(VTransform(up, t));

閉鎖

“C言語何でも質問掲示板” へ戻る