转换模型矩阵
Transform the modelMatrix
用glm设置ViewMatrix很容易:
glm::lookAt(Position, Direction, UpVector);
但是如果我尝试将函数与 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];
也在我使用的顶点着色器中:
gl_Position = CameraMatrix * ModelMatrix * Pos;
其中 CameraMatrix 是一个 viewProjectionMatrix,ModelMatrix(我的问题),Pos 是我的顶点在模型空间中的位置
在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。最后将投影场景映射到视口。
模型坐标(物体坐标)
模型 space 是局部模型 space,其中定义了一个网格。顶点坐标在模型 space.
中定义
例如:
世界坐标
世界space是场景的坐标系。不同的模型(物体)可以在世界中多次放置space形成一个场景,放在一起。
模型矩阵
模型矩阵定义场景中模型(对象、网格)的位置、方向和相对大小。模型矩阵将单个网格的顶点位置转换为世界 space 以进行单个特定定位。有不同的模型矩阵,一个模型(对象)和对象在世界中的位置的每个组合 space。
模型矩阵如下所示:
( 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 )
视图space(眼睛坐标)
视图space 是局部系统,由场景中的视点定义。
视图的位置,视线和视图的向上方向,定义了一个相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系绘制,以便从查看位置“看到”。视图坐标系的逆矩阵命名为视图矩阵.
一般世界坐标和视图坐标是Cartesian coordinates
查看矩阵
视图坐标系描述了观察场景的方向和位置。视图矩阵从世界 space 转换为视图(眼睛)space.
如果视图space的坐标系是Right-handed系统,则X轴指向左侧,Y轴指向上方,Z轴指向视图外(请注意,在右手系统中,Z 轴是 X 轴和 Y 轴的叉积)。
剪辑坐标
剪辑space坐标为Homogeneous coordinates。在 clip space 中执行场景的剪辑。
如果 x
、y
和 z
分量在反转的 w
分量和 w
点的齐次坐标分量:
-w <= x, y, z <= w.
投影矩阵
投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图 space 变换到剪辑 space。剪辑 space 中的坐标通过除以 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
标准化设备坐标
标准化设备坐标是剪辑 space 坐标除以剪辑坐标的 w
分量。这叫做Perspective divide
Window坐标(屏幕坐标)
window坐标是视口矩形的坐标。 window 坐标最终被传递给评级过程。
视口和深度范围
标准化设备坐标线性映射到Window坐标(屏幕坐标)和深度缓冲区的深度。
视口由 glViewport
. The depthrange is set by glDepthRange
定义,默认为 [0, 1].
用glm设置ViewMatrix很容易:
glm::lookAt(Position, Direction, UpVector);
但是如果我尝试将函数与 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];
也在我使用的顶点着色器中:
gl_Position = CameraMatrix * ModelMatrix * Pos;
其中 CameraMatrix 是一个 viewProjectionMatrix,ModelMatrix(我的问题),Pos 是我的顶点在模型空间中的位置
在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行变换。最后将投影场景映射到视口。
模型坐标(物体坐标)
模型 space 是局部模型 space,其中定义了一个网格。顶点坐标在模型 space.
中定义例如:
世界坐标
世界space是场景的坐标系。不同的模型(物体)可以在世界中多次放置space形成一个场景,放在一起。
模型矩阵
模型矩阵定义场景中模型(对象、网格)的位置、方向和相对大小。模型矩阵将单个网格的顶点位置转换为世界 space 以进行单个特定定位。有不同的模型矩阵,一个模型(对象)和对象在世界中的位置的每个组合 space。
模型矩阵如下所示:
( 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 )
视图space(眼睛坐标)
视图space 是局部系统,由场景中的视点定义。
视图的位置,视线和视图的向上方向,定义了一个相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系绘制,以便从查看位置“看到”。视图坐标系的逆矩阵命名为视图矩阵.
一般世界坐标和视图坐标是Cartesian coordinates
查看矩阵
视图坐标系描述了观察场景的方向和位置。视图矩阵从世界 space 转换为视图(眼睛)space.
如果视图space的坐标系是Right-handed系统,则X轴指向左侧,Y轴指向上方,Z轴指向视图外(请注意,在右手系统中,Z 轴是 X 轴和 Y 轴的叉积)。
剪辑坐标
剪辑space坐标为Homogeneous coordinates。在 clip space 中执行场景的剪辑。
如果 x
、y
和 z
分量在反转的 w
分量和 w
点的齐次坐标分量:
-w <= x, y, z <= w.
投影矩阵
投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。投影矩阵从视图 space 变换到剪辑 space。剪辑 space 中的坐标通过除以 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
标准化设备坐标
标准化设备坐标是剪辑 space 坐标除以剪辑坐标的 w
分量。这叫做Perspective divide
Window坐标(屏幕坐标)
window坐标是视口矩形的坐标。 window 坐标最终被传递给评级过程。
视口和深度范围
标准化设备坐标线性映射到Window坐标(屏幕坐标)和深度缓冲区的深度。
视口由 glViewport
. The depthrange is set by glDepthRange
定义,默认为 [0, 1].