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 回答