【发布时间】:2020-11-08 17:27:16
【问题描述】:
我想在 OpenGL 中拖动鼠标位置偏移的对象。渲染管道是这样的。
gl_Position = projection * view * model * vec4(aPos, 1.0);
所以我认为我应该反转(投影 * 视图)然后将它们相乘以获得适用于模型矩阵的转换。
glm::mat4 CalculateDragTransform(double xOffset, double yOffset) {
double x = (2 * xOffset) / m_width;
double y = (2 * yOffset) / m_height;
glm::mat4 projection = glm::perspective(glm::radians(m_camera->GetFOV()),
(float) m_width /
(float) m_height, 0.1f,
100.0f);
glm::mat4 view = m_camera->GetViewMatrix();
glm::mat4 transform = glm::translate(glm::mat4(1.0), glm::vec3(x, y, 0));
return glm::inverse(projection * view) * transform * projection * view;
m_objects[index]->SetModelMatrix(transform * m_objects[index]->GetModelMatrix());
当我拖动对象时,它跟随鼠标移动。但是如果我从其他角度看,这个物体会严重变形。那么我做错了什么? (投影*视图)应该倒置吗?
拖动前骰子:
拖后骰子:
你可以从其他角度看到失真:
更明显的失真示例:
更新:我设法通过仅保留位置转换来解决问题(某种程度)。所以我怀疑转换中左上角的 3x3 矩阵有问题。调试的时候发现第四行的前三列不是零,这是绝对错误的!但我不明白是什么原因造成的。这种现象只有在我使用 glm::perspective 作为投影矩阵时才会发生。使用 glm::ortho 也是一种无需丢弃左上角 3x3 矩阵的解决方案。
glm::mat4 view = m_camera->GetViewMatrix();
glm::mat4 transform = glm::translate(glm::mat4(1.0), glm::vec3(x, y, 0));
transform = glm::inverse(projection * view) * transform * projection * view;
float x = transform[3][0];
float y = transform[3][1];
float z = transform[3][2];
transform = glm::translate(glm::mat4(1.0f), glm::vec3(x, y, z));
【问题讨论】:
-
“如果我从其他角度看,物体会严重变形。” - 你说的是透视变形吗?
-
你在说什么失真?我觉得这三张照片都很好。
-
抱歉,第三张图可能不是很明显。我上传了一张更扭曲的图片。骰子应该是一个立方体。但就像您从第四张图片中看到的那样,它看起来像是被垂直压扁了。
标签: c++ opengl glm-math opengl-3 homogenous-transformation