Главная » Статьи » Учебник: теория

II.U.1.Столкновение Твердых Тел
Panda3D Руководство: Столкновение Твердых Тел

CollisionSolid является основным объектом система столкновений.
CollisionSolid-ы представляют собой специальную невидимую геометрию, которая создана
исключительно для целей осуществления проверок столкновений; эти
CollisionSolid-ы хранятся в графе сцены наряду с нормальной
видимой геометрей.

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

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

Когда вы создаете CollisionSolid в интерактивном режиме, вы должны также создать
CollisionNode чтобы хранить твердое тело. (Когда вы загружаете ваши CollisionSolid-ы
из файла egg, CollisionNode-ы для вас создаются.) Часто
CollisionNode будет использоваться для хранения только одного твердого тела, но на самом деле
CollisionNode может содержать любое количество твердых тел, и иногда это
полезная оптимизация, особенно если у вас есть несколько твердых тел, которые всегда
двигаются вместе как единое целое.

cs = CollisionSphere(0, 0, 0, 1)
cnodePath = avatar.attachNewNode(CollisionNode('cnode'))
cnodePath.node().addSolid(cs)

CollisionNode-ы по умолчанию скрыты, но они могут быть показаны
в целях отладки:

cnodePath.show()

*Примечание*: Запомните, что алгоритм столкновений имеет лишь ограниченную осведомленность
о трансформациях масштабирования применённых к CollisionSolid-ам. Если неравное масштабирование
применено между коллайдером "from"("от") и коллайдером "into"("в"), могут иметь место
неожиданные результаты. В общем, стремитесь иметь настолько мало преобразований масштабирования
примененых к вашим твердым телам столкновений насколько это возможно.

Есть несколько доступных видов CollisionSolid-ов.

CollisionSphere

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

Кроме того, сфера является особенно хорошим выбором для использования в качестве
объекта "from" ("от"), поскольку сфера может надежно пройти проверку на столкновение
с большинством других типов твердых тел. Объекты "from" ("от") являются объектами, которые
рассматриваются как активные объекты в мире, см. Collision Traversers
<http://www.panda3d.org/wiki/index.php/Collision_Traversers>. Сферы, как правило, это лучший
выбор чтобы разместить вокруг воплощения игрока (главного персонажа), например. Сфера также
дает хороший объект "into" ("на"); это единственный тип объекта, который является хорошим
выбором как для объектов "from" ("от"), так и для объектов "into" ("на").

Сфера определяется через центр и радиус. Обратите внимание, что, как
любой объект, координаты сферы определены в собственном пространстве
координат сферы, так, что часто центром является (0, 0, 0).

sphere = CollisionSphere(cx, cy, cz, radius)

CollisionTube

"Трубы" представляет собой цилиндр с полусферическими заглушками. Такая форма
иногда называется капсулой в других системах столкновений.

Труба хороша как объект "into" ("на"), для объектов, которые в большей степени
цилиндрические. Это не очень хороший выбор для объекта "from" ("от"), потому что
не многие проверки пересечения были выполнены от труб на другие формы.

Труба определяется с помощю двух концов, и "цилиндрического радиуса".

tube = CollisionTube(ax, ay, az, bx, by, bz, radius)

CollisionInvSphere

Инверсная сфера это твердое тело специального назначения, которое редко используется, но
иногда это очень полезно. Это сфера наизнанку: твердая
часть сферы находится снаружи. Любой объект, который находится снаружи
сферы считается сталкивающимся с ней; любой объект
внутри не сталкивается.

Думайте об обратной сфере, как твердой массе, которая заполняет всю
вселенную во всех направлениях, за исключением пузыря пустоты в середине.
Она удобна для сдерживания объекта в конкретном пространстве, так как
ничто не может выйти из обратной сферы.

оп = CollisionInvSphere (CX, CY, CZ, радиус)

CollisionPlane

CollisionPlane бесконечная плоскость, распространяющаяся во всех направлениях. Она
используется не часто, но она может быть полезна в некоторых случаях, например
как триггер, расположенной под землей, чтобы определить, когда персонаж
случайно проскользнул через трещину в мире. Вы также можете строить
коробку ("box") из шести плоскостей чтобы хранить объекты совершенно ограниченными внутри
прямоугольной области, подобно на обратной сфере, такие коробки намного
более надежны, чем построенные из шести полигонов.

Плоскость фактически разделяет вселенную на два пространства: пространство
за полскостью, которое считается твердым, и пространство перед
плоскостью -- пустое. Таким образом, если объект находится в любом месте за
плоскостью, независимо от того, насколько далеко рассматривается его пересечение с плоскостью.

CollisionPlane строится с помощью объекта Panda3D -- Plane, который
сам имеет несколько конструкторов, в том числе уравнение плоскости
A, B, C, D или список из трех точек, или точка и нормаль.

plane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))

CollisionPolygon

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

Как плоскость и труба, CollisionPolygon это единственный хороший выбор в качестве
объекта "into" ("на"). Он не поддерживает проверку столкновений как объект "from" ("от").

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

