Я начинаю работать с Molehill, и у меня много проблем с пониманием Matrix3D. Моя первая проблема - как управлять Matrix3D, описывающим ориентацию одной модели.
Для этого я использую Matrix3D.appendRotation (). Но в зависимости от порядка, в котором я добавляю, я получаю другой результат (очевидно, поскольку я вращаюсь по одному в глобальном пространстве). Я знаю, что это обычная проблема, я столкнулся с ней с 3d программное моделирование. Но на этот раз мне нужно исправить это программно. Здесь мне нужна помощь.
Во-первых, на случай путаницы, вот проблема с изображениями:
Шаг 1: Я визуализирую модель.
Шаг 2а: Я вращаю его по оси X. Выглядит правильно!
Шаг 2b: Я вращаю его по оси Z. Выглядит правильно!
Итак ... если я вращаюсь по осям X и Z модели, я хочу это:
Но, грустно, я получаю следующее:
Я могу увидеть эта проблема. Я добавляю вращения по одному в глобальном пространстве. Мне нужно вращаться в локальном пространстве объекта. Я не знаю, как это сделать и что мне нужно искать (терминология и т. Д.). Код прост (и неверен):
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 (). Я еще не понял ... пожалуйста, спасите меня от часов проб и ошибок!