Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Общая теория "отрисовки" игр


Автор: Coocky 1.8.2006, 10:24
Фуф.
Тяжело переходить от программирования в ответ на события системы к программированию игр.
Че-то я никак в толк не возьму smile 
Может кто-то обьяснить или дать ссылку-как происходит это игроделанье? smile 
Проблема вот в чем-я никак не могу уложить в голове -как можно всю более менее нормальную игру уложить в одну отрисовку в главном окне? smile 
Ну вот к примеру, есть сценку с чем-то летающим прыгающим. Это понятно. Можно рисовать обьекты, и взависимости от действий пользователя либо по времени просто менять координаты, на которых основывается данная сценка.
Но вот как быть в играх. Ведь сценка все равно циклична, рано или поздно. А вот игра ж-она прямолинейна?
Вот непонятна ситуация. Допустим есть отрисованая территория (ландшафт). Я иду по ней. И в определеном месте я должен встретится с кем -то. Неужели нужно постояно в основной отрисовке ловить if ( ) внутри которого зашита отрисовка персонажа №2 ? А если потом нужно с ним взаимодействовать? Как прервать времено основную отрисовку персонажа №1 (которая должна была быть, по идее. если б я не встретил №2)? Бред..

Ну я думаю меня поняли smile  Поняли то, чего я не могу понять smile 

Автор: arilou 1.8.2006, 11:21
Для игр можно применить вариацию MVC подхода, как и для обычного приложения. А рендеринг перенести в Application.Idle (ну на каждой платформе это называется по-своему, но смысл думаю ясен).

Мир разделяется на зоны (локации), и обновление происходит только в рамках текущей локации. Умный рендерер перерисовывает только видимые объекты используя вариации на тему BSP или Octree. Т.е. фактически локация живет своей жизнью, а на экране отображается только видимая часть.


Автор: Coocky 1.8.2006, 13:18
arilou, 
Цитата(arilou @  1.8.2006,  11:21 Найти цитируемый пост)
Для игр можно применить вариацию MVC  подхода, как и для обычного приложения


Цитата(arilou @  1.8.2006,  11:21 Найти цитируемый пост)
 Умный рендерер перерисовывает только видимые объекты используя вариации на тему BSP  или Octree.

 smile 
Ударил два раза.. В пах.. smile 
Откуда ж мне знать все эти термины smile 

Цитата(arilou @  1.8.2006,  11:21 Найти цитируемый пост)
А рендеринг перенести в Application.Idle 

Ну это я понял, весь просчет делать во время простоя приложения (когда очередь сообщения пуста.)
Ну уж очень я сомневаюсь, что можно всегда 100% "просочится" через очередь сообщений об отрисовке.
Насколько я понял, все сценки строятся на Timer (Paint(), Paint() ,Paint()....), а Paint ( DrawScene() ) (все обозначения условные).

Цитата(arilou @  1.8.2006,  11:21 Найти цитируемый пост)
мный рендерер перерисовывает только видимые объекты 

Приимерно догадываюсь. Постояно идет какой то- просчет. Невидимый. Как только доходит время и до него (до нужного просчета), он отображается (если отображалку умно написать.)
Можно для примера словами описать ситуацию -"Перекресток".
Есть машина. Она едет по видимой дороге. Где "там" едет другая машина. Едет постояно. может иногда останавливаясь.Живет своей жизню (свой класс, со своими координатами,со своим алгоритмом поведения ) .
Как мне узнать время столкновения? Будет ли оно? Будет ли вообще отрисована вторая машина? Где это все сделать (проверки всякие)

Автор: arilou 1.8.2006, 13:59
Таак  smile 

1. MVC - http://www.google.com/search?hl=en&q=Model+View+Controller+pattern
2. BSP  - http://www.google.com/search?hl=en&lr=&q=binary+space+partitioning
3. http://www.google.com/search?hl=en&lr=&q=Octree


Цитата(Coocky @  1.8.2006,  13:18 Найти цитируемый пост)
Насколько я понял, все сценки строятся на Timer (Paint(), Paint() ,Paint()....), а Paint ( DrawScene() )


