perspectiveCamera = new PerspectiveCamera(90, 80, 48);
perspectiveCamera.position.set(0,0, 10f);
perspectiveCamera.lookAt(0,0,0);
perspectiveCamera.near = .01f;
perspectiveCamera.far = 300f;
我的ScreenWidth x ScreenHeight是800 x 480;
pCamera.unproject(mytouchPoint)应该假设在
之间给出结果x = 0到80 y = 0到48
但是x轴和y轴都得到了0.000xyz
答案 0 :(得分:3)
请勿对相机的near
成员使用如此小的值,否则会导致浮点错误和/或z-fighting。
您提供给PerspectiveCamera
构造函数的宽度和高度值用于计算宽高比。在3D透视图中没有单一的2D分辨率(世界坐标中的屏幕平面的大小)。
您不能简单地将2D屏幕坐标投影到单个3D坐标。对于每个2D屏幕坐标,可能存在“无限”量的3D坐标。因此,摄像机的unproject
方法将使用所提供的屏幕坐标的z坐标来决定返回哪些3D坐标。如果z为零,它将给出近平面上的坐标。如果z是1,它将给出远平面上的坐标。
假设您使用z = 0表示myTouchPoint
并且假设您有一个非常小的近平面(因为您near
值非常小),未投影的值将变小并且因此(几乎)等于零。
有关详细信息,您可能需要查看:http://blog.xoppa.com/interacting-with-3d-objects/
答案 1 :(得分:1)
我找到了一种轻松做到这一点的方法。它也很快。
只需在所需深度z处创建一个平面,并在其上找到光线的交点。
float zDepth=-10;//your decision or and object z position
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
Ray ray = camera.getPickRay(screenX,screenY);
Plane plane=new Plane();
plane.set(0,0,1,0);// the xy plane with direction z facing screen
plane.d=zDepth;//***** the depth in 3d for the coordinates
Vector3 yourVector3Position=new Vector3();
Intersector.intersectRayPlane(ray, plane, yourVector3Position);
}