有幾種跟蹤軌跡的方法。在這裏,除了解決方案之外,我還會向您展示一些您想要的行爲的替代方案。
解決方案A:馬克每一步
在你的應用程序Physijs,你應該有一個scene.simulate
呼叫和事件偵聽器時update has finished,這樣就可以通過物理環路分開渲染過程。它不應該太難加一點額外的代碼來代替一些標誌排序每一步到場景中,優選不含有太多額外的頂點(即不是太複雜):
var markSize = 2; // Tweak this to set marker size
var markGeom = new THREE.BoxGeometry(markSize, markSize, markSize, 1, 1, 1);
var markMat = new THREE.MeshBasicMaterial({color: "blue"});
scene.addEventListener("update", function(){
// Generate a box where projectile was last moved
var marker = new THREE.Mesh(markGeom.clone(), markMat);
marker.position.copy(projectile.position);
// Display position!
scene.add(marker);
// Keep simulation going
scene.simulate(undefined, 2);
});
在此代碼中,projectile
是引用您的彈丸Physijs網格的變量。請注意,您不應該爲您的渲染循環設置此格式,因爲您可能會使用,當窗口(或選項卡)離焦時,它會停止調用渲染循環。當某些客戶做到這一點並且弄亂了軌跡時,這並不令人愉快。另外,這直接綁定到你的Physijs步進,這使得它非常精確。
解決方案B:動態箭頭
這可能是你最想要的是什麼。它創建一個箭頭,它將顯示彈丸的方向和速度:
// Constructor: direction, origin, length, color in hexadecimal
var arrowMark = new THREE.ArrowHelper(
new THREE.Vector3(0, 1, 0), projectile.position, 0, 0x884400);
function drawDir(){
var pvel = projectile.getLinearVelocity();
// Update arrow
arrowMark.position.set(projectile.position);
arrowMark.setDirection(pvel.normalize());
arrowMark.setLength(pvel.length());
}
是的,那樣很容易。 projectile
再一次引用了你的彈丸Physijs網格。每撥打一次電話,只需致電drawDir
,您就可以輕鬆前往!
的THREE.ArrowHelper
文檔:https://threejs.org/docs/#Reference/Extras.Helpers/ArrowHelper
你需要證明你已經嘗試過的情況,並詢問具體的問題。 – WestLangley
要設置'mesh2'的位置,所有你需要做的是'mesh2.position.getPositionFromMatrix(projectile.matrixWorld);' – WestLangley
你想要什麼?爲什麼你需要第二個網格?試着去設置球的位置? – Ovilia