2

私のopenglアプリでは、カメラを見るようにフィギュアの向きを変えたいと思っています。これを行うには、すべてのオブジェクトに対して2つのベクトルを前と上に定義します。

gluLookAt を使用してカメラを制御しているので、必要なベクトル newFront と newUp は簡単にわかります。

各図の向きを制御するために使用するコードは次のとおりです。

m4D orientate(v3D newFront, v3D newUp)
{
    double angle = angle_between(front, newFront);
    v3D cross = normalize(cross_product(front, newFront));

    m4D matrix = rotate_from_axis(angle, cross);

    up = normalize(up * matrix);

    angle = angle_between(up, newUp);
    cross = normalize(cross_product(up, newUp));

    return(rotate_from_axis(angle, cross) * matrix);
}

このコードは、マトリックス スタックにこのマトリックスしかない場合にうまく機能しますが、以前のマトリックスの回転 (もちろん、フロントとアップのベクトルの回転) をプッシュすると失敗します。

私のせい?

4

1 に答える 1

1

はるかに簡単な方法があるのに、なぜ複雑な「逆回転を解決し、それをモデルビューに乗算する」ビルボード/詐欺師のソリューションが常に必要なのですか?

M を、ビルボード マトリックスが決定されるモデル ビュー マトリックスとする。行列は 4×4 の実数値型です。左上の 3×3 は、回転とスケーリングを定義します。ビルボードの場合、この部分がアイデンティティになります。

したがって、現在のモデル ビュー マトリックスの左上部分を ID に置き換え、残りをそのままにしておくことによって、つまり

 1  0  0 tx
 0  1  0 ty
 0  0  1 tz
wx wy wz ww

その行列をさらに変換するために使用すると、まさに目的の効果が得られます。スケーリングが適用されている場合は、左上の単位をスケーリング行列に置き換えます。

于 2012-10-16T12:19:26.630 に答える