Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Исключительно математический вопрос (http://www.flasher.ru/forum/showthread.php?t=182725)

Jitakuzu 01.08.2012 14:58

Исключительно математический вопрос
 
Всем доброго времени суток!

Вопрос в следующем: как сделать так, чтобы объект в пространстве (3D) постоянно смотрел на камеру, но только одной стороной. То есть, в точке А есть плоский объект и есть камера в точке В. Если плоский объект расположен вдоль оси Х, то все легко:

Код AS3:

var angleX:Number = Math.atan2(_object.z - _camera.z, _object.y - _camera.y) * 180 / Math.PI;
_object.rotationX = angleX;

Все работает: перемещая камеру по по плоскости YZ, плоский объект "лицом" смотрит на камеру, но смещаясь по другим плоскостям (XY и XZ), плоский объект остается на месте.

Но нужно сделать так, чтобы это работало вне зависимости от того, как расположен плоский объект. То есть, он может быть расположен не четко вдоль оси Х.

Как я понимаю, тут нужно проделать аналогичные манипуляции с другими углами, но в связи с отсутствием каких либо знаний в тригонометрии, я не могу до этого додуматься.

expl 01.08.2012 15:49

Тут не столько тригонометрия, сколько линейная алгебра/аналитическая геометрия и кватернионы (если использовать только матрицы без кватернионов некоторые операции с углами будут проблематичны)
Если я правильно понял задачу (мутно написано, рисунок нужен):
- провести вектор из плоского объекта в камеру
- найти минимальный угол между нормалью к плоскому объекту этим вектором
- повернуть объект вокруг оси, перпендикулярной обоим этим векторам на этот угол
Теорию читать на gamedev.ru

Jitakuzu 01.08.2012 16:09

ну вроде бы правильно понял, только, наверное, "между нормалью к плоскому объекту И этим вектором".
Проблема в том, как найти эту самую ось, перпендикулярную этим векторам. Ведь эта плоскость явно не совпадет с X, Y или Z. На теорию времени нет... =)

Насчет нормали к плоскости, так она определяется?
Код AS3:

//object - плоский объект
var normal:Vector3D = new Vector3D( -object.y, object.x, object.z );


expl 01.08.2012 16:59

Цитата:

Проблема в том, как найти эту самую ось
Это как раз не проблема - находится _векторным_ перемножением этих 2-х векторов.
А вот повернуть вокруг произвольной оси - это уже веселее. Но можно алгоритм найти на том же gamedev.ru. Единственное, там 2 способа - с помощью матриц и кватернионов - нужно использовать, тот, который с кватернионами.

Цитата:

Насчет нормали к плоскости, так она определяется?
Выбираем 2 любых (непараллелльных) вектора на плоскости, перемножаем их векторно, нормализуем вектор, чтобы длинны 1 был
(направление нормали будет зависеть от порядка перемножения векторов)
Вам же нужно чтобы эта нормаль на камеру смотрела?


Часовой пояс GMT +4, время: 08:09.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.