帖子 1) 我正在尝试检测相机可见的所有对象,以便在它们不在视野范围内时我可以将它们重新定位到起始位置。我的目标是重用现有对象的无限瀑布效果。我真的不明白为什么 intersects 是空的,如果我在循环 scene.children 时对单个对象进行光线转换,它会起作用,但这会导致非常糟糕的性能,因为它位于动画循环中。
感谢您的帮助
第 2 篇文章)我已改为截头体剔除,但 frustum.containsPoint(scene.children[index]) 始终返回 true,即使对象明显超出相机 View 也是如此。
再次感谢任何帮助
camera.updateMatrix();
camera.updateMatrixWorld();
var frustum = new THREE.Frustum();
var projScreenMatrix = new THREE.Matrix4();
projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
// frustum.setFromProjectionMatrix(camera.projectionMatrix);
frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));
for (let index = 0; index < scene.children.length; index++) {
scene.children[index].updateMatrix(); // make sure plane's local matrix is updated
scene.children[index].updateMatrixWorld();
if (frustum.containsPoint(scene.children[index])) {
//stuff happens...
if (scene.children[index].name === "coin") {
scene.children[index].rotation.x += 0.01;
scene.children[index].position.y -= 0.1;
}
// console.log("mesh in view Frustrum");
} else {
console.log("mesh not in view Frustrum");
}
}
最佳答案
I am trying to detect all objects viewable by the camera
您不需要为此进行光线转换。相反,设置 Frustum 的实例通过 setFromProjectionMatrix()
基于相机的投影和 View 矩阵。在下一步中,使用 intersectsObject()
检测 3D 对象是否位于相机的视锥体(3D 场景的可视区域)内。
关于javascript - Threejs Raycast 与 scene.children 空相交。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71075948/