将2D屏幕坐标转换为C ++中的3D空间坐标?

时间:2012-02-03 06:45:34

标签: c++ math graphics 3d coordinates

我正在使用OpenGLES的包装器编写2D游戏。有一个摄像头瞄准一堆纹理,这是游戏的精灵。用户应该能够通过在屏幕上移动他们的手指来移动视图。问题是,相机距离纹理约100个单位,因此当手指滑过屏幕以平移相机时,由于视差效应,精灵比手指移动得快。

所以基本上,我需要将2D屏幕坐标转换为特定z距离处的3D坐标(在我的情况下距离100,因为距离纹理有多远)。

C#中有一些"Unproject"函数,但我正在使用C++,所以我需要这个函数背后的数学运算。我对3D的东西非常陌生,而且我的数学非常糟糕,所以如果你能解释一下,你会向10岁的老人解释一下,我会非常感激。

如果我能做到这一点,我可以以这样的速度平移相机,这样看起来远处的精灵正在用手指摇动。

3 个答案:

答案 0 :(得分:0)

找到答案: Wikipedia

它具有以下公式:

要确定哪个屏幕x坐标对应于Ax点,Az将点坐标乘以:
enter image description here

,其中 Bx是屏幕x坐标
Ax是模型x坐标
Bz是焦距 - 从相机中心到像平面的轴向距离
Az是主题距离。

答案 1 :(得分:0)

出于拣选目的,有比进行反向投影更好的方法。请参阅此答案:https://stackoverflow.com/a/1114023/252687

答案 2 :(得分:0)

一般情况下,您必须缩放手指移动距离才能在遥远的平面(z单位远)使用它。

,即l单位是手指移动的量,如果你想找到效果z单位,长度l'= l / z 但是,请检查效果并调整l'(双/半等)以获得所需的效果。