gpt4 book ai didi

c++ - 将 3d 位置转换为 2d 屏幕位置

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:06 25 4
gpt4 key购买 nike

我想将 3d 位置转换为 2d 屏幕位置。我看过一个类似的问题:Projecting a 3D point to a 2D screen coordinate ,但我完全不明白。我想为了计算 2d 位置我需要投影矩阵,但我不知道它是如何使用的,除了将一个点转换成位置坐标空间。另外,cam.FieldOfView在OpenGL中是否等于farZ?

有人可以帮我完成这个功能吗?参数是否足以计算 2d 位置? Pos 已经是一个相对于相机位置的 vector 。

       Vector2* convert(Vector3& pos, Matrix4& projectionMatrix, int screenWidth, int screenHeight)
{
float ratio = screenWidth / screenHeight;

...

screenX = screenWidth * ( 1.0f - screenX);
screenY = screenHeight * ( 1.0f - screenY);

return new Vector2(screenX, screenY);
}

最佳答案

在我看来应该是这样的:

    Vector2 Convert(Vector3 pos, const Matrix& viewMatrix, const Matrix& projectionMatrix, int screenWidth, int screenHeight)
{
pos = Vector3::Transform(pos, viewMatrix);
pos = Vector3::Transform(pos, projectionMatrix);

pos.X = screenWidth*(pos.X + 1.0)/2.0;
pos.Y = screenHeight * (1.0 - ((pos.Y + 1.0) / 2.0));

return Vector2(pos.X, pos.Y);
}

我们在这里所做的只是将 Vector 传递给两个变换矩阵: View ,然后是投影。投影后,您会得到一个 Y 和 X 介于 -1 和 1 之间的 vector 。我们进行适当的转换以获得真实的像素坐标并返回一个新的 Vector2。请注意,'pos' 的 Z 分量也存储点的深度,在屏幕空间中,在函数的末尾。

您需要“ View ”矩阵,因为它定义了相机的位置和旋转位置。投影仅定义 3D 空间在 2D 空间上“展平”的方式。

视野不是farZ。投影矩阵有一些参数,其中:

  • 视野,FOV,即水平视角,单位为弧度;
  • 远平面,或 farZ :这定义了一个点与相机的最大距离;
  • 近平面,nearZ:一个点到相机的最小距离。

除了数学问题,你可以直接使用 Vector2 而不是堆分配(返回指针)。 Vector2 是一个轻型结构,指针很可能在这种情况下引起头痛(你要在哪里删除它,等等)。另请注意,我使用了“常量”引用,因为我们不修改它们, vector 除外。对于这个,我们需要一个本地拷贝,这就是为什么它根本不是引用。

关于c++ - 将 3d 位置转换为 2d 屏幕位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7748357/

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