gpt4 book ai didi

3d - 使用透视相机矩阵将 3D 点投影到 2D 屏幕空间

转载 作者:行者123 更新时间:2023-12-04 11:16:16 26 4
gpt4 key购买 nike

我正在尝试使用透视相机矩阵将一系列 3D 点投影到屏幕上。我没有世界空间(或认为它是单位矩阵)并且我的相机没有相机空间(或认为它是单位矩阵),我的对象空间确实有一个 4x4 矩阵。

我正在获取对象矩阵并将其乘以相机透视矩阵,使用以下方法生成:

Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far )
{
Float fov2 = (fov/2) * (Math.PI/180);
Float tan = Math.tan(fov2);
Float f = 1 / tan;

return new Matrix4 (
f/aspect, 0, 0, 0,
0, f, 0, 0,
0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far),
0, 0, 1, 0
);
}

然后我将我的观点 [x, y, z, 1] 乘以透视矩阵和对象矩阵的乘积。

下一部分是我感到困惑的地方,我很确定我需要在 -1 和 1 或 0 和 1 的范围内获得这些点,并且在拥有第一组值的情况下,然后我将这些点分别乘以屏幕坐标 x 和 y 值的屏幕宽度和高度,或者将这些值乘以屏幕高度/2 和宽度/2,并将相同的值添加到各个点。

任何一步一步地告诉我如何实现这一点,或者我可能在哪里出错,将不胜感激! :D

最好的问候大家!

附言在单位/平移矩阵的示例中,我的模型中的矩阵格式是:
[1, 0, 0, tx,
0, 1, 0, ty,
0, 0, 1, tz,
0, 0, 0, 1 ]

最佳答案

您的问题是您忘记执行透视除法。

透视除法意味着您将点的 x、y 和 z 分量除以其 w 分量。
这是将您的点从齐次 4D 空间转换为标准化设备坐标系 (NDCS) 所必需的,其中每个分量 x、y 或 z 介于 -1 和 1 或 0 和 1 之间。

在此转换之后,您可以进行视口(viewport)转换(将点乘以屏幕宽度、高度等)。

Foley 的书(Computer Graphics: Principles and Practice in C)中对这种转换管道有很好的看法,你可以在这里看到:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

关于3d - 使用透视相机矩阵将 3D 点投影到 2D 屏幕空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670340/

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