使用glm:
设置ViewMatrix很容易glm::lookAt(Position, Direction, UpVector);
但如果我尝试使用modelMatrix的funktion,我会得到令人兴奋的值(模型不在正确的位置,旋转看起来也不对)。 我只想设置一个对象,就像设置相机一样。 我可以使用lookAt funktion并在之后进行一些更改吗?或者我是否必须为此编写自己的功能?如果是这样,怎么样?
我用这个来固定位置:
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];
也在顶点着色器中我使用它:
gl_Position = CameraMatrix * ModelMatrix * Pos;
其中CameraMatrix是viewProjectionMatrix,ModelMatrix(我的问题),Pos是我的顶点在模型空间中的位置
答案 0 :(得分:2)
在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵变换。 Finall将投影的场景映射到视口。
模型空间是局部空间,在网格内定义。顶点坐标在模型空间中定义。
e.g:
世界sapce是场景的坐标系。可以在世界空间中多次放置不同的模型(对象)以形成场景。
模型矩阵
模型矩阵定义场景中模型(对象,网格)的位置,方向和相对大小。模型矩阵将单个网格的顶点位置转换为世界空间,以进行单个特定定位。有不同的模型矩阵,一个用于模型(对象)的每个组合以及wolrd空间中对象的位置。
模型矩阵如下所示:
( 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 )
e.g:
( 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 )
视图空间是本地系统,它由场景的视点定义。 视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。必须相对于视图坐标系绘制场景的对象,以从观看位置“看到”。视图坐标系的逆矩阵称为视图矩阵 通常,世界坐标和视图坐标为Cartesian coordinates
查看矩阵
视图坐标系描述了观察场景的方向和位置。视图矩阵从wolrd空间转换为视图(眼睛)空间。
如果视图空间的coordiante系统是Right-handed系统,则X轴指向左侧,Y轴向上,Z轴指向视图(右侧注意)系统Z轴是X轴和Y轴的交叉积。
剪辑空间坐标为Homogeneous coordinates。在剪辑空间中,执行场景剪辑
如果x
,y
和z
组件位于由反向w
组件和w
组件定义的范围内,则点位于剪辑空间中点的齐次坐标:
-w <= x, y, z <= w.
投影矩阵
投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间变换到剪辑空间。通过除以剪辑的w
分量,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)坐标。
e.g:
看看:眼睛位置(2.5,-1.5,3.5),中心(2,0,0),向上(0,1, 0)
透视投影: 100°的视野(y), 0.1 附近的平面, 20.0 的远平面
标准化设备坐标是剪辑空间坐标除以剪辑坐标的w
分量。这称为Perspective divide
窗口坐标是视口矩形的坐标。最后将窗口坐标传递给raterization过程。
视口和深度范围
标准化设备坐标线性映射到窗口坐标(屏幕坐标)和深度缓冲区的深度。
视口由glViewport
定义。深度范围由glDepthRange
设置,默认为[0,1]。