Создание класса Камеры (C#, TaoFramework)
В этом уроке вы научитесь создавать класс "камера".Для начала необходимо разобраться с командой библиотеки Glu - GluLookAt. В нашем случаи Glu.gluLookAt. Она принимает три набора аргументов, которые задают точку наблюдения, прицельную точку (точку, на которую направлена камера) и направление, которое следует считать верхним.
Рисунок 1. Аргументы для Glu.gluLookAt.
Пример:
Код:
|
Вроде бы все просто. Теперь создадим отдельный класс в нашем приложении - Camera. Сразу подключим пространства и создадим Vertex3D - структуру, где будут храниться координаты X, Y, Z векторов.
Код:
|
Объявим вектора которые будем использовать:
Код:
|
Далее мы создадим метод, который будет нам возвращать перпендикулярный вектор от трех переданных векторов. Два любых вектора образуют плоскость, от которой мы и ищем перпендикуляр. Это все нам понадобится для того, чтобы мы смогли реализовать Стрейф.
Код:
|
Далее создадим два метода который будут работать над векторами - Magnitude и Normalize.
Magnitude - возвращает величину вектора.
Код:
|
Normalize - возвращает нормализированный вектор, длинна которого равна единице, а это делает все рассчеты проще.
Код:
|
Итак, теперь начнем работать с глобальными методами, которые мы сможем вызвать. Для начала нам нужно установить позицию, взгляд и вертикальный вектор камеры, в этом нам поможет следующий метод:
Код:
|
Теперь дадим возможность крутить камеру вокруг своей оси, как при виде от первого лица. Передавая в метод переменную speed, будем управлять силой поворота, а также направлением. Если положительная переменная, то вправо, а отрицательная, как вы уже догадались, налево.
Код:
|
Перейдем к созданию вида от третьего лица. Чтобы реализовать вращение камеры, мы будем использовать axis-angle вращение.
Помните, что формулы для расчета вращения не очень просты, но занимают немного кода. Axis-angle вращение позволяет нам вращать точку в пространстве вокруг нужной оси. Это значит, что мы можем взять нашу точку взгляда (m_vView) и вращать вокруг нашей позиции. Чтобы лучше понять следующие рассчеты, советую вам посмотреть детальное описание:
Также это функция реализована, чтобы в переменную angle вы передавали угол в градусах.
Код:
|
Займемся перемещением камеры. В первую очередь, как вы поняли, нам нужна возможность перемещать камеру вперед и назад в зависимости от того, куда смотрит камера. Следующий метод позволит нам это делать.
Код:
|
Сразу напишем Стрейф:
Код:
|
Но для стрейфа нужно вычислять перпендикуляр каждый момент времени. Для этого напишем следующий метод:
Код:
|
Теперь добавим возможность камеры смотреть вверх и вниз.
Код:
|
Нужен метод, который будет обновлять взгляд и позицию камеры:
Код:
|
Итак, на всякий случай допишем методы, с помощью которых можно получать позиции в пространстве как и камеры, так и взгляда:
Код:
|
Ну вот и все. Класс написан и может быть использован.
Как же его применять?
Создадим новый проект. Объявим нужные нам библиотеки и пространства имен, добавим SimpleOpenGlControl и переименуем его в AnT. Также добавим Timer. Сразу объявим новый наш класс:
Код:
|
Напишем метод инициализации OpenGl:
Код:
|
В загрузку формы кинем нашу инициализацию:
Код:
|
Также напишем метод рисования:
Код:
|
Метод рисования Сетки:
Код:
|
Напишем метод, который будет считывать мышку:
Код:
|
И конечно нам надо обработать мышку, вот и сам метод:
Код:
|
И дописываем в таймер.
Код:
|
Вот и все. На данном примере мы сделали возможность перемещаться по сцене, как в редакторе моделей 3D Studio Max. Этот метод можно использовать и в играх (стратегиях).