gpt4 book ai didi

c++ - 转换模型矩阵

转载 作者:行者123 更新时间:2023-11-28 01:43:54 24 4
gpt4 key购买 nike

用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 是我的顶点在模型空间中的位置

最佳答案

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

模型坐标(物体坐标)

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

例如:

model coordinates

世界坐标

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

模型矩阵

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

模型矩阵如下所示:

( 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

View 空间(眼睛坐标)

View 空间是由场景中的视点定义的局部系统。 View 的位置、视线和 View 的向上方向,定义了一个相对于世界坐标系的坐标系。场景的对象必须相对于 View 坐标系绘制,以便从查看位置“看到”。 View 坐标系的逆矩阵被命名为 View 矩阵
一般世界坐标和 View 坐标都是Cartesian coordinates

查看矩阵

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

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

view coordinates

剪辑坐标

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

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

投影矩阵

投影矩阵描述了从场景的 3D 点到视口(viewport)的 2D 点的映射。投影矩阵从 View 空间变换到裁剪空间。通过除以 w 组件,将剪辑空间中的坐标转换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的归一化设备坐标 (NDC)剪辑坐标。

例如:

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

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

perspective projection

标准化设备坐标

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

normaliced device coordinates

窗口坐标(屏幕坐标)

窗口坐标是视口(viewport)矩形的坐标。窗口坐标最终被传递给评级过程。

视口(viewport)和深度范围

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

关于c++ - 转换模型矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com