2016-05-06 13 views
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()メソッドがむしろ混乱しているのを発見しました。メッシュの現在の位置を考慮しないようです。私はメッシュのジオメトリプロパティの助けを借りて次元オブジェクトを渡します。

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を(使用することです)。位置は(?)私にカメラの位置を与えることになる座標が、それらの座標は、再び、奇妙であり、同じように見えるしていません私はメッシュの位置を取得するかのように。前もって感謝します!あなたはobjectからバウンディングボックスを作成し、このようなカメラとの衝突を検出することができ

答えて

0

:カメラがバウンディングボックスと交差する場合

var boundingBox = new THREE.Box3().fromObject(object); 
var collision = boundingBox.containsPoint(camera.position); 

衝突がtrueです。

関連する問題