2014-12-08 4 views
1

Я хочу повернуть цилиндр в определенном топе, сделанном двумя точками p1 и p2. Я создаю цилиндр с высотой l, равным расстоянию между двумя точками, и поставлю его посередине этого топора.three.js вращает объект по направлению оси

var xd = p2.x - p1.x, 
yd = p2.y - p1.y, 
zd = p2.z - p1.z, 
l = Math.sqrt(xd*xd + yd*yd + zd*zd); 
var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(5, 5, l, 32), new THREE.MeshBasicMaterial({color: "#ffffff"})); 
cylinder.position.set(p1.x+xd/2, p1.y+yd/2, p1.z+zd/2); 

Я использую setFromUnitVectors, чтобы получить матрицу rotaion необходимую между двумя точками и применить его к матрице вращения цилиндра

var quaternion = new THREE.Quaternion(); 
quaternion.setFromUnitVectors(new THREE.Vector3(p1.x,p1.y,p1.z).normalize(),new THREE.Vector3(p2.x,p2.y,p2.z).normalize()); 
cylinder.rotation.setFromQuaternion(quaternion); 

Я не вижу, что это неправильно, или, может быть, есть другой способ сделай это?

ответ

0

Другой способ сделать это - просто сделать цилиндр LookAt(p2), если p2 - вектор.

+0

Отлично работает! – alex

Смежные вопросы