我正在调用gluUnProject(app正在使用GLES20)。对于我的生活,我无法获得我正在寻找的价值。
我在(-9,0,0)有一个对象,所以我需要gluUnProject的结果以某种方式等于这个。摄像机位于(0,20,4),近/远平面距离为(3,100)。我甚至尝试在运行函数时打印出当前矩阵(在这种情况下,屏幕上触摸的像素位置是(160,345),非常靠近对象的位置):
win: (160,345,0.0)
model: (1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)
viewport: (0, 0, 1280, 720)
proj: (0.5625, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.020202, -1.0, 0.0, 0.0, -2.020202, 0.0)
近平面:
obj: (-1.3333333, -0.041666687, -1.0, 1.0)
final: (-1.3333333, -0.041666687, -1.0)
远飞:
obj: (-1.3333333, -0.041666687, -1.0, 0.00999999)
final: (-133.33345, -4.1666727, -100.0001)
我应该在这里使用为Z值计算的东西吗?如果我提供一个大约0.864的值,我得到大约正确的X值(-9),这对我来说真的没有意义。我在任何计算中都找不到这个值。我一遍又一遍地玩这些数字,但是不能让它们一起工作。我在这里缺少什么?
答案 0 :(得分:0)
你不能用gluUnProject做到这一点。
第3个参数是屏幕空间中所需点的深度(即0到1之间,0映射到近平面,1映射到远平面)
由于您不知道此值,因此无法使用此功能。
如果您正在尝试实施拣选,则应手动启动光线并测试与对象的交叉点(或使用碰撞/物理引擎为您执行此操作)。
答案 1 :(得分:0)
这是我的非项目
glm::vec3 World::Unproject(glm::vec3 v){
glm::mat4 pv = ProjectionMatrix * ViewMatrix;
glm::mat4 inv = glm::inverse(pv);
glm::vec4 v4(v, 1.f);
glm::vec4 r4 = inv * v4;
glm::vec3 r(r4.x / r4.w, r4.y / r4.w, r4.z / r4.w);
return r;
}
v
是(x,y,1.0)
-1.0 < x,y < 1.0
Camera,Unproject(v) - 定义光线 您可以计算到射线的距离