2013-11-01 5 views
2

У меня есть 2 объекта сетки. Якорь и Род. Анкер вращается вокруг оси z, как показано на рисунке. Предполагается, что стержень движется только назад и вперед. Вот изображение: http://imageshack.us/photo/my-images/841/7a83.png/.Три js 3D-поворот

Но я застрял в попытке выяснить матричный расчет. Например, если якорь вращается на 45 градусов, поэтому он обращен к оси х, как я могу заставить стержень все еще двигаться назад и вперед?

+0

Вы используете gl-matrix.js? –

ответ

3

Для вращения вокруг оси Z:

var rotation = new THREE.Matrix4().makeRotationZ(Math.PI/2); 

для перевода, где г вашей дельта:

var translation = new THREE.Matrix4().makeTranslation(0, 0, z); 

Вы можете объединить два преобразования в начале с переводом:

var transform = new THREE.Matrix4(). MakeTranslation (0, 0, z) .makeRotationZ (Math.PI/2);

var transformation = rotation.multiply(translation); 

Затем применить преобразование к вашей геометрии:

geometry.applyMatrix(transformation); 
+0

Я совершенно новичок в Three.js, поэтому я не знаю, чего я здесь не вижу. Я получил поворот вокруг оси z, чтобы работать, но до сих пор не могу понять, как заставить «стержень» двигаться назад и вперед, когда направление меняется. Я не могу сделать это с помощью makerotationX, потому что он не всегда вращается вокруг оси x, если вы знаете, что я имею в виду. – wuahi

+0

Ваше преобразование - это поворот вокруг z с вращением вокруг X, поэтому объедините их, умножив матрицы: var rotationZ = new THREE.Matrix4(). MakeRotationZ (angleZ); var rotationX = новый THREE.Matrix4(). makeRotationX (angleX); var transform = rotationZ.multiply (rotationX); – Troopers

+0

Это работает, но проблема в том, что объект должен двигаться, и применение матрицы вращает его вокруг миров. поэтому, когда он перемещается, вращение становится больше и больше. Я не уверен, как привязать ротацию к одному блоку собственного происхождения. – wuahi

4

Подобно тому, как scooby37 заметил, сочетание пример обеспечивается Troopers не является действительным. Вы должны НЕ:

new THREE.Matrix4().makeTranslation(0, 0, z).makeRotationZ(Math.PI/2); 

Вместо вы можете попробовать что-то вроде:

let rotation = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0, 1, 0), Math.PI/6.0); 
let transformation = new THREE.Matrix4().makeTranslation(0, this.height, 0); 
this.mesh.applyMatrix(rotation.multiply(transformation)); 

которые внедряют умножение матриц - обычный способ преобразования должны быть объединены.