[英]How to calculate direction vector from yaw angle?
I have an issue on where I do not know how to proceed on calculating a direction vector using Java/LWJGL to renderin OpenGL. 我有一个问题,我不知道如何继续使用Java / LWJGL计算方向向量来渲染OpenGL。
I have the following system: 我有以下系统:
Therefore I am walking on the XZ plane, now I want to implement/have implemented WASD movement, and it should be related to the current direction I am going. 因此,我正在XZ飞机上行走,现在我想实施/实施WASD运动,它应该与我目前的方向有关。 (W = forward to camera look direction, S = backward, etc.) (W =前进到摄像机视线方向,S =后退等)
I have a yaw angle that is defined as follows: 我的偏航角定义如下:
Now I simply want a 3D vector representing the direction of the yaw , how would I do that? 现在我只想要一个代表偏航方向的3D矢量,我该怎么做?
I am using the following Java code, with the answer included, however it seems there is another bug: 我使用以下Java代码,包括答案,但似乎还有另一个错误:
@Override
protected void mouseMoved(final int dx, final int dy) {
float yawDelta = dx / 10f;
float pitchDelta = dy / 10f;
yaw += yawDelta;
pitch += pitchDelta;
System.out.println("yaw = " + yaw);
direction.updateZero().updateTranslate((float)Math.sin(Math.toRadians(yaw)), 0f, (float)Math.cos(Math.toRadians(yaw))).updateNormalized();
System.out.println("direction = " + direction);
updateView();
}
and 和
private void checkKeys() {
if (isKeyCurrentlyDown(Keyboard.KEY_W)) {
eye.updateTranslate(direction);
updateView();
}
if (isKeyCurrentlyDown(Keyboard.KEY_S)) {
eye.updateTranslate(direction.negated());
updateView();
}
if (isKeyCurrentlyDown(Keyboard.KEY_A)) {
eye.updateTranslate(direction.cross(Vector3f.Y.negated()));
updateView();
}
if (isKeyCurrentlyDown(Keyboard.KEY_D)) {
eye.updateTranslate(direction.cross(Vector3f.Y));
updateView();
}
if (isKeyCurrentlyDown(Keyboard.KEY_Q)) {
eye.updateTranslate(0.0f, -1.0f, 0.0f);
updateView();
}
if (isKeyCurrentlyDown(Keyboard.KEY_Z)) {
eye.updateTranslate(0.0f, 1.0f, 0.0f);
updateView();
}
}
and 和
private void updateView() {
viewMatrix.identity().fpsView(eye, roll, yaw, pitch);
Uniforms.setUniformMatrix4(UNIFORM_VIEW_MATRIX, false, viewMatrix);
}
and subsequently 然后
public Matrix4f fpsView(final Vector3f eye, final float rollAngle, final float yawAngle, final float pitchAngle) {
//roll = rolling your head, Q&E
//yaw = looking left/right, mouseY
//pitch = looking up/down, mouseX
float sinRoll = (float)Math.sin(Math.toRadians(rollAngle));
float cosRoll = (float)Math.cos(Math.toRadians(rollAngle));
float sinYaw = (float)Math.sin(Math.toRadians(yawAngle));
float cosYaw = (float)Math.cos(Math.toRadians(yawAngle));
float sinPitch = (float)Math.sin(Math.toRadians(pitchAngle));
float cosPitch = (float)Math.cos(Math.toRadians(pitchAngle));
//TODO cannot roll yet
Vector3f xAxis = new Vector3f(
cosYaw,
-sinPitch * sinYaw,
-cosPitch * sinYaw
);
Vector3f yAxis = new Vector3f(
0.0f,
cosPitch,
-sinPitch
);
Vector3f zAxis = new Vector3f(
sinYaw,
sinPitch * cosYaw,
cosPitch * cosYaw
);
return multiply(
xAxis.getX(), xAxis.getY(), xAxis.getZ(), 0.0f, //X column
yAxis.getX(), yAxis.getY(), yAxis.getZ(), 0.0f, //Y column
zAxis.getX(), zAxis.getY(), zAxis.getZ(), 0.0f, //Z column
0.0f, 0.0f, 0.0f, 1.0f //W column
).translate(eye);
}
Somehow the eye.updateTranslate()
is not working, which merely adds the values of the operand to the eye
coordinate. 不知何故, eye.updateTranslate()
不起作用,它只是将操作数的值添加到eye
坐标。 Is any of my logic flawed there? 我的逻辑是否存在缺陷?
y is always 0 y始终为0
x=sin (yaw) x =罪(偏航)
z=cos (yaw) z = cos(偏航)
The rotation portion is a bit more complicated than you have it. 旋转部分比你有点复杂。
R = yawMat.pitchMat.rollMat
where: 哪里:
yawMat={ { cosZ, -sinZ, 0 }, { sinZ, cosZ , 0 }, {0,0,1 } };
pitchMat = { { cosY , 0 , sinY }, { 0, 1 , 0 }, { -sinY, 0, cosY } };
rollMat = { {1,0,0 }, {0,cosX,-sinX }, {0,sinX,cosX } };
The dot product of the three is what makes up your 3x3 rotation matrix R inside the homogeneous transform. 三者的点积是均匀变换中的3x3旋转矩阵R的组成部分。 Order of the dot product does matter so keep it consistent. 点积的顺序很重要,所以要保持一致。
Final 4x4 matrix should look like 最终的4x4矩阵看起来应该是这样的
T = {{R00,R01,R02,X},{R10,R11,R12,Y},{R20,R21,R22,Z},{0,0,0,1}}
Edit If you want to do one rotation at a time then the other two 3x3 matrices go to the identity so you would have for instance just a rotation in the yaw: 编辑如果您想一次进行一次旋转,那么另外两个3x3矩阵将转到标识,因此您可以在偏航中进行旋转:
R = yawMat.I.I = yawMat
So: 所以:
R = { { cosZ, -sinZ, 0 }, { sinZ, cosZ , 0 }, {0,0,1 } }
Likewise for the others. 对其他人也一样。
As you have it written in order to build your transformation matrix it should be: 正如您为了构建转换矩阵而编写的那样,它应该是:
Vector3f xAxis = new Vector3f(
cosYaw*cosPitch,
cosYaw* sinPitch*sinRoll - sinYaw*cosRoll,
cosYaw*sinPitch*cosRoll + sinYaw*sinRoll
);
Vector3f yAxis = new Vector3f(
sinYaw*cosPitch,
sinYaw*sinPitch*sinRoll + cosYaw*cosRoll,
sinYaw*sinPitch*cosRoll - cosYaw*sinRoll
);
Vector3f zAxis = new Vector3f(
-sinPitch,
cosPitch*sinRoll,
cosPitch * cosYaw
);
Assuming fixed rotation order x -> y -> z followed by the translation X,Y,Z 假设固定旋转顺序x - > y - > z,然后是平移X,Y,Z
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.