2012-06-04 3 views
1

Я перемещаю спутник вокруг другого объекта в трехмерном пространстве, регулируя два угла поворота - вращение вокруг осей X и Y отслеживаемого объекта. Как рассчитать конечную позицию объектов с учетом этих углов и радиуса?Учитывая два угла поворота, как вычислить орбитальное положение?

Это прекрасно работает только поворот оси у:

position.x = otherObject.position.x + Math.cos(yRotation) * radius; 
position.y = otherObject.position.y; 
position.z = otherObject.position.z + Math.sin(yRotation) * radius; 

Но как только я пытаюсь включить вращение по оси X., все становится странно.

ответ

0

Мое решение заканчивал тем, что с помощью матрицы преобразования вычисленного из углов поворота, как таковой:

var mtx = new THREE.Matrix4(); 
mtx.rotateY(yRotation); 
mtx.rotateX(xRotation); 
var v = new THREE.Vector3(mtx.elements[8], mtx.elements[9], mtx.elements[10]); 
v.multiplyScalar(radius); 
2

Вы можете вращать что-то в 2D с помощью этих уравнений (см Wikipedia):

x' = x * cos(angle) - y * sin(angle) 
y' = x * sin(angle) + y * cos(angle) 

Вы можете использовать в основном то же уравнение для вращения вокруг осей х/у/г в 3D, например, для вращения о ось у:

x' = x * cos(angle) - z * sin(angle) 
y' = y 
z' = x * sin(angle) + z * cos(angle) 

Я думаю, что вы хотите сделать, это:

  • Поворот на yRotation вокруг оси у
  • Тогда вращение xRotation о оси х

Вы уже сделали поворот оси у. Так, начиная с (х, у, г) = (радиус, 0, 0), вы сделали:

x' = x * cos(angley) - z * sin(angley) = radius * cos(angley) 
y' = y = 0 
z' = x * sin(angley) + z * cos(angley) = radius * sin(angley) 

Мы просто должны применить уравнения снова вращаться вокруг оси х:

x'' = x' = radius * cos(angley) 
y'' = y' * cos(anglex) - z' * sin(anglex) = -radius * sin(angley) * sin(anglex) 
z'' = y' * sin(anglex) + z' * cos(anglex) = radius * sin(angley) * cos(anglex) 

Обратите внимание, что регулировка поворота оси y не обязательно приведет к вращению спутника вокруг оси y (например, если ваше вращение x составляет 90 градусов, то регулировка поворота y фактически будет вращаться вокруг оси z). Если вам не нравится это поведение, я бы предложил просто сохранить спутник (x, y, z) (относительно отслеживаемого объекта) и настроить его непосредственно (вы, вероятно, захотите повторно нормализовать после каждой настройки, чтобы обеспечить плавание точечная погрешность не приводит к выходу вашего спутника).

+0

Могу ли я понять вас исправить, если я думаю, что вы хотите сказать, что расчеты должны быть: position.x = otherObject.position.x + Math.cos (yRotation) * радиус; position.y = otherObject.position.y - Math.sin (yRotation) * Math.sin (xRotation); position.z = otherObject.position.z + Math.sin (yRotation) * Math.cos (xRotation) * радиус; ? Если это так, это тоже не работает. Я могу разместить полный код где-нибудь, если это поможет понять проблему. – korona

+0

Исправление: position.x = otherObject.position.x + Math.cos (yRotation) * radius; position.y = otherObject.position.y - Math.sin (yRotation) * Math.sin (xRotation) * радиус; position.z = otherObject.position.z + Math.sin (yRotation) * Math.cos (xRotation) * радиус; Все еще не работает ... – korona

+0

@ korona Да, это то, что я говорил.Я изо всех сил пытаюсь понять, почему это «не работает» - я считаю, что это по сути то же самое, что и решение, которое вы опубликовали, с несколькими незначительными отличиями: ваш начинается с (x, y, z) = (0, 0 , радиус), а не (радиус, 0, 0); ваш вращается по x сначала (вы делаете outv = RY * RX * inv); ваше вращение x находится в противоположном направлении. – dave