Я начинаю с 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, я хочу использовать некоторый нормализованный вектор и некоторые ... эээ ... вещи ... на местемодели ZRot, модели XRot и, в конечном итоге, модели 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 <Number>[
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 ().Я еще не понял ... пожалуйста, кто-нибудь, спасите меня от проб и ошибок!