2013-01-10 26 views
10

Tôi mới sử dụng chương trình 3.js và 3d nói chung, do đó, điều này có vẻ như là một câu hỏi rất đơn giản. Lý tưởng nhất, tôi hy vọng câu trả lời có thể giúp tôi hiểu các nguyên tắc cơ bản.Three.js - Cách xoay một đối tượng để tìm kiếm một điểm và định hướng về một điểm khác và hướng tới một

Tôi có một đối tượng cần "trỏ" tại một điểm khác (nguồn gốc, trong trường hợp này, để đơn giản), có thể được thực hiện dễ dàng với chức năng Object3D.lookAt(point). Điều này chỉ trục Z của đối tượng tại điểm độc đáo.

Tôi cũng muốn xoay đối tượng của mình, được gọi là looker, xung quanh trục Z sao cho trục X của nó thường hướng tới đối tượng khác, refObj. Tôi biết rằng trục X không thể trỏ trực tiếp tại refObj trừ khi đối tượng đó xảy ra tạo thành một góc phù hợp với nguồn gốc. Tôi muốn trục X của looker nằm trên mặt phẳng được tạo ra bởi origin, refObjlooker, như diagramed dưới đây:

diagram of problem

Cách đơn giản làm vòng quay dường như là để sửa đổi looker.rotation.z, nhưng tôi không biết cách tính giá trị.

Nói chung, tôi muốn có phiên bản mở rộng của hàm lookAt có toạ độ thứ hai mà trục X sẽ được định hướng. Một cái gì đó như thế này:

function lookAtAndOrient(objectToAdjust, pointToLookAt, pointToOrientXTowards) 
{ 
    // First we look at the pointToLookAt 
    objectToAdjust.lookAt(pointToLookAt); 

    // Then we rotate the object 
    objectToAdjust.rotation.z = ??; 
} 

tôi đã tạo ra một jsFiddle with the example diagramed above

Trả lời

14

gì bạn đang thực sự nói là bạn muốn trục y của đối tượng (của đối tượng up -vector) là trực giao với mặt phẳng.

Tất cả những gì bạn phải làm là đặt đối tượng up của đối tượng trước khi gọi lookAt(origin).

Bạn tính toán vector mong muốn up bằng cách lấy một sản phẩm chéo của hai vectơ bạn biết nằm trong mặt phẳng.

Đây là một fiddle làm việc: http://jsfiddle.net/rQasN/43/

Lưu ý rằng có hai giải pháp cho vấn đề của bạn, vì cả hai vector tính và nó phủ sẽ trực giao với mặt phẳng.

EDIT: fiddle được cập nhật thành ba.js r.71

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