【问题标题】:OpenGL Correct Multiplication Order for Panning, Zooming and Rotating a 2D Camera用于平移、缩放和旋转 2D 相机的 OpenGL 正确乘法顺序
【发布时间】:2014-06-17 18:24:01
【问题描述】:

我正在尝试制作相机的视图矩阵并使其可缩放、可平移和可旋转。我期望工作的矩阵是。

Matrix.translateM(matrixView, 0, -camposition.X, -camposition.Y, 0);
Matrix.scaleM(matrixView, 0, zoom, zoom, 1.0f);
Matrix.rotateM(matrixView, 0, camrotation, 0, 0, 1.0f);
Matrix.translateM(matrixView, 0, screenwidth / 2, screenheight / 2, 0);

但是它不能以这种方式工作。如果有人能指出我正确的方向,我将不胜感激。

这是我如何制作有效的模型矩阵:

Matrix.translateM(matrixModel, 0, position.X, position.Y, 0.0f);
Matrix.scaleM(matrixModel, 0, scale.X, scale.Y, 1.0f);
Matrix.rotateM(matrixModel, 0, rotation, 0, 0, 1.0f);
Matrix.translateM(matrixModel, 0, -origin.X, -origin.Y, 0.0f);

还有投影矩阵:

Matrix.orthoM(matrixProj, 0, 0f, screenWidth, screenHeight, 0, -1, 1);

我在顶点着色器中将它们相乘,如下所示:

matrixProj * matrixView * matrixModel * vPosition;

【问题讨论】:

  • 你确定你应该在你的模型矩阵中通过-origin.XY 进行翻译,然后在稍后进行一些转换(或者更确切地说,如果你从上到下阅读它们,则更早的几行)由position.XY 翻译?我希望在这里看到一个将对象放回 的翻译(这意味着通过 + origin.xy 进行翻译),然后再翻译为 position.xy为正常操作。或者,您可以将所有这些组合成一个翻译:position.xy + origin.xy.
  • 这是相机在不同功能中的位置 EDITED 表示
  • 这仍然不能完全解决您的问题。我假设您将对象转换为 -origin.X,-origin.Y 以便围绕某个点旋转它。但是您忽略了在将对象平移到其最终位置之前将其移回 。所以对象实际上现在放置在:position.X - origin.X, position.Y - origin.Y(假设所有 3 个坐标中的比例均为 1.0)。
  • 因为我希望位置指向对象的中心。很像 XNA C#
  • 我真的不明白这意味着什么。一个位置不能指向任何地方,它没有方向。

标签: opengl matrix camera opengl-es-2.0 matrix-multiplication


【解决方案1】:

我找到了正确的顺序,我会把它留给未来面临同样问题的开发人员。

Matrix.translateM(matrixView, 0, screenWidth / 2, screenHeight / 2, 0);
Matrix.scaleM(matrixView, 0, camZoom, camZoom, 1.0f);
Matrix.rotateM(matrixView, 0, camRotation, 0, 0, 1.0f);
Matrix.translateM(matrixView, 0, -camPosition.X, -camPosition.Y, 0);

请记住,这是针对视图矩阵的。对于模型矩阵,上面的代码工作得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多