Как вы комбинируете повороты по осям X, Y и Z в локальном пространстве модели (не глобальном)?

Я начинаю работать с Molehill, и у меня много проблем с пониманием Matrix3D. Моя первая проблема - как управлять Matrix3D, описывающим ориентацию одной модели.

Для этого я использую Matrix3D.appendRotation (). Но в зависимости от порядка, в котором я добавляю, я получаю другой результат (очевидно, поскольку я вращаюсь по одному в глобальном пространстве). Я знаю, что это обычная проблема, я столкнулся с ней с 3d программное моделирование. Но на этот раз мне нужно исправить это программно. Здесь мне нужна помощь.

Во-первых, на случай путаницы, вот проблема с изображениями:

Шаг 1: Я визуализирую модель.

Start position

Шаг 2а: Я вращаю его по оси X. Выглядит правильно!

X-axis rotation

Шаг 2b: Я вращаю его по оси Z. Выглядит правильно!

Z-axis rotation

Итак ... если я вращаюсь по осям X и Z модели, я хочу это:

desired XZ rotation

Но, грустно, я получаю следующее:

enter image description here

Я могу увидеть эта проблема. Я добавляю вращения по одному в глобальном пространстве. Мне нужно вращаться в локальном пространстве объекта. Я не знаю, как это сделать и что мне нужно искать (терминология и т. Д.). Код прост (и неверен):

modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);

Я предполагаю, что вместо использования констант оси Vector3D я хочу использовать некоторый нормализованный вектор и кое-что ... вместо modelZRot, modelXRot и в итоге модель YRot.Может ли кто-нибудь сказать мне, какое наилучшее решение для применения желаемого типа ротации, описанного выше?

ОБНОВЛЕНИЕ: потратив день на изучение «книг» (также известный как KhanAcademy на YouTube) и начав эту презентацию здесь: Математика трехмерной матрицы вращения Я наткнулся на своего рода метод «взгляда на», который очень близок к моему желаемому решению. К сожалению, я это понимаю только на 50%. Я все еще надеюсь, что кто-то сможет пролить свет на эту тему!

var angleOfRotation:Number = Math.PI / 2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at... 
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;

//Graphics Gems (Glassner, Academic Press, 1990). 
modelLocalMatrix = new Matrix3D(new [
  t * (x * x) + c,   t * x * y - s * z,   t * x * z + s * y,   0, 
  t * x * y + s * z,   t * (y * y) + c,   t * y * z - s * x,   0, 
  t * x * z - s * y,   t * y * z + s * x,   t * (z * z) + c,   0, 
  0,           0,           0,           1
]);

Дело в том, что это кажется довольно неуклюжим. Тем более, что угол поворота для Vector3D должен быть четвертым (w) значением. Что еще более важно, в Matrix3D уже есть метод lookAt (). Я еще не понял ... пожалуйста, спасите меня от часов проб и ошибок!

8
задан jpwrunyan 11 April 2012 в 02:29
поделиться