カメラのターゲットを原点に見立ててそこを通る軸に対して回っていると思っていたのですが、カメラが楕円のように動いてターゲットまでの距離が変わっています。普通、原点までの距離というのは回転運動では変わりませんよね。
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));
モデルを水平に見ているのヨーの操作のみが正常なのですが、ピッチやロールを操作するとずれてしまいます。特にロールの操作は一回転すると正面からモデルの横に回りこむようなことになってしまいます。
自分の予想では現在位置から1°ずつ回すようなことをしているから誤差が出ているような気もするのですが、ロールなんかはカメラとターゲットを結んだ線をZ軸に設定して回しているのでカメラの上方向が変わっても位置自体が変わるようなことはないような気がするのです。
私が行列とベクトルを理解できていないのが一番の原因かと思いますが、何かアドバイスをいただけたらと思います。よろしくお願いします。