9. Коллизион Детекшн или как устроен мир…

 

Вот мы плавно подошли к главной составной части физики Блитц3Д (не надо только пугаться – никаких формул типа mc^2 вспоминать не нужно J – здесь вы их сами будете придумывать!), и одного из его самых главных компонентов – проверки на соприкосновение! Я думаю, после того, как мы его разберём, вы будете готовы к тому, что бы приступить к самой разработке игр… JJJ!!!

 

Ну, ладно, начнём – чего время-то терять? J:

 

SeedRnd MilliSecs()

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

Const TypePlayer=1,TypeWall=2

 

Player=CreateSphere()

EntityType Player,TypePlayer

 

Wall=CreateCube()

PositionEntity Wall,0,0,10

EntityType Wall,TypeWall

 

Collisions TypePlayer,TypeWall,2,3

 

cam=CreateCamera()

PositionEntity cam,0,30,0

TurnEntity cam,90,0,0

 

lit=CreateLight()

TurnEntity lit,70,70,0

 

 

Repeat

 

 If KeyDown(200) MoveEntity Player,0,0,.1

 If KeyDown(208) MoveEntity Player,0,0,-.1

 If KeyDown(203) TurnEntity Player,0,2,0

 If KeyDown(205) TurnEntity Player,0,-2,0

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

Итак, в этой программке представлен основной принцип проверки на прикосновения. Здесь мы создаём шар и куб, затем, стрелками управляем шаром, и, если вы захотите заехать внутрь куба, у вас ничего не получится  J! УРА! Это и есть тот самый коллизион детекшн – он не пропускает одни объекты в другие, если, конечно перед этим указать, какие именно объекты, и куда именно не пускать (J) …

 

А теперь разберём все нововведения.

 

Сначала мы создали две константы – TypePlayer, равной единице и TypeWall, равной двойке. Зачем мы это сделали? Так это чтобы не запутаться! Я думаю, потом поймёте в чём именно… Ещё, вы, наверное, заметили, ещё одну новую команду – EntityType объект, тип объекта – присваивает данному объекту данный тип. Тип (в данном случае) - это просто цифры. Здесь мы вместо цифр использовали константы – чтобы не запутаться, да и чтобы легко можно было прочитать – к какому типу этот объект относится, и с чем соприкасается ( а то представьте такую ситуацию… у нас есть (какие-то) цифры для главного героя, стены, врагов, ну, и прочей дряни – всё это мы вначале создания проекта распределили, расставили, и благополучно забыли за ненадобностью… но вдруг в середине проекта вы вспоминаете, что забыли задать проверку на столкновение между врагом и героем (…ну это уж я утрирую… J), и начинаете судорожно вспоминать какая же цифра у вас обозначала врага, просматриваете килобайты кода… ну в общем можно поступить намного удобней, задав сразу константы, таким вот образом Тип_Герой = 1, Тип_Стена = 2, Тип_Пол = 3, Тип_Враг = 13, Тип_Враг_Босс = 113… Тип_какая-то_хрень_-_просто_валяться_где-нибудь_будет = 2147483647J! И мы тут уже не цифры пишем, а типа «Коллизион между Типом_Врагом и Типом_Героем»!!!

 

Следуящая команда: Collision первый тип, второй тип, метод, результат – в общем то, что она делает я только что написал, ну а подробней:

Первый тип – объект, который будет проверяться на столкновения.

Второй тип – объект, с которым эти самые столкновения и будут происходить… J

Метод:

            1 – соприкосновение сферы со сферой

            2 – соприкосновение сферы с полигонами

            3 – соприкосновение сферы с параллелепипедом

Результат:

            1 – остановка

            2 – скольжение – полное скольжение

            3 – скольжение – защита объекта от скольжения вниз (может я перевёл не правильно, конечно, ну в общем этот метод создан для работы с террайнами в 3Д)

 

Теперь постараюсь обо всём этом, да поподробнее… начнём с методов:

 

Как видите, объект, который будет проверяться на столкновения (первый объект) должен будет иметь «сферу» столкновения – так как методы столкновения бывают только сферы с чем-нибудь. Величину этой самой сферы проверки можно задать для каждого объекта отдельно – с помощью команды EntityRadius объект, радиус#. Это накладывает некоторые ограничения (зато сама проверка – очень быстро реализована) и как бы ваша фигура не выглядела – коллизия будет проверяться именно по какой-то сфере – т.е. допустим, у вас есть предмет – спичка – здесь вам придётся делать либо большую сферу, получая довольно приличное расстояние в середине спички между радиусом сферы соприкосновения и радиусом самой спички, либо сделать сферу поменьше, но сверху и снизу спичка будет вылезать из сферы (как вариант – только верхняя или нижняя часть) – т.е. тут уже эта выпирающая часть может залезть в другой объект… ну, со спичкой я опять же утрирую – но, вот моделки людей, например, тоже не похожи на шары – так что рано или поздно, такой вопрос встанет, и о нём лучше подумать заранее – например, можно сделать более приземистых, коренастых юнитов – как в Квейке первом, например…

 

Далее – насчёт коллизиона. 1-е: этот самый коллизион происходит только при движении первого объекта внутрь второго… 2-е: Коллизион – вещь односторонняя – т.е. если мы, как в примере, хотим, чтобы герой соприкасался с врагами, а те, в свою очередь – с ним, то нам нужно писать две команды - «Коллизион между Типом_Героем и Типом_Врагом» и «Коллизион между Типом_Врагом и Типом_Героем»… а так как первый объект должен иметь именно СФЕРУ соприкосновения, то единственный доступный метод здесь – первый! Так что к сфере надо будет привыкнуть, и уже начинать думать, что с ними делать… правда, я слышал о том, что разработчики думают сделать коллизиион по эллипсоиду, но когда это будет?… J

 

Так, незадолго до того, как я дописал туториал, вышел апдейт 1.82 (поэтому я тут немного дополняю J), где эллипсоидный метод столкновения уже реализован, правда удлинять или сплющивать можно только по Y оси, но и это неплохо! Если я не ошибаюсь, новая команда выглядит так: EntityRadius объект, радиус по X и Z, радиус по Y...

 

Вот, в общем-то и вся основа 3Д… понравилось? Ну да прикололся я – ни фига ещё не всё!!! JJJ!!! (хотя самые основные части позади)

 

Теперь будет намного интереснее. При условии конечно, что вы старательно изучали все эти главы, на которые потратили лучшие минуты своей жизни (J) и большую часть поняли. Что же пора заняться тем, о чём я там обещал наверху – парой простеньких игрушек!

 

 

 Оглавление:

 

0.  Введение

1.  В начале была Тьма

2.  Есть ли жизнь в DirectX

3.  Свобода и Власть 3Д (0)

4.  Свобода и Власть 3Д (1)

5.  2Д в 3Д

6.  Трёхмерный курсор

7.  Родительская зависимость или Привязки

8.  Фишки с привязками

9.  Коллизион Детекшн или как устроен мир…

10.     Первая 3Д игра. Часть 0 – основы движка

11.     Первая 3Д игра. Часть 1 – разработка движка

12.     Первая 3Д игра. Часть 2 – устранение багов

13.     Первая 3Д игра. Часть 3 – внешний вид

14.     Первая 3Д игра. Часть 4 – от массива к спискам

15.     Первая 3Д игра. Часть 5 – оптимизация кода

16.     Первая 3Д игра. Часть 6 – завершение

17.     Выведение

 

 

 

 

Используются технологии uCoz