Вы можете также сделать полигоны более высокого порядка, например пятиугольники и шестиугльники
или т.д., но вы не можете сделать вогнутые многоугольники. Если вы создаете
вогнутый или некомпланарный CollisionPolygon в вашем пакете моделирования, Panda
автоматически триангулмрует его для вас (а это может привести к
неоптимальному результату, поэтому обычно лучше разделить
вогнутые полигоны вручную).

В отличие от плоскости, CollisionPolygon бесконечно тонкий; объект
считается, сталкивающимся с полигоном только во время перекрытия полигоном объекта.

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

quad = CollisionPolygon(Point3(0, 0, 0), Point3(0, 0, 1),
Point3(0, 1, 1), Point3(0, 1, 0))

CollisionRay

Луч это специальное твердое тело столкновения, которое полезно только в качестве
объекта "from" ("от"); так как этот объект не имеет объема, ничего не будут сталкиваться
"into" ("на") -- с лучом. То же самое относится и к линии, параболе, и сегменту, перечисленным ниже.

CollisionRay представляет собой бесконечный луч, который начинается в конкретной
точке, и простирается в одном направлении до бесконечности.

Это особенно полезно для выбора объектов на экране, так как вы
можете создать луч, который начинается в точке зрения камеры и
простирается на экран, а затем определить, какие объекты, этот луч
пересек. (На самом деле, у CollisionRay существует метод, называемый
|setFromLens()|, который автоматически настраивает луч на основе 2-D
координат экрана; это используется как "выбиратель" ("picker").
См. Кликанье по 3D Объектам <http://www.panda3d.org/wiki/index.php/Clicking_on_3D_Objects>.)

CollisionRay также полезны в сочетании с
CollisionHandlerFloor см. Обработчики Столкновений
<http://www.panda3d.org/wiki/index.php/Collision_Handlers>.

CollisionRay создается через указание начальной точки и вектора
направления. Вектора направления нет необходимости нормализовать.

ray = CollisionRay(ox, oy, oz, dx, dy, dz)

CollisionLine

Это по сути то же маое, что и CollisionRay, за исключением того что она
распространяется до бесконечности в обоих направлениях. Она создается с
теми же параметрами -- начальная точка и направление вектора.

line = CollisionLine(ox, oy, oz, dx, dy, dz)

CollisionSegment

Сегмент -- другой вариант CollisionRay, который не распространяется до
бесконечности, а только идет до определенной точки и останавливается.
Это полезно, когда вы хотите указать предел того, насколько далеко
CollisionRay может достичь.

CollisionSegment строится через указание двух конечных точек.

segment = CollisionSegment(ax, ay, az, bx, by, bz)

CollisionParabola

Наконец, парабола это другой вариант CollisionRay который гнется.
Это полезно, когда вы хотите проверить столкновения с арками,
такие, как выстрел пушечного ядра.

Таблица Системы Столкновений

Вот таблица Столкновения Твердых Тел, которая описывает какие
могут быть использованы в качестве объектов "from" ("из"),
какие в качестве объектов "into" ("на"), и могут ли они сталкиваться.

Как отмечалось выше CollisionRay, CollisionLine,
CollisionParabola, CollisionSegment только "from"("из"), никогда "into" ("в") и
следовательно, не перечисленны в столбцах в таблице ниже.

В тоже время CollisionFloorMesh, CollisionInvSphere, CollisionPlane,
CollisionPolygon и CollisionTube только "into" ("на") и никогда "from" ("из") и
поэтому они не включены в строки в таблице ниже.

В приведенной ниже таблице твердые тела указаны без приставки "Collision",
например, "Sphere" вместо "CollisionSphere", чтобы сэкономить место.

|----------|----------|------------|------------|--------|----------|---------|-------|
|FROM/INTO*| *DSSolid*| *FloorMesh*| *InvSphere*| *Plane*| *Polygon*| *Sphere*| *Tube*|
|----------|----------|------------|------------|--------|----------|---------|-------|
|DSSolid | * *| * *| * *| * *| * *| *Yes*| * *|
|Line | * *| * *| *Yes*| *Yes*| *Yes*| *Yes*| *Yes*|
|Parabola | * *| * *| * *| *Yes*| *Yes*| *Yes*| *Yes*|
|Ray | * *| *Yes**| *Yes*| *Yes*| *Yes*| *Yes*| *Yes*|
|Segment | * *| * *| *Yes*| *Yes*| *Yes*| *Yes*| *Yes*|
|Sphere | *Yes*| *Yes*| *Yes*| *Yes*| *Yes*| *Yes*| *Yes*|
|----------|----------|------------|------------|--------|----------|---------|-------|

Источник: http://block32.site88.net/index.php?view=category&id=40%3Amanual&option=com_content&Itemid=62

Категория: Учебник: теория | Добавил: esniper (21.11.2009) | Автор: esniper W
Просмотров: 5260 | Рейтинг: 5.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0