Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.02.2011, 21:09
gr_crd вне форума Посмотреть профиль Отправить личное сообщение для gr_crd Посетить домашнюю страницу gr_crd Найти все сообщения от gr_crd
  № 1  
Ответить с цитированием
gr_crd
 
Аватар для gr_crd

Регистрация: Mar 2009
Адрес: Kazakhstan, Almaty
Сообщений: 121
Question Реализация метода камеры — lookAt(x,y,z)

Потребовалось реализовать метод lookAt для камеры.
В данный момент управление камерой (поворот) осуществляется
с помощью установки значений свойств rotationX, rotationY, rotationZ

Такое управление камерой не очень удобно, хочется научить камеру
'смотреть' в определенную точку.

т.е. требуется следующее:
Код AS3:
/**
* 
* @param	px 		координата точки по X
* @param	py		координата точки по Y
* @param	pz		координата точки по Z
*/
public function lookAt(px:Number,py:Number,pz:Number):void
{
	// требуется получить значения поворота по осям X,Y,Z
	resultRotation:V3d; // 
 
	resultRotation.x=rx;
	resultRotation.y=ry;
	resultRotation.z=rz;
	//
}
После прочтения соответствующей литературы картина прояснилась,
но на одном этапе осталась загвоздка.

Вот об этом подробнее.

Шаг 1

Камера расположена в точке (0,0,0)
Есть три вектора. Up, Forward, Right.

Forward - куда камера 'смотрит' в данный момент
Up - вектор, направленный вверх от камеры.
Right - вектор, направленный вправо.

В данный момент они совпадают с осями X,Y,Z

Далее, вызываем метод lookAt() , передаем позицию точки Target
Target - точка, на которую должна 'посмотреть' камера.

Результатом вычислений метода должны стать значения поворота
по осям X, Y, Z



Шаг 2

Для начала выполним поворот в плоскости ZX вокруг оси Y
В этом шаге такой поворот эквивалентен повороту в 2D

для этого определяю вектор Target2d, затем нормализую.
Насколько я помню, скалярное произведение ( Dot Product )
Fwd и NormalizedTarget2D даст угол между ними.
Это угол a.



Шаг 3

Собственно, сам поворот вокруг Y на угол a
Поворот применяется к Right и Forward и мы получаем значение rotationY
( Forward можно не поворачивать а Forward = NormalizedTraget2D, в принципе результат будет аналогичен )

т.е. в данный момент камера уже смотрит на Target2d (7,0,6);



Шаг 4

Ок, теперь шаг, на котором и возник вопрос.

Нахожу также NormalizedTarget, далее произведение Fwd,NormalizedTarget
Получаю угол b.

Далее необходимо выполнить поворот вокруг вектора Right на угол b

Зная угол поворота по b вокруг Right, мне нужно узнать
угол поворота вокруг осей X и Z.
Проще говоря, получить значения rotationX, rotationZ.



вот такой требуется результат



основной вопрос:

Зная угол поворота по b вокруг Right, мне нужно узнать
угол поворота вокруг осей X и Z.
Проще говоря, получить значения rotationX, rotationZ.


Думал насчет вращения Fwd вокруг Right, но непонятно, значит ли это,
что матрицу вращения по Y нужно умножить на матрицу вращения вокруг Right...
опять же, матрица вращения вокруг Right неизвестна...
__________________
заткнись и делай

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
3d , camera , lookat , камера
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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