我很难做出一个功能,如果飞机是在相机的视图frustrum内返回true。我发现这篇文章,on github,但无论对象是否在平截头体中,配方总是返回false。如何确定飞机是否在Three.js相机Frustum
任何人都已经实现这智能?非常感谢。
我很难做出一个功能,如果飞机是在相机的视图frustrum内返回true。我发现这篇文章,on github,但无论对象是否在平截头体中,配方总是返回false。如何确定飞机是否在Three.js相机Frustum
任何人都已经实现这智能?非常感谢。
也许矩阵不更新?
camera.updateMatrix(); // make sure camera's local matrix is updated
camera.updateMatrixWorld(); // make sure camera's world matrix is updated
camera.matrixWorldInverse.getInverse(camera.matrixWorld);
plane.updateMatrix(); // make sure plane's local matrix is updated
plane.updateMatrixWorld(); // make sure plane's world matrix is updated
var frustum = new THREE.Frustum();
frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));
alert(frustum.contains(plane));
纠正我,如果我错了,但为什么计算视锥第二次?
我正在处理一个复杂的项目,并且接受的答案对我来说不是最好的解决方案。我看不出重新计算什么意思。为了达到我的目的,我修改了我的three.js副本,如果在平截头体中发现了某种东西,请举起一面旗帜。后来只是检查你的对象,如果object.inFrustum ===真
下面以下行
if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject(object) === true)) {
添加
object.inFrustum = true;
也是其中如果块结束时添加oposite标志
else {
object.inFrustum = false;
}
我在r70中的最终结果是完美的:
if (webglObjects && (object.frustumCulled === false || _frustum.intersectsObject(object) === true)) {
object.inFrustum = true; // The line to add
for (var i = 0, l = webglObjects.length; i < l; i ++) {
var webglObject = webglObjects[i];
unrollBufferMaterial(webglObject);
webglObject.render = true;
if (_this.sortObjects === true) {
_vector3.setFromMatrixPosition(object.matrixWorld);
_vector3.applyProjection(_projScreenMatrix);
webglObject.z = _vector3.z;
}
}
} else { // Create second condition like that
object.inFrustum = false;
}
我想知道如果平截头体包含整个立方体,但它不能使用此方法...我可以使用什么方法? (我没有看到[文档](http://threejs.org/docs/#Reference/Math/Frustum)中列出的任何东西) – CodyBugstein
您可以在该时间点拍摄对象的画布快照以获得物体的平面透视图。找到组成该多边形快照的行。你已经知道相机矩阵的坐标。现在你有一个多边形在里面,或者在另一个多边形的外面/重叠。使用“多边形多边形”检测算法又名扫描线算法来获得您所需要的! –