我是webGl的新手,我正在使用Three.js开展Oculus Rift项目。我尝试制作一种加载器:当用户在2s内聚焦一点时,我会抛出一个事件。
我使用frustum.intersectsObject(object)并且它起作用:当对象在视口中时,该函数返回true但我希望它仅在对象位于居中区域时返回true
这是我在渲染循环中的代码,用于检查对象是否在平截头体中:
// Create a new Frustum object (for efficiency, do this only once)
var frustum = new THREE.Frustum();
// Helper matrix (for efficiency, do this only once)
var projScreenMatrix = new THREE.Matrix4();
// Set the matrix from camera matrices (which are updated on each renderer.render() call)
projScreenMatrix.multiplyMatrices( views[0].focusCamera.projectionMatrix, views[0].focusCamera.matrixWorldInverse );
// Update the frustum
frustum.setFromMatrix( projScreenMatrix );
// Test for visibility
if ( frustum.intersectsObject( loaderMesh ) ) {
console.log("In the frustum");
}
else{
console.log("Not in the frustum");
}
我尝试使用两个摄像头:一个用于渲染器,另一个用于较小的视野以设置平截头体矩阵,但它不起作用。
你有什么想法让它有效吗?提前致谢
答案 0 :(得分:0)
截锥体交叉法正确地完成了它的工作。通过定义为视图视锥体,视锥体与场景中可见的所有内容相交。
问题是你应该使用矢量/光线交叉。通过创建向量(0,0,1)然后通过视图矩阵对其进行变换,创建指向用户正在查看的方向的光线。生成的光线是用户在世界空间中查看的方向。将 与您的网格相交,如果它返回true,则用户正在查看它。
请记住,如果您正在使用立体内容(如Rift),两只眼睛实际上可以产生不同的光线,那么您应该为应用程序提供通用的“头部姿势”输入,而不是依赖于每眼视图矩阵。