![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сферические координаты в OpenGL [Delphi, Windows]
istemy © (2004-05-18 17:27:00)Подскажите, пожалуйста, как можно использовать сферические координаты для поворота головы героя, примерно как в Quake. Не могу создать модель движения героя по сцене. И как достичь плавности движения. Если сможете пришлите исходники на мое мыло. Заранее благодарен.
Черный ферзь (2004-05-21 22:30:00) [1]знаю! широта и долгота не катят в понастоящему трехмерной игре..
Murkt (2004-05-20 19:18:00) [2][4]
Из третьей кваки.
NailMan (2004-05-20 12:47:00) [3]Да игрушку какую-нить распотроши.
---
WBR, NailMan aka 2:5020/3337.13
istemy (2004-05-20 12:03:00) [4]А где можно достать текстуру для стен зданий и неба, земли и тд?
NailMan (2004-05-20 09:41:00) [5]Черный ферзь
Ты хоть знаешь что это тако и для чего используются?
---
WBR, NailMan aka 2:5020/3337.13
Черный ферзь (2004-05-20 00:30:00) [6]эти,как их там? кватернионы используй!
NailMan (2004-05-18 18:27:00) [7]нууу это очень просто:
- условно считаем что координаты переносицы есть начало координат(локальные).
- камера у нас юзается с "конечной длиной прицела", т.е. имеется сама камера(EYE), ее точка прицеливания(TARGET) и длина(радиус сферы) между этими точками. Вобщем как в 3DSMax
(длина у нас может быть любой, так как она все равно будет в итоге единичной)
- в каждый момент времени ты имеешь 2 величины(радиус считаем постоянным):
угол по горизонтали(долгота) и угол по вертикали(широта).
Процесс задания координат точки прицеливания(ориентация взора игрока):
- Получаем координаты точки Target по уравнению сферических координат(какие я думаю объяснять не стоит) на известных в текущий момент времени Alpha(долгота), Phi(широта) и радиуса.
- Имея 2 точки EYE(0,0,0) и полученный TARGET(X,Y,Z) мы превращаем их в вектор направления, который будет вектором направления взгляда игрока(ессно нормализовав его).
Т.о. зная вектор направления и зная мировые координаты точки EYE(фактически это мировые координаты игрока на карте) ты можешь задать их камере.
Для плавности движения тебе надо приблизительно сделать так:
- Принять определенную угловую скорость(или ускорения) перемещения камеры вдоль обоих углов в секунду. Соответсвенно каждое изменение этих углов может происходить в определенный квант времени - скажем 50 раз в сек.
- Для определения величины изменения углов ты делаешь линейную интерполяцию каждого угла с нужным числом шагов(50), получаешь промежуточное(фактически конечное) значение угла. Его собсно прибавляешь/убавляешь к каждому углу в соотвествии с данными устройства ввода(+ или -). Фактически это будет твоя угловая скорость.
Для обеспечения заданной скорости вращения на любой тачке, тебе придется сделать простой синхронизатор. Т.е. замерять время пройденное с прошлого изменения углов(тика) и делить его на теоретическое время этого промежутка.
Получишь т.н. коэффициент поправки. Его надо помножать(оно будет <=1) на полученное после интерполяции значение изменения углов, т.о. на слабой тачанке будет тормоз-"пропуск тиков", а на хорошей тачке гладко.
Можно вычисление смещений производить не жестко заданных в тиках, а прямо в игровом цикле, точно также замеряя время(оно будет очень маленьким), но это пагубно может сказаться на общей производительности. Естественно ни о каких GetTickCount для получения счетчика не может быть и речи.
В общих слова так.
По части полного кода помочь не смогу, т.к. я D3D-фил. Могу только по части синхронизатора помочь с реализацией.
---
WBR, NailMan aka 2:5020/3337.13