所以这里是问题概述:我使用GvrView.StereoRenderer在GvrView中使用OpenGL ES渲染了许多模型,我想确定我正在查看哪个模型。
我的想法是将屏幕坐标重新投影回模型空间(丢弃Z)并检查点(让我们称之为Point)是否在以下范围内: (ModelsMinX< Point.x< ModelsMaxX)和(ModelsMinY< Point.y< ModelsMaxY)。
我试图使用GLU.gluUnproject来获取初始坐标。此函数需要当前视口以及问题开始的位置:
GvrView.StereoRenderer有一个方法.onDrawEye,每当在渲染之前应该设置一个特定于一只眼睛的东西时调用它(也就是应该从Eye实例获取视图和投影矩阵)。 An Eye还有一个方法.getViewport,它应该返回当前眼睛的视口,但返回的结果对我来说是完全清楚的。更具体地说,我正在开发Nexus 6(1440x2560像素)和.getViewport返回:
对于第一只眼睛,x = 0,y 0,宽度= 1280,高度= 1440 //
对于第二只眼睛,x = 1280,y 0,宽度= 1280,身高= 1440 //。
现在这很有趣..不知怎的,我假设有关当前视口的两件事:
width = 1440,height = 1280(毕竟我们处于横向模式);
每只眼睛的视口大小将是整个视口大小的一半。
因此,在视口的中间点调用.gluUnproject:
GLU.gluUnProject(viewport.width / 2, viewport.height / 2, 0, mEyeViewMatrix, 0, mEyeProjectionMatrix, 0, new int[] {viewport.x, viewport.y, viewport.width, viewport.height}, 0, center, 0);
没有产生预期的结果,事实上,它给了我全部0。我发现了这个问题(Determining exact eye view size),但是这个人的视口值更加奇怪,而且它没有答案..
所以问题是 - 如何从'眼'空间坐标到模型?那些坐标甚至是什么? 以下是 项目的github 供参考:https://github.com/bowlingforsoap/CardboardDataVisualizationJava。
我所知道的其他一些方法:
在寻宝演示中,他们使用相反的做法 - 他们使用HeadTransform从模型坐标(0,0,0,1)进入头部视图空间以获取headView矩阵(查找方法.isLookingAtObject在https://github.com/googlevr/gvr-android-sdk/blob/master/samples/sdk-treasurehunt/src/main/java/com/google/vr/sdk/samples/treasurehunt/TreasureHuntActivity.java)。
使用光线投射。我不确定这会对我的事业有所帮助,因为在我得到一个观察对象后,我想创建一个“浮动”活动,它将包含有关它的信息(我当然不希望通过着色器渲染该数据) )。
Wheh!男孩,这是很多文字。但是,它似乎是一个普遍的问题,但我还没有找到一个简单/优雅/工作的解决方案..会感激任何反馈。