2012-05-04 31 views
8

vì vậy tôi đang thử nghiệm bằng cách sử dụng tweens để twov của một máy ảnh fov dựa trên một đối tượng được nhấp vào trong cảnh, mà là làm việc tuyệt vời, nhưng bây giờ những gì tôi muốn làm là để máy ảnh chuyển tiêu điểm của nó sang đối tượng được nhấp vào, điều này không hoạt động. Dưới đây là mã của tôi cho các nhấp chuột:three.js - làm thế nào để làm cho máy ảnh nhìn vào một đối tượng trong một tw232

function onDocumentMouseDown(event) { 
    event.preventDefault(); 

    var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, - (event.clientY/window.innerHeight) * 2 + 1, 0.5); 
    var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize()); 
    var intersects = ray.intersectObjects(objects); 
    if (intersects.length > 0) { //We've clicked a certain object 

     camTarget = intersects[0].object.position; //HERE'S THE VECTOR3 I WANT TO LOOK AT 
     camTween.start(); 
    } 
} 

và mã của tôi cho phong trào tween/camera:

var camUpdate = function(){ 
    camera.fov = currentFov.fov; //WORKING 
    camera.lookAt(camTarget); //NOT WORKING 
    camera.updateProjectionMatrix(); 
} 

var currentFov = { fov: camera.fov }; 

TWEEN.removeAll(); 
camTween = new TWEEN.Tween(currentFov).to({fov: +zoomInFov},tweenTime).easing(camEase).onUpdate(camUpdate); 

Máy ảnh này được Tweening trường nhìn đúng, nhưng nó xuất hiện để duy trì chỉ trong cùng một hướng nó luôn được chỉ ra, thay vì chuyển sang vectơ "camTarget" được chỉ định trong lệnh lookAt.

Trả lời

12

Trình kết xuất gọi THREE.Camera.update(), thiết lập chế độ xoay của máy ảnh theo mặc định để xem xét THREE.Camera.target (là một THREE.Object3D). Thay vì làm ...

camera.lookAt(camTarget); 

... cố gắng ...

camera.target.position.copy(camTarget); 

Tôi không chắc tôi làm theo cách camTarget được bởi lệnh Tween, hoặc có thể nó chỉ nên chuyển sang đối tượng mới?

Lưu ý phụ: không nên thực hiện tính toán nặng trong trình xử lý sự kiện - trong các thế giới tốt nhất, bạn đặt cờ trong trình xử lý sự kiện và quy trình trong vòng kết xuất.

+0

Ah - vâng, vấn đề khiến nó nhìn vào vị trí thích hợp là tôi đặt nó vào bộ xử lý sự kiện chứ không phải vòng lặp animate. Tôi đã có thể sử dụng lookAt() và không copy(). Nice bắt. Theo như nó sẽ được tweened, tôi không chắc chắn. Tôi nghĩ rằng bằng cách đặt nó vào một chức năng animate, khi máy ảnh di chuyển fov của nó, chức năng lookAt cũng sẽ thay đổi động, làm cho nó trông, theo nghĩa nào đó, như thể nó đã được tweening. Tôi cho rằng tôi có thể phải di chuyển máy ảnh thay vì thay đổi fov để làm việc. Cảm ơn một lần nữa mặc dù. – mheavers

+0

Vui vì bạn đã làm việc đó :) – MikaelEmtinger

+0

@MikaelEmtinger - tại sao bạn không nên làm quá nhiều trong xử lý sự kiện? – Neil

Các vấn đề liên quan