Android 将二维屏幕坐标转换为三维世界坐标

Android 将二维屏幕坐标转换为三维世界坐标,android,c++,ios,opengl,3d,Android,C++,Ios,Opengl,3d,我想将2d屏幕坐标转换为3d世界坐标 我做了一个黑客,但想一个固体解决方案。如果可能,请在下面的示例中使用您的方程式/算法(如果已经有链接,您是否可以使用该链接来显示以下问题的解决方案) 我的环境是Java/C++for Android和iOS,使用OpenGL 2.0 要解决的问题 何处屏幕 (0,0)为左上角,右下角为屏幕宽度和屏幕高度 屏幕宽度=667;屏幕高度=375 //摄像机的位置、摄像机所处的位置以及摄像机的方向 坎波斯(0.0f、0.0f、11.0f);CamLookAt(0.0

我想将2d屏幕坐标转换为3d世界坐标

我做了一个黑客,但想一个固体解决方案。如果可能,请在下面的示例中使用您的方程式/算法(如果已经有链接,您是否可以使用该链接来显示以下问题的解决方案)

我的环境是Java/C++for Android和iOS,使用OpenGL 2.0

要解决的问题

何处屏幕 (0,0)为左上角,右下角为屏幕宽度和屏幕高度

屏幕宽度=667;屏幕高度=375

//摄像机的位置、摄像机所处的位置以及摄像机的方向

坎波斯(0.0f、0.0f、11.0f);CamLookAt(0.0f、0.0f、10.5f);CamDir(0.0f、1.0f、0.0f)

//圆台

左=1.3f;右=1.3f;底部=1.0f;顶部=1.0f;近=3.0f;far=1000.0f

Obj

//对象在三维空间x、y、z和缩放中的位置

objPos(1.0f、.5f、5.0f);objScale(.1f、.1f、0.0f)

问题是如何将(6000200)屏幕坐标(缩放比例为(.1f、.1f.0.0f))转换为对象的(1.0f、.5f、5.0f)世界坐标,以检查它们是否发生碰撞(我正在进行简单的框碰撞,只需要将2d屏幕坐标转换为世界坐标)。我会把我的黑客,但我相信有一个更好的答案下面。提前感谢您的帮助。请用上面的数字来说明你的算法是如何工作的


我可以给你一个我用过的解决方案,但我想在最后一部分明确物体的位置和比例。该对象是一个在x和y轴上缩放了0.1,在z轴上缩放了0.0(零!)的单点吗?有两种方法:(1)将对象投影到屏幕坐标中并进行比较,或者(2)将屏幕坐标投影到从摄影机发射到场景中的光线中(我的解决方案使用后者)。>>对象是否是一个在x和y轴上缩放了0.1,在z轴上缩放了0.0(零!)的单点?是的,对象在z方向上为零,因为它只是一个纹理。所以物体的宽度和高度(真正的纹理)是.1f是的,我想看看你对#2的解决方案。此外,如果您可以在上面的示例中使用它来验证它是否有效,那将是非常棒的!更重要的是。我需要相机发出的光线在z轴上有一个点,可以用于2d长方体碰撞。因此,如果对象是objPos(1.0f,-.5f,5.0f);我希望屏幕坐标在一个范围内,可以用于该对象的2d长方体碰撞。所以正确的转换点应该是x.9f到1.1f,y-.4f到-.6f
//this is 0,0 in screen coordinates//-Cam_Offset =hardcoded to camera's pos
float convertedZeroY= (((mCam->right)*(Cam_Offset))); //2
float convertedZeroX= -(((Cam_Offset)+convertedZeroY));

convertedZeroY=convertedZeroY/2;
convertedZeroX=convertedZeroX/2;
//this is the length from top to bottom in game coordinates
float normX=convertedZeroX*2;
float normY=convertedZeroY*2;

//this is the screen coordinates converted to 3d world coordinates
mInput->mUserInputConverted->mPos.x=(-(((mInput->x)/mCam->mScreenW)*normX)+convertedZeroX);
mInput->mUserInputConverted->mPos.y=(-(((mInput->y)/mCam->mScreenH)*(normY))+convertedZeroY);