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