Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по GLScene.doc
Скачиваний:
255
Добавлен:
16.12.2018
Размер:
7.18 Mб
Скачать

V. Ручная проверка коллизии

Легче всего фиксировать столкновение сфер. Для этого надо лишь знать положение центров и радиусы сфер. Зная это можно легко вычислить расстояние между центрами сфер и если это расстояние меньше суммы радиусов двух сфер – значит, столкновение произошло. Вообще легче всего вычислить «примерное» (а в случае со сферами ТОЧНОЕ) столкновение между двумя объектами посредством вычисления расстояние между двумя объектами. Длина отрезка (расстояние) между двумя точками вычисляется по теореме Пифагора и на «Паскальном языке» выглядит так: LEN := sqrt ( Sqr(x2-x1)+Sqr(y2-y1)+Sqr(z2-z1))

Не очень быстрый алгоритм. Но существуют различные способы его оптимизации-ускорения. В GLS расстояние между двумя объектами вычисляет встроенная функция LEN:=Obj1.DistanceTo(Obj2); Исходя из всего вышеописанного, предлагаю сделать наши пули сферами. Это значительно упростит поиск столкновений с целью. Как вообще проходит проверка столкновений? – С двумя объектами-сферами понятно и элементарно, а как быть, если объектов много? Если объектов много – то ничего не поделаешь, придётся перечислять все объекты GLS и проводить алгоритм проверки столкновений каждого объекта с абсолютно всеми собратьями – со всеми объектами каждую итерацию каденсера. Соответственно чем сложнее алгоритм проверки – тем ощутимее тормоза. И вообще коллизии могут очень ощутимо влиять на быстродействие. Приведу здесь небольшой кусок универсального кода позволяющий перебрать абсолютно все объекты GLS. Var I,j : integer; if (GlScene1.Objects.Count<>0) //это нужно не всегда… then for i := 0 to GlScene1.Objects.Count-1 do for j := 0 to GlScene1.Objects[i].Count-1 do if Assigned(GlScene1.Objects[i].Children[j].TagObject) and (GlScene1.Objects[i].Children[j].TagObject.ClassType=T(относящийся к объектам поражаемым пулями)) //Тут конечно проверяются только «чилды» объектов, но в большинстве решений //так и должно быть – ведь, как правило, любой объект цепляется к «дамми-кубу» then begin //Проверяем столкновение с пулей… end; Вышеописанный алгоритм проверки столкновений двух сфер один из самых простых и быстрых. Но не все объекты похожи на сферы.… Сама цель (я предполагаю, что это человекоподобный гуманоид) чаще всего условно похожа на прямоугольный «box». С боксом столкновение фиксировать куда сложнее, чем со сферой, следует определить угол наклона (Axis) бокса, возможно нормали от его сторон и ещё много всякого…. Лучше всего воспользоваться для проверки столкновений кубов инструментом CollisionManager.

Глава 34. Шейдеры. Терменология.

В последнее время слово “шейдер” стало очень популярно. Непосвященные люди давно считают его магическим, но это далеко не так. Сегодня мы отойдём эт такого толкования. Итак,

Шейдер (англ. Shader) — это программа, для одной из ступеней графического конвейера (если не заморачиваться - видеокарты), используемая в трёхмерной графике для определения окончательных параметров изображения или объекта. Он (шейдер) может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, смещение, затенение поверхности и эффекты пост-обработки.

В настоящее время шейдеры делятся на три типа: вершинные, геометрические и фрагментные (пиксельные).

Вершинные шейдеры (Vertex Shader)

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

Геометрические шейдеры (Geometry Shader)

Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник(три вершины), а при наличии информации о смежных вершинах (adjacency) может быть обработано до шести вершин для треугольного примитива. Кроме того геометрический шейдер способен генерировать примитивы "на лету", не задействуя при этом центральный процессор. Впервые начал использоваться на видеокартах Nvidia, серии 8.

Фрагментные (Пиксельные) шейдеры (Pixel Shader)

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

Все шейдеры пишутся на шейдерных языках и могут храниться в отдельном файле, либо являться частью кода программы.

Так же приведу статью (источник http://www.ixbt.com/video2/terms2k5.shtml#nm), где описываются очень важные терми