3

次の属性を持つ3D空間のボールがあります。

場所-ボールが回転している場所を表すVector3f-x、y、z軸の回転角を表すVector3f

Vector3fの「方向」で示される特定の方向にボールを転がしたい。ボールを転がしたい方向に基づいて、適切な軸回転ベクトル(上記を参照)をどのように計算しますか?

私は次のことを試しました:

  1. rotation.xをdirection.zに設定します
  2. rotation.zをdirection.xに設定します

ボールの変換行列を次のように計算します。

private Matrix4f calculateEntityMatrix(EEntity entity)
{
    Matrix4f matrix = new Matrix4f();
    matrix.translate(new Vector3f(entity.getXLocation(), entity.getYLocation(), entity.getZLocation()));

    if(entity.getXRotation()>0)
    {
        matrix = matrix.rotate(entity.getXRotation(), new Vector3f(1f, 0f, 0f));
    }
    if(entity.getYRotation()>0)
    {
        matrix = matrix.rotate(entity.getYRotation(), new Vector3f(0f, 1f, 0f));
    }
    if(entity.getZRotation()>0)
    {
        matrix = matrix.rotate(entity.getZRotation(), new Vector3f(0f, 0f, 1f));
    }
    if(entity.getXScale()!=1 || entity.getYScale()!=1 || entity.getZScale()!=1)
    {
        matrix = matrix.scale(new Vector3f(entity.getXScale(), entity.getYScale(), entity.getZScale()));
    }

    return matrix;
}

これは、x軸またはz軸のいずれかをロールダウンするときに機能しますが、2つの軸の間の方向にロールダウンすると、回転が正しく表示されません。私の仮定は、これは回転が次のように計算されているという事実によって引き起こされていると思います。

  1. ボールはX軸に沿ってrotation.xによって回転します
  2. 次に、ボールは、ステップ1で作成された「新しい」X軸に沿ってrotation.zによって回転します。

各回転が互いに独立して計算されるように、この動作をどのように変更できるかについての提案はありますか?

4

1 に答える 1

0

スリッピングやバックスピンを実装したい場合を除いて、この問題へのアプローチは少し異なると思います。Matrix.rotate()任意の軸を中心とした回転をサポートするがすでにあります。それを使用してください。

ボール用に保存する属性

  • ポジション
  • 回転行列

注:マトリックス指向のシステム/シーングラフでは、ボールドは通常、単一の4x4変換マトリックスに格納されます。現在のコードベースの残りの部分によっては、これが便利な場合とそうでない場合があります。

動き回るアルゴリズム

  1. directionボールと標準のアップベクトルが与えられた場合、外積を使用して(0, 1, 0)計算しrotation axisます。(つまり、方向と上軸の両方に垂直です)

  2. これで、回転は単純matrix.rotate( rotationSpeed, rotationAxis)に、既存の回転行列に適用されます。

ボールがサーフェスを上下に回転できる場合は、標準のアップベクトルを適切なサーフェス法線に置き換えます。

于 2013-03-17T06:32:43.430 に答える