计算方向角度

时间:2014-08-12 19:07:18

标签: opengl math camera angle

我跟着一个tutorial,可以用鼠标在我的OpenGL游戏中旋转视图。 我不得不承认,我没有真正理解我的复制和粘贴,这就是我得到的......

摄像机的方向由偏航和俯仰计算:

directionX = cos(verticalAngle) * sin(horizontalAngle);
directionY = sin(verticalAngle);
directionZ = cos(verticalAngle) * cos(horizontalAngle);

现在我想要反转计算并使角度偏离方向。 我知道如何计算垂直角度:

verticalAngle = asin(directionY);

但我不知道如何获得水平角度...我试图重新排列x分量的方程,但是,正如预期的那样,它不起作用(因为这意味着你不需要z分量计算水平角度,这没有意义。)

有人能告诉我方程式(也许可以解释如何重新排列方程/它通常如何工作)?我不知道我要在Google / SA上搜索什么

它仍然不起作用,垂直角度每帧在两个值之间切换,我不能用水平角度旋转360°。这是我的代码:

double elapsed;
frameTime = glfwGetTime();
elapsed = frameTime - lastFrameTime;

int winw, winh;
glfwGetWindowSize(window, &winw, &winh);

double mouseX, mouseY;
glfwGetCursorPos(window, &mouseX, &mouseY);
glfwSetCursorPos(window, winw/2, winh/2);

// compute angles
float preAsinf = camDir[0] / cosf(camAngles[1]);
if (preAsinf < -1) preAsinf = -1;
if (preAsinf > 1) preAsinf = 1;
camAngles[0] = asinf(preAsinf);
camAngles[1] = atan2f(camDir[0], camDir[2]) * cos(camAngles[1]);
printf("%g\n", camAngles[0]);

// compute view
double dmx = (mouseX - winw/2);
double dmy = (mouseY - winh/2);
camAngles[0]+= elapsed * dmx;
camAngles[1]+= elapsed * dmy;

camDir[0] = cosf(camAngles[1]) * sinf(camAngles[0]);
camDir[1] = sinf(camAngles[1]);
camDir[2] = cosf(camAngles[1]) * cosf(camAngles[0]);
kmVec3Normalize((kmVec3 *) camDir, (kmVec3 *) camDir);

// horiAngle - 3.14 / 2 means horiAngle - 90°, which is the right
camRight[0] = sin(camAngles[0] - 3.14f/2.0f);
camRight[1] = 0;
camRight[2] = cos(camAngles[0] - 3.14f/2.0f);
kmVec3Normalize((kmVec3 *) camRight, (kmVec3 *) camRight);

kmVec3Cross((kmVec3 *) camUp, (kmVec3 *) camRight, (kmVec3 *) camDir);
kmVec3Normalize((kmVec3 *) camUp, (kmVec3 *) camUp);

float camCenter[3];
kmVec3Add((kmVec3 *) camCenter, (kmVec3 *) camPos, (kmVec3 *) camDir);
kmMat4LookAt((kmMat4 *) view, (kmVec3 *) camPos, (kmVec3 *) camCenter, (kmVec3 *) camUp);

// compute end matrix
kmMat4Multiply((kmMat4 *) tmp, (kmMat4 *) projection, (kmMat4 *) view);
kmMat4Multiply((kmMat4 *) tmp, (kmMat4 *) tmp, (kmMat4 *) model);
glUniformMatrix4fv(shaderUniforms.transform, 1, GL_FALSE, tmp);

向量只是数组,[0] ^ = x分量,[1] ^ = y分量。

2 个答案:

答案 0 :(得分:1)

使用

horizontalAngle = atan2(directionX, directionZ);

这将返回-Pi和+ Pi之间的角度。 (因子cos(verticalAngle)取消了。)

答案 1 :(得分:0)

directionX == cos(verticalAngle) * sin(horizontalAngle)

除以cos(verticalAngle)

directionX / cos(verticalAngle) == sin(horizontalAngle)

取双方的asin

asin(directionX / cos(verticalAngle) == horizontalAngle

翻转等式,结果就是这样。

horizontalAngle = asin(directionX / cos(verticalAngle))

您不需要使用Z来恢复horizontalAngle,因为Z组件没有任何您无法单独从X和Y恢复的信息。这是因为摄像机方向向量是unit vector,因此Z = sqrt(1 - X ^ 2 - Y ^ 2)。