1

よし、動きのコードを少し手に入れたので、斜面をいつ上り下りするかを手動で入力する必要があると考えています。作業する必要があるのは、スロープの法線、ベクトル、現在と以前の位置、およびヨーだけです。

ヨーイングに基づいてスロープを上るか下るかを回転させるより良い方法はありますか?

Vector3f move = new Vector3f(0,0,0);
        move.x = (float)-Math.cos(Math.toRadians(yaw));
        move.z = (float)-Math.sin(Math.toRadians(yaw));

        System.out.println("slopeNormal.z: " + slopeNormal.z + "move.z: " + move.z);

        move.normalise();

        float vx = (float) (Math.sqrt(Math.pow(move.y, 2) + Math.pow(move.z, 2)) * move.x);
        float vy = (float) (Math.sqrt(Math.pow(move.x, 2) + Math.pow(move.z, 2)) * move.y);
        float vz = - vx * slopeNormal.x - vy * slopeNormal.y;
        move.scale(movementSpeed * delta); 

        if(vz < 0)
            move.y -= slopeVec.y * 1.5f;

        if(vz > 0)
            move.y += slopeVec.y * 1.5f;

        Vector3f.add(pos, move, pos);

編集:コードを更新しました。

4

1 に答える 1

1

まず、以下は誤りです。

move.x = (float)-Math.toDegrees(Math.cos(Math.toRadians(yaw)));
move.z = (float)-Math.toDegrees(Math.sin(Math.toRadians(yaw))); 

Math.toDegreesは、ラジアン単位の角度を度単位に変換しますが、 と の結果は角度ではMath.cosありMath.sinません。

ゼロ ヨーが正の x 方向にあると仮定し、vx、vy、vz = 3 つの軸に沿った運動速度、s = 速度、および勾配法線 = nx、ny、nz を定義します。ここで、nx^2 + ny^2 + nz^2 = 1. したがって、nx = ny = 0、nz = 1 はフラットになります。

最初に、x', y' = 軸を平らな地面に相対的に定義します (動きは地面に拘束されます)。次に (以下は有効な Java ではありませんが、とにかくコード形式で囲んでいます):

vx' = cos(yaw) * s
vy' = sin(yaw) * s

次に、x'、y' 座標から実際の座標に回転する必要があります。これは、スロープ法線を使用して行われます。

vx = sqrt(vy^2 + vz^2) vx'
vy = sqrt(vx^2 + vz^2) vy'
vz = - vx' nx - vy' ny

この変換のチェック: vx^2 + vy^2 + vz^2 は、vx'^2 + vy'^2 = s^2 と等しくなければなりません。これはうまくいくと思います。

あなたの質問に答えるために:上か下か?vz > 0 はアップ、vz < 0 はダウンです。

于 2012-06-25T02:15:58.330 に答える