我很難做出一個功能,如果飛機是在相機的視圖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
您可以在該時間點拍攝對象的畫布快照以獲得物體的平面透視圖。找到組成該多邊形快照的行。你已經知道相機矩陣的座標。現在你有一個多邊形在裏面,或者在另一個多邊形的外面/重疊。使用「多邊形多邊形」檢測算法又名掃描線算法來獲得您所需要的! –