根据当前相机确定网格是不是在视口上可见
Posted
技术标签:
【中文标题】根据当前相机确定网格是不是在视口上可见【英文标题】:Determine if a mesh is visible on the viewport according to current camera根据当前相机确定网格是否在视口上可见 【发布时间】:2013-07-11 12:48:35 【问题描述】:我一直在使用three.js
开发一个应用程序,但我遇到了这个问题,我似乎找不到任何解决方案。
我想根据相机当前瞄准的位置确定哪些网格现在可见,因此我可以刷新我的对象(数据来自服务)或不刷新,具体取决于它们是否显示在视口上。
我在 CANVAS 模式下使用THREE.js
(我找到了一个使用 WebGL 的解决方案,说明对象是否被渲染,但我需要此项目的 CANVAS)。
我一直在尝试查找three.js
是否以某种方式设置了一个属性来指示对象是否可见(当前在屏幕上,而不是在整个 3D 世界上),但我找不到它。网格有一个 visible: 属性,但即使相机没有瞄准该对象,它也始终为 true。
【问题讨论】:
研究截头剔除 【参考方案1】:这是你要的代码:
var frustum = new THREE.Frustum();
var cameraViewProjectionMatrix = new THREE.Matrix4();
// every time the camera or objects change position (or every frame)
camera.updateMatrixWorld(); // make sure the camera matrix is updated
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
cameraViewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
frustum.setFromMatrix( cameraViewProjectionMatrix );
// frustum is now ready to check all the objects you need
console.log( frustum.intersectsObject( object ) );
【讨论】:
我正在尝试代码,但我使用 cameraViewProjectionMatrix.multiplyMatrices 得到“未定义的方法”,你知道为什么吗?您打算使用 .multiply(a, b) 吗?谢谢。 哦,nonono,我的错。使用旧版本的 three.js(rev 54)。我会更新的。 这适用于特定的三角形/面吗?怎么会被引用? 非常适合我,谢谢!现在如何将对象从截锥体外部的任何向量移动到截锥体的另一侧(目标:在对象移出视野后重新生成对象)。此处创建的问题:***.com/questions/25826091/… 我在使用这个时收到“未捕获的类型错误:无法读取未定义的属性‘元素’”?这是过时的还是什么(r71)?以上是关于根据当前相机确定网格是不是在视口上可见的主要内容,如果未能解决你的问题,请参考以下文章