gpt4 book ai didi

c++ - 将屏幕 2D 坐标转换为世界 3D 坐标

转载 作者:行者123 更新时间:2023-11-30 05:40:29 46 4
gpt4 key购买 nike

我想将 2D 屏幕坐标转换为 3D 世界坐标。我已经搜索了很多,但没有得到任何令人满意的结果。

注意:我没有使用 OpenGL 或任何其他图形库。

我拥有的数据:

屏幕 X

屏幕 Y

屏幕高度

屏幕宽度

纵横比

最佳答案

如果你有相机世界矩阵和投影矩阵,这就非常简单了。

如果您没有世界矩阵,您可以根据它的位置和旋转来计算它。

worldMatrix = Translate(x, y, z) * RotateZ(z_angle) * RotateY(y_angle) * RotateX(x_angle);

其中 translate 返回 4x4 平移矩阵,Rotate 返回围绕给定轴的 4x4 旋转矩阵。

投影矩阵可以根据纵横比、视野角、近远平面计算。

This blog对如何计算投影矩阵有很好的解释。

您可以通过以下方式取消投影屏幕坐标:

mat = worldMatrix * inverse(ProjectionMatrix)
dir = transpose(mat) * <x_screen, y_screen, 0.5, 1>

dir /= mat[3] + mat[7] + mat[11] + mat[15]
dir -= camera.position

您的光线将从相机指向 dir 方向。

这应该可行,但它不是关于如何执行此操作的 super 具体示例。

基本上您只需要执行以下步骤:

calculate camera's worldMatrix
calculate camera's projection matrix
multiply worldMatrix with inverse projection matrix.

create a point <Screen_X_Value, Screen_Y_Value, SOME_POSITIVE_Z_VALUE, 1>
apply this "inverse" projection to your point.
then subtract the cameras position form this point.

生成的 vector 是相机的方向。沿着该射线的任何点都是对应于您的 2D 屏幕坐标的 3D 坐标。

关于c++ - 将屏幕 2D 坐标转换为世界 3D 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31613832/

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