根据偏航上坡/下坡的更好方法是什么?

时间:2012-06-25 01:31:48

标签: java math trigonometry

好吧,所以我得到了一些动作代码,我想我需要手动输入什么时候上坡/下坡。我所有的工作是坡度的正常,矢量,我当前和以前的位置,以及我的偏航。

根据我的偏航,是否有更好的旋转方式可以上坡或下坡?

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);

编辑:更新的代码。

1 个答案:

答案 0 :(得分:1)

首先,以下是不正确的:

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

Math.toDegrees将弧度的角度转换为度数为1,但Math.cosMath.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&gt; 0为up,vz&lt; 0已关闭。