在opengl中翻译相机有问题
Posted
技术标签:
【中文标题】在opengl中翻译相机有问题【英文标题】:Have problem understanding translating the camera in opengl 【发布时间】:2019-10-07 06:08:39 【问题描述】:我无法理解翻译相机。我已经可以成功旋转相机,但我仍然对平移相机感到困惑。我包含有关如何旋转相机的代码,因为平移和旋转需要使用lookat功能。作业说平移相机意味着眼睛和中心都应该移动相同的量。我知道我可以更改查看函数中的参数来实现这一点。
lookat函数定义如下:
Lookat(cameraPos, center, up)
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 10.0f);
glm::vec3 center(0.0f, 0.0f, 0.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
modelViewProjectionMatrix.Perspective(glm::radians(fov), float(width) / float(height), 0.1f, 100.0f);
modelViewProjectionMatrix.LookAt(cameraPos, center, cameraUp);
void CursorPositionCallback(GLFWwindow* lWindow, double xpos, double ypos)
int state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT);
if (state == GLFW_PRESS)
if (firstMouse)
lastX = xpos;
lastY = ypos;
firstMouse = false;
float xoffset = xpos - lastX;
float yoffset = lastY- ypos;
lastX = xpos;
lastY = ypos;
yaw += xoffset;
pitch += yoffset;
glm::vec3 front;
front.x = center[0] + 5.0f*cos(glm::radians(yaw)) * cos(glm::radians(pitch));
front.y = center[1] + 5.0f*sin(glm::radians(pitch));
front.z = center[1] + 5.0f*sin(glm::radians(yaw)) * cos(glm::radians(pitch));
cameraPos = front;
【问题讨论】:
您的代码似乎已经将cameraPos
重新定位在围绕中心的球体上,因此将您的位移添加到center
还不够吗?
感谢您的建议!我现在明白了。
【参考方案1】:
如果您想将相机平移一个偏移量,那么您必须将相同的向量 (glm::vec3 offset
) 添加到相机位置 (cameraPos
) 和相机目标 (center
):
center = center + offset;
cameraPos = cameraPos + offset;
当您通过pitch
和yaw
角度计算相机的新目标(center
)时,您还必须更新相机的向上矢量(cameraUp
):
glm::vec3 front(
cos(glm::radians(pitch)) * cos(glm::radians(yaw)),
sin(glm::radians(pitch)),
cos(glm::radians(pitch)) * sin(glm::radians(yaw))
);
glm::vec3 up(
-sin(glm::radians(pitch)) * cos(glm::radians(yaw)),
cos(glm::radians(pitch)),
-sin(glm::radians(pitch)) * sin(glm::radians(yaw))
);
cameraPos = center + front * 5.0f;
cameraUp = up;
要在视图空间中沿 x 轴(从左到右)平移相机,您必须通过到目标 (front
) 的向量的 Cross product 和上向量 ( cameraUp
或 up
):
glm::vec3 right = glm::cross(front, up);
视图空间中的 y 轴(从下到上)是向上向量。
要转换标量 (float trans_x
) 和 (trans_y
),必须将缩放后的 right
和 up
向量添加到相机位置 (cameraPos
) 和相机目标 (@987654340) @):
center = center + right * trans_x + up * trans_y;
cameraPos = cameraPos + right * trans_x + up * trans_y;
使用操纵向量来设置视图矩阵:
modelViewProjectionMatrix.LookAt(cameraPos, center, cameraUp);
【讨论】:
非常感谢!!这正是我需要的。你的回答比我的课程TA提供的解释还要厉害。以上是关于在opengl中翻译相机有问题的主要内容,如果未能解决你的问题,请参考以下文章