好吧,所以我得到了一些动作代码,我想我需要手动输入什么时候上坡/下坡。我所有的工作是坡度的正常,矢量,我当前和以前的位置,以及我的偏航。
根据我的偏航,是否有更好的旋转方式可以上坡或下坡?
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);
编辑:更新的代码。
答案 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.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&gt; 0为up,vz&lt; 0已关闭。