0
我使用Three.js和PointerLockControls.js。我想給我的相機添加一個容易理解的邊界框。我想開發一種場景,當我離開或碰撞某個物體時(當相機與它碰撞時),我希望能夠檢測到它,並以某種方式處理碰撞。我的第一個想法是創建一個新的網格物體,給它一個透明的材質,並將其移動到與我使用相機相同的方式,但這不起作用,因爲一段時間後,我的網格物體將開始向不同於我的方向移動相機出於某種原因(在下面的代碼中,這個相機盒是紅色的)。 這是我創造的攝像頭和網格的方式:如何將邊界框附加到相機?
var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
controls = new THREE.PointerLockControls(camera);
scene.add(controls.getObject());
controls.getObject().position.set(20, 30, 20);
var cameraBox = new THREE.Mesh(
new THREE.BoxGeometry(20, 30, 20),
new THREE.MeshBasicMaterial({color: 0xff0000})
);
cameraBox.position.set(20, 30, 20);
scene.add(cameraBox);
這是我的渲染功能:
function render() {
var delta = clock.getDelta();
if (controlsEnabled) {
velocity.x -= velocity.x * 10.0 * delta;
velocity.z -= velocity.z * 10.0 * delta;
velocity.y -= 9.8 * 100.0 * delta; // 100.0 = mass
if (moveForward) velocity.z -= 200.0 * delta;
if (moveBackward) velocity.z += 200.0 * delta;
if (moveLeft) velocity.x -= 200.0 * delta;
if (moveRight) velocity.x += 200.0 * delta;
controls.getObject().translateX(velocity.x * delta);
controls.getObject().translateY(velocity.y * delta);
controls.getObject().translateZ(velocity.z * delta);
cameraBox.translateX(velocity.x * delta);
cameraBox.translateY(velocity.y * delta);
cameraBox.translateZ(velocity.z * delta);
if (controls.getObject().position.y < 30) {
velocity.y = 0;
controls.getObject().position.y = 30;
canJump = true;
}
if (cameraBox.position.y < 30) {
velocity.y = 0;
cameraBox.position.y = 30;
canJump = true;
}
}
requestAnimationFrame(render);
webGLRenderer.render(scene, camera);
}
我寫我自己的方法來獲取對象的(而網格的)邊界框,因爲我發現computeBoundingBox()方法相當混亂。看來它不會考慮Mesh目前的位置。我使用Mesh的geometry屬性傳遞尺寸對象。
function getBoundingBox(position, dimensions) {
return {
minX: position.x,
maxX: position.x + dimensions.width,
minY: position.y,
maxY: position.y + dimensions.height,
minZ: position.z,
maxZ: position.z + dimensions.depth
};
}
其他想法,我必須是使用controls.getObject()的位置座標,這將使我的相機的位置(?),但這些座標是,再次,怪異,似乎不相同就好像我得到了Mesh的位置。提前致謝!