变换模型矩阵

Tho*_*mas 0 c++ opengl coordinate-transformation glm-math

使用 glm 设置 ViewMatrix 很容易:

glm::lookAt(Position, Direction, UpVector);
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试将 funktion 与 modelMatrix 一起使用,我会得到令人困惑的值(模型的位置不正确,而且旋转看起来也不正确)。我只想以与设置相机相同的方式设置对象。我可以使用 lookAt 功能并在之后进行一些更改吗?还是我必须为此编写自己的功能?如果是这样,如何?

我用这个固定了位置:

m_Orientation = glm::lookAtLH(Position, Direction, UpVector);
m_Orientation[3][0] = -m_Orientation[3][0];
m_Orientation[3][1] = -m_Orientation[3][1];
m_Orientation[3][2] = -m_Orientation[3][2];
Run Code Online (Sandbox Code Playgroud)

也在 vertexshader 里面我用这个:

gl_Position = CameraMatrix * ModelMatrix * Pos;
Run Code Online (Sandbox Code Playgroud)

其中 CameraMatrix 是一个 viewProjectionMatrix,ModelMatrix(我的问题)和 Pos 是我的顶点在模型空间中的位置

Rab*_*d76 8

在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。最后将投影场景映射到视口。

模型坐标(对象坐标)

模型空间是局部空间,其中定义了网格。顶点坐标在模型空间中定义。

例如:

模型坐标

世界坐标

世界空间是场景的坐标系。不同的模型(对象)可以在世界空间中多次放置以形成一个场景,一起。

模型矩阵

模型矩阵定义了场景中模型(对象、网格)的位置、方向和相对大小。模型矩阵将单个网格的顶点位置转换到世界空间以进行单个特定定位。有不同的模型矩阵,一个用于模型(对象)和对象在世界空间中的位置的每种组合。

模型矩阵如下所示:

( X-axis.x, X-axis.y, X-axis.z, 0 )
( Y-axis.x, Y-axis.y, Y-axis.z, 0 )
( Z-axis.x, Z-axis.y, Z-axis.z, 0 )
( trans.x,  trans.y,  trans.z,  1 )
Run Code Online (Sandbox Code Playgroud)

例如:

(  0.0, -0.5,  0.0,  0.0 )
(  2.0,  0.0,  0.0,  0.0 )
(  0.0,  0.0,  1.0,  0.0 )
(  0.4,  0.0,  0.0,  1.0 )
Run Code Online (Sandbox Code Playgroud)

世界模型

视图空间(眼坐标)

视图空间是局部系统,由场景中的视点定义。视图的位置、视线和视图的向上方向,定义了一个相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系进行绘制,以便从观看位置“看到”。视图坐标系的逆矩阵称为视图矩阵
一般世界坐标和视图坐标都是笛卡尔坐标

查看矩阵

视图坐标系描述了观察场景的方向和位置。视图矩阵从世界空间转换到视图(眼睛)空间。

如果视图空间的坐标系是右手系,则 X 轴指向左侧,Y 轴向上,Z 轴在视图外(注意在右手系统中,Z 轴指向是 X 轴和 Y 轴的叉积)。

查看坐标

剪辑坐标

裁剪空间坐标是齐次坐标。在剪辑空间中执行场景的剪辑。
如果xyz分量在由倒置w分量和w点的齐次坐标分量定义的范围内,则点在裁剪空间中:

-w <=  x, y, z  <= w.
Run Code Online (Sandbox Code Playgroud)

投影矩阵

投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图空间转换到剪辑空间。裁剪空间中的坐标通过除以w剪辑坐标分量,将剪辑。

例如:

看:眼睛位置(2.5, -1.5, 3.5),中心(2, 0, 0),向上向量(0, 1, 0)

透视投影:视场 (y) 为100°,近平面为0.1,远平面为20.0

透视投影

标准化设备坐标

归一化设备坐标是剪辑空间坐标除以w剪辑坐标的分量。这称为透视鸿沟

标准化设备坐标

窗口坐标(屏幕坐标)

窗口坐标是视口矩形的坐标。最后将窗口坐标传递给评级过程。

视口和深度范围

标准化的设备坐标线性映射到窗口坐标(屏幕坐标)和深度缓冲区的深度。视口由 定义glViewport。深度范围由glDepthRange[0, 1]设置并默认为 [0, 1]。