Не, таймер не стоит, имхо. Тогда уже типа

Код

while(true)
{
  UpdateEnvironment();
  RenderEnvironment();

  if(userWantsToExit)
     break;
}


Цитата(Coocky @  1.8.2006,  13:18 Найти цитируемый пост)
Как мне узнать время столкновения? Будет ли оно? Будет ли вообще отрисована вторая машина? Где это все сделать (проверки всякие


1. Перед рендером каждого кадра все скармливается физическому движку, например Open Dynamics Engine (ODE) - http://www.ode.org/
2. Физический движок рассчитывает положения объектов исходя из времени, прошедшего с предыдущего кадра. 
3. Исходя их рез-тов обсчета в п.2 обновляются координаты моделей и рендерится кадр

Это что касается столкновений. 

Перед скармливанием физическому движку ты должен обновить состояние всех интересующих тебя объектов. Например, едет твоя машина. Исходя из ее скорости и времени прошедшего с момента прошлого обсчета, ты обновляешь координаты (хранятся в объекте Машина1). Потом перед передачей физическому движку переводишь координаты в мировые, а после рассчета физики корректируешь. Ну не очень хороший пример. Можно например добавить скриптовой AI, тогда первым действием будет вызов скриптов, они определят текущее состояние сущности (монстра), потом физика обсчитает этого монстра, потом исходя из координат и состояния всех монстров сформируются вершинные буферы, текстуры и т.д. и т.п. и будет передано рендереру.

Вообще, я бы порекомендовал тебе пойти на http://www.ogre3d.org и посмотреть, как грамотные люди делают рендерер.

Автор: Coocky 1.8.2006, 14:10
Цитата(arilou @  1.8.2006,  13:59 Найти цитируемый пост)
Таак   


Да уж.. smile  Пока так smile 

arilou, сенкс за заботу. Сейчас схожу на сайт. Поучусь smile 
(А здесь никому не раслаблятся. Я вернусь smile )

Добавлено @ 14:13 
Цитата(arilou @  1.8.2006,  13:59 Найти цитируемый пост)
Можно например добавить скриптовой AI,

(Ну это уже апперкот, после того, как два раза в пах.)
Ладно , иду на сайт! smile 

Автор: $tatic 2.8.2006, 20:04
В таких великолепных играх как Morrowind и Oblivion используется следующий метод обработки событий: каждый скрипт (прикрепленный к какому-либо объекту) зациклен на бесконечность и о событиях (например игрок подошел к объекту или активировал объект) должен догадываться сам (посредством условий). Для обработки также могут быть использованы глобальные (статические) переменные.
Естественно все скрипты в мире обработать невозможно, поэтому обрабатываются только ближайшие к игроку. Возможно это делается в многопоточном режиме.

В игровом цикле не делается никаких задержек, поскольку хорошие игры и без них тормозят smile. Самым ресурсоемким является конечно процесс рендеринга.

Автор: unicuum 3.8.2006, 02:41
Цитата($tatic @  2.8.2006,  20:04 Найти цитируемый пост)
о событиях (например игрок подошел к объекту или активировал объект) должен догадываться сам (посредством условий)

Для выделения вычисляется треугольник по нормали и его принадлежность к объекту (только как бы в обратном порядке), эта тема всегда затрагивается в книгах по 3D.

Цитата($tatic @  2.8.2006,  20:04 Найти цитируемый пост)
Естественно все скрипты в мире обработать невозможно, поэтому обрабатываются только ближайшие к игроку. 

Ага, сначала обрабатывается сцена (мир поделён на сцены), потом bounding box и потом уже можно говорить о треугольничках.

Добавлено @ 02:48 
А вот, ещё что забыл. Иногда можно убирать объекты из обработки, которых не видно. Плюс не все пересечения обрабатываются со всеми, а только тех объектов, которые были заданы. У каждого они свои. Coocky рекомендую посмотреть 3D Studio Max и её физику, и станет всё понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)