2013-05-01 11 views
11

У меня проблема. В Three.js я хочу повернуть сферу (Землю) вокруг оси, наклонной на 23,5 град. Я нашел сферу .rotation.x, sphere.rotation.y и sphere.rotation.z, но когда я совмещаю их в правильном соотношении, вращение сферы довольно странно - у него нет постоянной оси вращения. Я думаю, мне нужна функция, например sphere.rotation.vector (1,0, -1). Кто-нибудь знает, как эта функция вызывается и как выглядит правильный синтаксис?Three.js - Вращение сферы вокруг определенной оси

Большое спасибо за ответы!

ответ

17

Для этого вам необходимо использовать quaternions. This video объясняет, что такое кватернионы и как они используются в 3D-графике.

Вы можете построить кватернион так:

quaternion = new THREE.Quaternion().setFromAxisAngle(axisOfRotation, angleOfRotation); 

Затем вы примените его к объекту с помощью:

object.rotation.setEulerFromQuaternion(quaternion); 

Вы также можете достичь этого с помощью иерархии объектов. Например, вы можете создать экземпляр Object3D() и направить его на 23,5 град, затем создать сферу (Земля) и добавить ее к наклонному объекту. Сфера затем повернется вокруг наклонной оси Y. Кватернионы, однако, являются лучшим инструментом для решения этого.

+0

большое спасибо! он хорошо работает :) – karlosss

+5

Так как трижды r59 'setEulerFromQuaternion()' был удален (см. https://github.com/mrdoob/three.js/wiki/Migration#r58--r59). Вторая строка должна быть следующей: 'object.rotation = new THREE.Euler(). SetFromQuaternion (quaternion);' – kontur

19

Вам не нужно понимать, как углы Эйлера или кватернионы работают над тем, что вы хотите. Вы можете использовать

Object3D.rotateOnAxis(axis, angle); 

Убедитесь axis единичный вектор (имеет длину 1), и angle в радианах.

Object3D.rotateOnAxis(axis, angle) Вращается вокруг оси в пространстве объекта.

Three.js R.67

+0

Благодарим вас за помощь, но я новичок в three.js, и я пока не могу использовать Object3D ... Я считаю, что он работает хорошо, но я использовал кватернионы. – karlosss

+0

@karlosss Object3D - это базовый класс, из которого сходят многие объекты в Three.js. Если ваш объект имеет атрибут вращения, то он, вероятно, является подклассом Object3D. – Joel

+0

ось имеет длину 3. –

0
var quaternion = new THREE.Quaternion(); 
var object = scene.getObjectByName('xxx'); 
function render(){ 
    quaternion.setFromAxisAngle(new THREE.Vector3(0, 1, 0).normalize(), 0.005); 
    object.position.applyQuaternion(quaternion); 
} 

Three.js версии 86 см full example on codepen.

+1

Сколько раз в секунду вы создаете «Quaternion», «Vector3'» и «Euler»? Вместо этого создайте один экземпляр кватерниона вне цикла визуализации. В цикле рендеринга выполните следующее: 'planet.position.applyQuaternion (quaternion);' Также вызовите scene.getObjectByName() один раз за пределами цикла. – WestLangley

+0

Хорошее предложение. Легко выразить, как вращать вокруг любой оси, используя приведенный выше код. Теперь я оптимизирую его в [полный пример] (https://codepen.io/luics/pen/GEbOYO). – luics

+0

Да ладно. Ты не последовал моему предложению. Установите «quaternion» один раз вне цикла рендеринга. Удалите 'euler'. Вместо этого вызовите 'applyQuaternion()'. – WestLangley

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