2014-08-08 29 views
6

Tôi đang tìm cách tìm ma trận xoay giữa hai vectơ được xác định trong THREE.js.Cách tìm ma trận xoay giữa hai vectơ trong THREE.js

Ví dụ

v1 = new THREE.Vector3(1, 1, 1) v2 = new THREE.Vector3(1, 1, -1)

Tôi cần ma trận xoay này để xoay toàn bộ đối tượng trong bước tiếp theo.

+1

Đó là một tổ chức phi SO câu hỏi, btw nhìn đây http://gamedev.stackexchange.com/questions/20097/how- đến-tính-một-3x3-rotation-matrix-from-2-direction-vectơ –

+0

và đây là tài liệu vector3 http://threejs.org/docs/#Reference/Math/Vector3 –

+0

Câu hỏi này dường như là tắt- chủ đề vì nó là về http://math.stackexchange.com/ –

Trả lời

14

Bạn có thể định nghĩa một vòng quay từ hai vectơ đơn vị chiều dài v1v2 như vậy:

var quaternion = new THREE.Quaternion(); // create one and reuse it 

quaternion.setFromUnitVectors(v1, v2); 

Trong trường hợp của bạn, bạn cần phải bình thường hóa vectơ của bạn đầu tiên.

Sau đó bạn có thể áp dụng được luân chuyển đến một đối tượng sử dụng mẫu sau:

var matrix = new THREE.Matrix4(); // create one and reuse it 

matrix.makeRotationFromQuaternion(quaternion); 

object.applyMatrix(matrix); 

Ngoài ra, nếu bạn không yêu cầu các ma trận, bạn có thể chỉ áp dụng các quaternion trực tiếp:

object.applyQuaternion(quaternion); 

ba.js r.86

+0

Xin chào. Cảm ơn, điều này dường như làm việc. Sẽ là tuyệt vời để có giải pháp này mà không có sự phụ thuộc Quaternion, mặc dù. – kriskodzi

+3

ba.js là dựa trên quaternion. Nhưng nếu bạn nhấn mạnh, bình thường hóa bạn vectơ trước và đặt 'axis.cross (v1, v2); angle = v1.angleTo (v2); matrix.makeRotationAxis (trục, góc); object.applyMatrix (ma trận); ' – WestLangley

+0

Vâng, đây chính xác là những gì tôi đang tìm kiếm. Tôi nghĩ rằng bạn có thể thêm điều này vào câu trả lời của bạn, sau đó tôi sẽ đánh dấu nó là chấp nhận. – kriskodzi

1

Tôi không sử dụng quaternions thay vào đó tôi sẽ làm như thế này (không sử dụng THREE.js.):

.210

xây dựng 4x4 chuyển đổi ma trận cho V1 vector đầu tiên (V1, V2 đặt trên mặt phẳng XY và V1 là trục X)

double V1[3],V2[3]; // input 
double X[3],Y[3],Z[3],P[3]; // output 
double m[16]; // OpenGL like transform matrix 
X = V1; 
Z = V1 x V2; 
Y = X x Z; 
X/=|X|; 
Y/=|Y|; 
Z/=|Z|; 
P = (0,0,0); 
m[ 0]=X[0]; 
m[ 1]=X[1]; 
m[ 2]=X[2]; 
m[ 3]=0; 
m[ 4]=Y[0]; 
m[ 5]=Y[1]; 
m[ 6]=Y[2]; 
m[ 7]=0; 
m[ 8]=Z[0]; 
m[ 9]=Z[1]; 
m[10]=Z[2]; 
m[11]=0; 
m[12]=P[0]; 
m[13]=P[1]; 
m[14]=P[2]; 
m[15]=1; 

bây giờ áp dụng luân chuyển ma trận xung quanh trục Z vào nó

double angle = acos((V1.v2)/(|V1|.|V2|)) 
  • xoay quanh trục Z theo góc +/-
  • ký hiệu góc phụ thuộc vào toán hạng sản phẩm chéo trục Y thứ tự
  • không chắc chắn ngay bây giờ đầu nhưng bạn sẽ thấy
  • nếu bạn đặt nó sai V2 sẽ đứng về phía đối diện
+0

Xin chào, cảm ơn mẹo của bạn, tôi chỉ kiểm tra nó. Bạn thực sự có ý nghĩa gì bởi ma trận biến đổi _apply xoay quanh trục Z trên it_.Bạn muốn tôi áp dụng ma trận cho đối tượng và sau đó xoay nó xung quanh Z, vì vậy chúng tôi sẽ phải áp dụng 2 phép quay? – kriskodzi

+1

@RecRoot m [] chứa ma trận chuyển đổi đại diện cho hệ tọa độ V1. bạn phải nhân ma trận m với ma trận xoay (xung quanh Z theo góc) để quay hệ tọa độ từ V1 sang V2. Nó không quan trọng nếu bạn áp dụng đối tượng * m * rotz hoặc M = m * rotz và sau đó obj * M khác biệt duy nhất là khi bạn tạo M thì bạn có ít hoạt động hơn (chỉ một lần nhân ma trận bởi ma trận không cho mọi đỉnh của đối tượng. ..) bạn có thể google như thế nào ma trận chuyển đổi cho xoay quanh Z trông giống như (nó là cơ bản và tôi nghĩ rằng khuôn khổ của bạn nó có nguyên bản trong một số chức năng) – Spektre

+0

@RecRoot btw nhìn ở đây: http://stackoverflow.com/a/25216549/ 2521214 để biết thêm thông tin về thành phần ma trận biến đổi. – Spektre

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