math - 使用 Eigen 计算 2D 相机的模型 View 矩阵

标签 math opengl matrix camera eigen

我正在尝试计算 2D 相机的模型 View 矩阵,但我无法得到正确的公式。我使用 Affine3f 变换类,因此矩阵与 OpenGL 兼容。这是我通过反复试验得到的最接近的结果。这段代码可以正常旋转和缩放相机,但是如果我同时应用平移和旋转,相机的移动就会变得困惑:相机以旋转的方式移动,这不是我想要的。 (这可能是因为我首先应用旋转矩阵,然后进行平移)

Eigen::Affine3f modelview;
modelview.setIdentity();
modelview.translate(Eigen::Vector3f(camera_offset_x, camera_offset_y, 0.0f));
modelview.scale(Eigen::Vector3f(camera_zoom_x, camera_zoom_y, 0.0f));
modelview.rotate(Eigen::AngleAxisf(camera_angle, Eigen::Vector3f::UnitZ()));
modelview.translate(Eigen::Vector3f(camera_x, camera_y, 0.0f));
[loadmatrix_to_gl]

我想要的是相机将围绕屏幕空间中的偏移位置旋转和缩放{(0,0)在本例中是屏幕的中间},然后沿着世界空间中的全局xy轴定位{(0,0 ) 也是从屏幕中间开始}到最终位置。我该怎么做?

请注意,我还设置了正交投影矩阵,这可能会影响此问题。

最佳答案

如果您想要使用 OpenGL 在 XY 平面中渲染的 2D 图像,请围绕点 P 逆时针旋转 a (1) strong>,(2)S 缩放,然后 (3) 进行平移,以便 C 处的像素 (在新缩放和旋转的图像中)位于原点,您将使用此转换:

  1. -P平移(这会将P处的像素移动到原点)
  2. 旋转a
  3. P 进行翻译(这会将原点移回到原来的位置)
  4. S缩放(如果您之前这样做,您的旋转将会困惑)
  5. 翻译为-C

如果我们在原点渲染 2D 图像,您还需要沿负 z 轴平移某个值才能看到它。

通常,您只需使用 OpenGL 基础知识(glTranslatefglScalefglRotatef 等)即可完成此操作。您将按照我列出的相反顺序进行操作。由于您想使用 glLoadMatrix,因此您需要按照我在 Eigen 中描述的顺序执行操作。重要的是要记住 OpenGL 需要一个列主矩阵(但这似乎是 Eigen 的默认值;所以这可能不是问题)。

关于math - 使用 Eigen 计算 2D 相机的模型 View 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657218/

相关文章:

sql - 公式买三送一

c++ - 段错误 11 redux

c++ - 循环中的 SDL_GL_SwapBuffers() = 卡住?

c++ - 检查 gpu 是否存在 VBO

performance - Matlab 重复矩阵乘法 - 循环与内置性能

c - C 中负奇实数的黎曼 Zeta 函数

java - 使用 'fib(N) = [Phi^N – phi^N]/Sqrt[5]' 公式计算 Fibonacci 项的时间复杂度是多少?

android - 如何找到两点之间的相对方位?

python - 查找相似度矩阵中不在对角线上的最高值

从 R 中的矩阵中删除行名列表