其他分享
首页 > 其他分享> > c – 转换modelMatrix

c – 转换modelMatrix

作者:互联网

使用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];

也在vertexshader里面我用这个:

gl_Position = CameraMatrix * ModelMatrix * Pos;

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

解决方法:

在渲染中,场景的每个网格通常由模型矩阵,视图矩阵和投影矩阵变换. Finall将投影场景映射到视口.

模型坐标(对象坐标)

模型空间是局部空间,在网格内定义.顶点坐标在模型空间中定义.

例如.:

model coordinates

世界坐标

世界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 )

例如.:

(  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 )

model to world

查看sapce(眼睛坐标)

视图空间是本地系统,它由场景的视点定义.
视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系.必须相对于视图坐标系绘制场景的对象,以从观看位置“看到”.视图坐标系的逆矩阵被称为视图矩阵.
通常,世界坐标和视图坐标是Cartesian coordinates

查看矩阵

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

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

view coordinates

剪辑坐标

剪辑空间坐标为Homogeneous coordinates.在剪辑空间中,执行场景剪辑.
如果x,y和z分量在由反向w分量和点的齐次坐标的w分量定义的范围内,则点在剪辑空间中:

-w <=  x, y, z  <= w.

投影矩阵

投影矩阵描述了从场景的3D点到视口的2D点的映射.投影矩阵从视图空间变换到剪辑空间.通过用剪辑坐标的w分量划分,剪辑空间中的坐标被变换为范围(-1,-1,-1)到(1,1,1)的归一化设备坐标(NDC).

例如.:

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

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

perspective projection

Normaliced设备坐标

标准化设备坐标是剪辑空间坐标除以剪辑坐标的w分量.这叫做Perspective divide

normaliced device coordinates

窗口坐标(屏幕坐标)

窗口坐标是视口矩形的坐标.窗口坐标最终传递给raterization过程.

视口和深度范围

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

标签:glm-math,coordinate-transformation,c,opengl
来源: https://codeday.me/bug/20190915/1806285.html