当前位置: 首页 > 知识库问答 >
问题:

如何改变OpenGL坐标系+[矩阵运算]

闾丘玮
2023-03-14

我正在创建3D/2D图形引擎,我写了一些花哨的Vector2、Vector3类、窗口包装器和OpenGL上下文创建框架,有一段时间我在想如何切换坐标系轴。在OpenGL中,默认情况是这样的(据我所知):

+X axis stands for Right | -X for Left
+Y axis stands for Up    | -Y stands for Down
-Z stands for Forward    | -Z stands for Backward

我真的,真的不想有那样的coords,这只会让我无法阅读coords。所以我想到了UE4风格的坐标:

+X axis stands for Forward
+Y axis stands for Right
+Z axis stands for Up

我读过关于“调整”视角的书,但只有倒转轴,没有切换它们。

我的第二个问题是我在哪里可以学习一些矩阵运算(直接用于计算机图形学)?我不想下载现成的源代码或扩展。我写这个引擎的主要目的是学习数学,现在对我来说最重要的是矩阵--投影矩阵,旋转矩阵,平移矩阵,比例等等。

共有1个答案

王刚毅
2023-03-14

您正在描述OpenGL的剪辑空间坐标,并将其与UE4的世界空间坐标进行比较。一般来说,剪辑空间和世界空间不需要彼此有任何关系,所以比较它们是没有意义的。

你所要做的就是创建一个视图矩阵,它将你的坐标从世界空间转换到相机空间。该矩阵常与模型空间到世界空间的转换、摄像机空间到剪辑空间的转换矩阵相结合。将这三个矩阵组合在一起就得到了“ModelViewProjection”矩阵。

顶点着色器最终将如下所示:

// In model space
in vec3 Coords;
// Conversion from model space to clip space
uniform mat4 MVP;

void main() {
    gl_Position = MVP * vec4(Coords, 1.0);
}

MVP将由旋转、平移和缩放矩阵组合而成,这些矩阵一起工作。结果矩阵可能如下所示:

MVP=投影矩阵*旋转矩阵*平移矩阵*比例矩阵

我不建议尝试自己编写这些函数。它大多只是一个无聊和重复的编程任务,有很多机会制造错别字。从经验上说。或者,让我这么说吧。自己做铅笔并不能使你成为一个更好的作家。

 类似资料:
  • 我有一个小立方体,它的表面有n个(你可以假设n=4)个可分辨的点。这些点被编号(1-N),并形成一个坐标空间,其中点#1是原点。 现在我用一个跟踪相机来获取这些点的坐标,相对于相机的坐标空间。这意味着我现在有n个向量从相机的原点指向立方体的表面。 有了这些信息,我试图计算仿射变换矩阵(旋转+平移),它代表了这两个坐标空间之间的变换。平移部分是相当琐碎的,但我正在纠结于旋转矩阵的计算。 在OpenC

  • 本文向大家介绍Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系,包括了Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系的使用技巧和注意事项,需要的朋友参考一下  cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要。注释写的很清楚了,对照上运行结果一块来看代码吧!

  • 我制作了一个简单的OpenGL程序,在屏幕上绘制2D纹理。当你调整窗口大小时,它不能正确调整,所以要修复这个问题,我只需要再次运行投影矩阵代码: 但是,运行这段代码会扭曲图像。根据我的理解,为了使我能在屏幕上画出类似2D的效果,我的纹理是用正投影矩阵绘制的,这意味着有一个平面与窗口或类似我所画的东西“平行”。当我试图重新调整它以适应新的窗口大小时,它无法正确调整。这段代码出了什么问题?

  • 我需要点子,这不是家庭作业...... 我有下面的矩阵,我如何获得重复数字的坐标, 重复项[[[0,0],[1,0],[2,0],[0,1],[0,1],[0,2],[1,2],[1,3],[2,2]],[[0,3],[0,4],.........] 第1组,分离2组,分离3组,仅2组 重复项[[[0,0],[1,0],[2,0],[0,1],[0,2],[1,2],[1,3],[2,2]],[[

  • 问题内容: 我试图在OpenGL中使用gluUnProject,首先我需要获取projectoin,model_view和viewort矩阵。根据我在网上找到的例子 但是我收到错误消息“ ValueError:glGetFloatv需要1个参数(pname),收到2:(GL_PROJECTION_MATRIX,[])” 那么,我应该使用什么来获取这些矩阵? 问题答案: 也许: 之后在变量中应该是投