Каталог статей

Главная » Статьи » Физические движки » PhysX

Учебник по PhysX Wrapper для Blitz3D
Итак, по просьбам трудящихся я таки решился написать малюсенький туторчик по врапперу товарища Рендера

www.xors3d.com - офф. сайт, враппер можно скачать оттуда

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

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

Для тех, кто в танке. Что такое реал-таймовая физика в играх? Что такое PhysX Wrapper?

Думаю, вам уже известно, что такое реал-таймовая физика. Помните, как реалистично в Half-Life 2 отскакивали ящики от метких выстрелов, или как здорово труп валился вниз по лестнице, подчиняясь всем законам Ньютона? Помните, как в Crysis'е можно было схватить ящик и засадить им в супостатов, при этом сам ящик разбивался, а враги без сознания отлетали к дальней стенке? Всё это стало возможным относительно недавно, когда компьютеры стали достаточно мощными, чтобы обрабатывать подобные вычисления без огромных тормозов. Сначала такие игры можно было пересчитать по пальцам и они достаточно ограниченно использовали физику. Можно было потолкать ящики при помощи выстрелов, скинуть их в пропасть, но не более того. Позже трупы врагов стали тоже физическими и теперь перестали проваливаться сквозь стены (помните в Counter-Strike 1.6 если чел сидел в углу и его пристрелить, то он откинется на спину и только ножки торчат из стены. Поначалу забавно, но ни о какой реалистичности и речи быть не могло), а стали падать в соответствии с тем окружением, где они находятся. Благодаря этому смерти каждого персонажа перестали быть похожими друг на друга. Кстати, эта технология называется "Ragdoll", как такое сделать самому я тоже обязательно раскажу. Конечно, такие штуковины сделали игры намного более реалистичными, но не повлияли на геймплей. Игрой, по-настоящему завязанной на физике, стала Half-Life 2. Всякие приколы типа "Положи 5 кирпичей на один конец качели чтобы другой конец поднялся вверх и ты смог бы по нему забраться на уступ", "Поставь ящики горкой чтобы по ним забраться выше" или "Подсунь бочки с воздухом под решётку чтобы она вспыла из-под воды" просто немыслимы без физики. А одна гравипушка чего стоит! До этого ничего подобного нигде не встречалось и она была бы невозможно без рассчёта игровой физики.

С тех пор прошло досточное количество времени и теперь игровая физика стала стандартом де-факто в играх ААА-класса. Нынче игры без физики вообще - редкость, разве что-то мелкое типа головоломок, или стратегии, где игрок не принимает непосредственного участия в передвижении по уровню, так что физика там не так важна, хотя она, безусловно, встречается в играх и этого жанра. Короче, физика стала такой же неотъемлемой частью игр, как в конце бородатых девяностых стала трёхмерность, начало которой положил ещё старичок Quake.

Но для чтобы написать алгоритм обработки физики, необходимо блестяще знать физику, высшую математику и т.п., что проходят далеко не в каждом ВУЗе, не говоря уже о школах, учениками которых является немалая часть нашей инди-гейдвевелоперской братии. Да и одному человеку не по силам создать почти идеальную физику с кучей возможностей, или у него уйдёт на это туча времени и сил.

Поначалу так и было. В играх не было очень качественной физики. В основном это были ящики, имеющие форму параллелепипеда, да какие-нибудь доски. В принципе, это вполне удовлетворяло потребности игродела того времени. Но требования неуклонно росли и программистам приходилось всё сложнее и сложнее. А ведь им кроме физики надо ещё писать движок, логику, графику... Но зачем 10 людям делать одно и то же, 10 раз, когда можно собраться вместе и сделать это один раз, но в 10 раз лучше, да ещё и дать пользоваться другим, чтобы те не изобретали велосипед? Так уже давно произошло с трёхмерными движками. Сначала геймдевелоперы сами пытались написать себе 3Д-графику, но, когда вышел Quake, стало ясно, что гораздо проще взять уже готовый движок и делать на нём игру, чем только год потратить на создание такого движка. (Справедливости ради стоит отметить, что и до этого делались попытки использовать движок другой игры, например, Doom. Например, на его движке написана культовая в своё время игра Blood. Но Quake Engine благодаря своей универсальности пользовался бешеным успехом и произвёл настоящий бум. Игры на нём и на его модифицированных версиях писались вплоть до середины 2000-х) Вот и мы используем Blitz3D и не задумываемся о всяких матрицах трансформации, конвеере рендера и т.п. - всё это уже сделано до нас. Точно так же произошло и с физическими движками. Стоит только оформить все необходимые функции и структуры в удобный интерфейс - и ими сможет пользоваться всякий желающий. Одним из самых известных, мощных и функциональных движков стал Havoc. Именно благодаря ему мы кидались ящиками из гравипушки в Half-Life 2, благодаря ему так смачно разлетались тушки скелетов в Painkiller'е. Одно время с ним конкрурировал физический движок Karma (известен нам по играм Unreal 2, Unreal Tournament 2003-2004, Postal 2, Ведьмак и многие другие игры на движке Unreal Engibe 2.0 и не только) И вот, совсем недавно на сцену вышел физический движок нового поколения - PhysX. Он примечателен тем, что стал первым (и пока единственным) физическим движком, который ускоряется аппаратно. Сначала эта возможность была доступна тольтко владельцам специальных устройств, именуемых "Ageia PhysX Chip", который стоил как хорошая видяха и пихался в PCI-разъём. Были выпущены специальные демки, в которых демонстрировался огромный прирост произовдительности по сравнению с рассчётами на ЦП. Но, к сожалению, игр, которые поддерживали этот физ. ускоритель, было катастрофически мало и желающих его купить нашлось немного. Позже компанию Ageia купила nVIDIA и внедрила аппаратную поддержку физики в свои видеокарты начиная с серии GeForce 8xxxx. Таким образом отпала необходимость покупать отдельный чип и любой владелец современной видеокарты GeForce мог кусить все прелести аппаратного ускорения физики. Вследствие этого популярность движка возросла, теперь список игр, его поддерживающих, стал достаточно внушительным. И, наконец, nVIDIA сделала всем нам огромный подарок, разрешив юзать PhysX всем желающим бесплатно (Вроде как есть какие-то ограничения, вроде того что надо указывать, что твоя игра использует PhysX, но это фигня, главное, что не надо платить баснословные бабки за лицензию). Это послужило причиной роста популярности движка и позволило ему на равных конкурировать с монстрилой Havoc'ом, который в последнее время теряет свои позиции. Нынче он используется в нескольких десятках самых известных игр, среди них: Unreal Tournament 3, Sacred 2, CellFactor и многие другие (думаю, все тайтлы перечислять не стоит, если вам это интересно, то на Википедии есть полный список, кроме того можете почитать там и о самом движке) Набор функций и библиотек для использования PhysX'а в своей игре называется PhysX SDK. Однако, он очень сложен в освоении да и не существует его версии для Blitz3D (если монстрилы индустрии вообще знают, что вообще есть на свете такая штука)

Как же быть? На наше счастье, существует враппер этого самого SDK для Блитза, именуемый PhysX Wrapper за авторством Андрея Гутыри, более известного, как Render. Увы, он не бесплатен, но прогерам кушать тоже хочется. Корче того, то, что просит за него афтор - воистину смехотворная сумма по сравнению с тысячами долларов, которые просят за лицензию движки ААА-класса.

Итак, что же представляет из себя этот враппер? А представляет он из себя набор dll-ок и деклз-файл, которые позволяют использовать движок PhysX на нашем старичке Блитзе. Да-да, вы не ослышались, это действитиельно возможно! Всё вышеописанное можно сделать и на Блитзе (с прямыми руками и головой на плечах, разумеется)

Конечно, для Блитза и ранее существовали врапперы физических движков (Newton, ODE). Я не стану перечислять их достоинства и недостатки, и так я уже расписал своё лирическое отступление на полчаса чтения)) Коль речь идёт о PhysX'е, я постараюсь объяснить новичкам как им пользоваться, а заодно, возможно, и сам приобрету что-то новое. Итак, вперёд!

Начало работы. Что понадобится? Первое простое приложение на ФизикСе

Вам понадобятся:

* Блитз3Д (Думаю, раз уж вы читаете тутор по врапперу для этого движка, то он (движок) у вас уже есть)
* Физикс Враппер, установленный на него (можно скачать с офф сайта)
* Какое-никакое знание Блитза, т.к. я не стану объяснять его азы, ведь статья не об этом.
* Голова на плечах =)) (полностью на вашей совести)

Итак, качаем установщик враппера. Запускаем его, указываем путь к Блитзу. Там несложно, разберётесь. Собсно это всё. Теперь перезапускаем Блитз и можно уже писать программу.

Вот простой пример кода на Блитз3Д, который я взял за основу:

Code

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

cam = CreateCamera()
PositionEntity cam,0,10,-20

plane = CreatePlane()
EntityColor plane,64,128,128

Repeat

RenderWorld()
Flip

Until KeyHit(1)
End

н создаёт камеру, зеленоватую плоскость и рисует это всё. Теперь надо подключить к проекту Физикс. Делается это при помощи команды:

Code

pxCreateWorld(plane%, key$)

Собственно, она и говорит Блитзу, что отныне в проекте используется Физикс. В функцию надо передать параметр plane%, отвечающий за создание физической плоскости. Может принимать значения 1 или 0. Соответственно 1 - создать плоскость, а 0 - не создавать. Кроме этого, нужно передать параметр key$ - это ключ продукта, чтобы либа не надоедала сообщениями "This is demo version!". На пока вполне сгодится и демо-версия. Если у вас нет ключа - просто передайте пустую строку.
Эту команду надо вставить после инициализации графического 3Д-режима aka Graphics3D (как видите, я создал физ. плоскость и не стал передавать ключ):

Code
pxCreateWorld(1,"")

Далее - нам понадобится обновлять физику каждый цикл. Делать это нужно перед рендером. Нам поможет команда:

Code
pxRenderPhysic(time#, sinc%)

Она собственно и обновляет физику. В блитзе есть похожая команда UpdateWorld, которая обновляет каждый цикл коллизии и анимацию, так что использование схоже. Итак, у функции 2 параметра. Первый параметр time отвечает за скорость обновления физики. Чем меньше это число, тем быстре будут двигаться физические тела и быстрее происходить вообще все процессы в физическом мире. Пока что поставим сюда 60, это, я думаю, оптимальное значение для начала. Второй параметр sinc может принимать значения 0 или 1 и указывает, надо ли включать встроенную в синхронизацию. Пока что она работает не вполне корректно, так что лучше её отключить, а если она понадобится, то её можно сделать и своими силами. Итак, эту команду надо использовать перед рендером сцены:

Code
pxRenderPhysic(60,0)

Ну чтож, мы подключили PhysX и прописали обновление физики. Но не хватает главного - физических объектов! Тут я сделаю опять небольшое лирическое отступление. В физических движках всё происходит отдельно от трёхмерного движка. То есть если у нас есть куб-трёхмерная модель и куб-физическое тело, то, когда мы обновляем физику, тело будет падать, кататься и вести себя по физическим законам. модель же ни с места не сдвинетя от этого самого обновления физики при помощи команды pxRenderPhysic. Привязать модель к телу на манер EntityParent тоже нельзя. Поэтоум надо вручную устанавливать модель в координаты и в поворот тела. Поначалу это кажется непривычным, но со временем вы поймёте, что это на самом деле удобно.
Итак, давайте создадим кубик. Обычный, блитзевский, при помощи всем нам хорошо известной команды CreateCube():

Code
Cube = CreateCube()

Теперь надо создать для него физическое тело при помощи команды:

Code
pxBodyCreateCube%( dx#, dy#, dz#, mass#)

По сути, пользоватья ей нужно так же, как и простым блитзевским CreateCube(). Но тут всё сложнее. Так как, к сожалению, масштабировать физические объекты в реальном времени нельзя, это надо делать при их создании. Поэтому первые три аргумента этой функции dx, dy, dz указывают масштабирование создаваемого физического тела-куба по осям X,Y,Z соответственно. Думаю, нам пока что хватит и обычного кубика размерами 1х1х1, поэтому мы укажет в этих параметрах единицы. Но кроме этого каждый физический объект должен иметь массу, именно за неё отвечает четвёртый аргумент mass. Думаю, масса 1 будет вполне достаточной. Физический куб, как и блитзевский, создаётся в координатах 0,0,0 с поворотом по осям 0,0,0.

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

Итак, пишем код создания тела прямо после кода создания модели куба:

Code
Body = pxBodyCreateCube(1,1,1,1)

Так, теперь у нас есть ещё и тело для куба. Но оно лежит в точке 0,0,0. Думаю, его надо приподнять повыше. Тут нам поможет команда:

Code
pxBodySetPosition (body%, pos_x#, pos_y#, pos_z#)

Функция, по сути, аналогична Блитзевской PositionEntity, только в неё надо пихать первым аргументом body то тело, которое мы желаем переместить. В следующие три аргумента pos_x, pos_y, pos_z передаём новые координат для тела. Давайте поднимем тело куба на 10 единиц над землёй:

Code
pxBodySetPosition Body,0,10,0

Ну вот, теперь ему есть откуда падать) Но тот куб, который мы увидим на экране всё ещё неподвижен как я писал выше, его надо вручную устанавливать в позицию и поворот соответствующего тела. К счастью, уже есть удобная команда, выполняющая это действие:

Code
pxBodySetEntity (entity%, body%)

Первый параметр - это тело, которое нужно устанавить в позицию и поворот соответствующего тела, body - соответствующее тело. Вызывать такую функцию нужно каждый раз после обновления физики, но до вывода на экран. Т.е. между pxRenderPhysic и RenderWorld. Давайте применим её к нашему кубу и его телу:

Code
pxBodySetEntity(Cube,Body)

Всё! Теперь можно запускать программу и наблюдать адение нашего кубика!
Да, чего-то здесь не хватает. Похоже, неплохо бы добавить освещение:

Code
light = CreateLight()

Ну вот, теперь совсем другой вид! Собственно, у меня получилось вот что:

Полный код примера вы найдёте в аттаче "PhysXExample1.zip"
Мда, с одним кубиком не очень-то впечатляет. Давайте насоздаём их много. Используем для этого типы. Буду краток, есчли вы не очень хорошо разбираетесь в типах, то советую почитать вот этот перевод от товарища Импера:
http://forum.boolean.name/showthread.php?t=10
(я сам по нему когда-то учился )

Так, значится. Создадим тип для кубика:

Code

Type pxCube
  Field mesh
  Field body
End Type

Всё, в-общем-то, дорлжно быть ясно: в типе хранится модель и тело объекта. Больше нам пока ничего не надо.

Теперь напишем функцию обновления каждого кубика:

Code

Function UpdatepxCubes()
  For pxC.pxCube = Each pxCube
  pxBodySetEntity pxC\mesh, pxC\body
  Next
End Function

Здесь перебирается каждый объект типа pxCube и модель позиционируется в координаты тела. Как вы уже догадались, использовать её надо аналогично pxBodySetEntity (т.е. между обновлением физики и рендером):
Code

UpdatepxCubes()

Теперь можно написать и функцию создания. Это, в принципе, то же самое, что было описано выше для одного кубика, но теперь всё это упорядочено в типы:
Code

Function CreatepxCube(x#,y#,z#)
  pxC.pxCube = New pxCube
  pxC\mesh = CreateCube()
  pxC\body = pxBodyCreateCube(1,1,1,1)
  pxBodySetPosition pxC\body,x,y,z
End Function

Создаётся объект pxCube, для него создаются модель и тело, а затем тело выставляется в переданные в функцию координаты.
Ну, раз мы упорядочили всё в типы, то можно удалить наш старый кубик.
Стираем этот код:
Code

Cube = CreateCube()
Body = pxBodyCreateCube(1,1,1,1)
pxBodySetPosition Body,0,10,0

и этот:
Code

pxBodySetEntity(Cube,Body)

Давайте создавать кубики по нажатию пробела в точке 0,10,0. Теперь это совсем несложно:
Code

If KeyHit(57) Then CreatepxCube(0,10,0)

Всё! Можно запускать. Запустили и тарабаним по пробелу. Вот что вышло у меня:

Да, этот результат намного интереснее!
Полный код примера вы найдёте в аттаче "PhysXExample2.zip"

Ну что ж, я описал базовые знания об этом враппере. Думаю, они окажутся вам полезными и вы прочитаете продолжение, которое я вскоре напишу. Однако не бойтесь экспериментировать и читать хелп самостоятельно. Ладно, уже скоро полшестого утра по Москве, пойду спать.

Ccылки
PhysXExample1.zip (362 байт)
PhysXExample2.zip (475 байт)

Другие примитивы.

Итак, вчера я рассказал как создавать кубики. Но кроме них в ФизикСе есть ещё и другие примитивы. Думаю, будет полезно с ними кратко познакомиться.
Первым будет цилиндр:

Code
pxBodyCreateCylinder%(radius#, height#, nbEdge%, mass#)

Итак, эта функция создаёт физическое тело-цидиндр. Функция очень похожа на pxBodyCreateCube, только тут вместо масштаба по осям нужно указывать радиус цилиндра radius#, высоту цилиндра height# и количество граней цилиндра nbEdge%. Следует заметить, что . Масса цилиндра mass# указывается точно так же, как и для куба.
Теперь давайте изменим пример PhysXExample2.zip чтобы он создавал не только кубики, но и цилиндры, причём случайно. Я изменил код создания куба таким образом:
Code

Function CreatepxCube(x#,y#,z#)  
  pxC.pxCube = New pxCube
  fig = Rand(1,2)
  Select fig
  Case 1 ; куб
  pxC\mesh = CreateCube()
  pxC\body = pxBodyCreateCube(1,1,1,1)
  Case 2 ; цилиндр
  pxC\mesh = CreateCube()
  pxC\body = pxBodyCreateCylinder(1, 3, 8, 1)
  End Select
  pxBodySetPosition pxC\body,x,y,z
End Function

Как видите, сначала случайным образом выбирается переменная fig.
Если она равна единице, то создаётся куб, как бы это делали раньше, а если двойке - то физическим телом будет цилиндр. Как вы можете видеть, для него я выбрал радиус 1, высоту 3, 8 граней и массу 1.
Но модель по-прежнему куб. Непорядок. Куб с физической моделью цилиндра - это жестоко. Пускай будет блитзевский цилиндр с 8 гранями:
Code

pxC\mesh = CreateCylinder(8)

Но так как я указал физической модели высоту 3, то и у модельки тоже надо изменить высоту до трёх (напомню, что при создании она равна 1). Сделаем это при помощи простого масштабирования:
Code

ScaleEntity pxC\mesh,1,3,1

Ну вот! Теперь если поклацать по пробелу, то мы увидим созданные не только кубики, но и цилиндрики:

Для порядку я решил переименовать тип из pxCube в pxBody т.к. обзывать цилиндр кубом не очень корректно. Делать это необязательно, но это сделает код более понятным. Теперь функции и тип выглядят таким образом:

Code

Type pxBody
  Field mesh
  Field body
End Type

Function UpdatepxBodies()
  For pxB.pxBody = Each pxBody
  pxBodySetEntity pxB\mesh, pxB\body
  Next
End Function

Function CreatepxBody(x#,y#,z#)  
  pxB.pxBody = New pxBody
  fig = Rand(1,2)
  Select fig
  Case 1 ; куб
  pxB\mesh = CreateCube()
  pxB\body = pxBodyCreateCube(1,1,1,1)
  Case 2 ; цилиндр
  pxB\mesh = CreateCylinder(8)
  ScaleEntity pxb\mesh,1,3,1
  pxB\body = pxBodyCreateCylinder(1, 3, 8, 1)
  End Select
  pxBodySetPosition pxB\body,x,y,z
End Function

Надеюсь, вы уже догадались, что в этом случае нужно поменять название ф-ии и при создании при обновлении в цикле:
Code

If KeyHit(57) Then CreatepxBody(0,10,0)

UpdatepxBodies()

Запускаем, чтобы на всякий случай убедиться, что всё работает.
Полный код примера вы найдёте в аттаче "PhysXExample3.zip"

Продолжаем тему примитивов. На очереди у нас сфер. Ну, тут всё предельно просто:

Code
pxBodyCreateSphere(radius#, mass#)

radius - радиус сферы, mass - масса. Тут и понимать нечего. В визуальном плане ей соответствует блитзевская сфера, создаваемая командой CreateSphere(). Давайте попробуем в наш пример встроить и сферу:
Code

Function CreatepxBody(x#,y#,z#)  
  pxB.pxBody = New pxBody
  fig = Rand(1,3)
  Select fig
  Case 1 ; куб
  pxB\mesh = CreateCube()
  pxB\body = pxBodyCreateCube(1,1,1,1)
  Case 2 ; цилиндр
  pxB\mesh = CreateCylinder(8)
  ScaleEntity pxb\mesh,1,3,1
  pxB\body = pxBodyCreateCylinder(1, 3, 8, 1)
  Case 3 ; сфера
  pxB\mesh = CreateSphere(8)
  pxB\body = pxBodyCreateSphere(1,1)
  End Select
  pxBodySetPosition pxB\body,x,y,z
End Function

Как видите, я добавил третий случай (когда fig = 3). Если это происходит, создаётся физическая сфера радиусом 1 и массой 1 да соответствующая ей модель-сфера.
Запускаем, давим на пробел - теперь у нас ещё и шарики появляются.

Но есть у сферы одна важная особенность, делающая её отличной от других примитивов. Если помните, при создании физического цилиндра мы указывали количество его граней. То есть в предыдущем примере получился никакой не цилиндр, а 8-угольная призма. Это происходит потому, что каждый объект в ФизикСе (да и во многих других движках) имеет конечное количество точек. Чем больше точек, тем более округлую поверзность можн осмоделлировать, но тем больше будут затраты на расчёт физики. В-общем, тут полная аналогия с полигональной графикой: чем больеш треугольников - тем круглее и точнее поверхность, но тем больеш нагрузка на видеокарту. Так вот, физ.сфера является исключением из этого правила! Она действительно математически является сферой (т.е. идеально круглой). Насколько мне известно, для таких объектов в Физиксе обработка происходит по несколько другим алгоритмам. За счёт того, что сферу можно легко описать лишь её радиусом, вычисления получаются во много раз быстрее, чем если то же самое делать из точек и треугольников, как цилиндр. Поэтому запомните: если вам нужно создать физический объект, имеющий шарообразную форму или близкую к ней, используйте физический примитив-сферу: это ускорит расчёт физики, чем если сферу моделировать как другие тела.

Теперь перейдём к капсуле.
Думаю, сначала надо рассказать, что же такое капсула. Она предстваляет из себя примерно такую штуку:

По сути, это цилиндр с закруглёнными краями. Чем-то напоминает пилюлю. Создаётся вот такой командой:

Code
pxBodyCreateCapsule%(height#,radius#,mass#)

Параметр height указывает высоту цилиндрической части капсулы, radius - радиус капсулы, mass - масса.
Глядите на схему, чтобы лучше понять.
Попробуем у нас создавать капсулу высотой 3, радиусом 1 и массой 1:

Code
pxB\body = pxBodyCreateCapsule(3,1,1)

Теперь надо бы создать для капсулы визуальную модель. Так как в Блитзе нету примитива-капсулы, то нужна для удобства собственная функция создания меша капсулы. Вот моя попытка изобрести такую функцию:

Code
Function CreateCapsule(height#,radius# )
  cyl = CreateCylinder()
  ScaleMesh cyl, radius, height-radius*1.5, radius
   
  sph = CreateSphere()
  ScaleEntity sph, radius,radius,radius
  PositionMesh sph, 0,height/2,0
  AddMesh sph, cyl
   
  PositionMesh sph, 0,-height,0
  AddMesh sph, cyl

  FreeEntity sph
  Return cyl
End Function

Конечно, можно оптимизировать её (например, попытаться удалить части сфер, которые попадают внутрь цилиндра, или убрать "шапки" цилиндров, но это долго, геморно и к PhysX'у непосредственно не относится. А для учебных целей нам вполне хватит и такой функции. Итак, теперь функция CreatepxBody выглядит так:

Code

Function CreatepxBody(x#,y#,z#)  
  pxB.pxBody = New pxBody
  fig = Rand(1,4)
  Select fig
  Case 1 ; куб
  pxB\mesh = CreateCube()
  pxB\body = pxBodyCreateCube(1,1,1,1)
  Case 2 ; цилиндр
  pxB\mesh = CreateCylinder(8)
  ScaleEntity pxb\mesh,1,3,1
  pxB\body = pxBodyCreateCylinder(1, 3, 8, 1)
  Case 3 ; сфера
  pxB\mesh = CreateSphere(8)
  pxB\body = pxBodyCreateSphere(1,1)
  Case 4 ; капсула
  pxB\mesh = CreateCapsule(3,1)
  pxB\body = pxBodyCreateCapsule(3,1,1)
  End Select
  pxBodySetPosition pxB\body,x,y,z
End Function

Теперь появляются ещё и капсулы. Понаблюдайте за ихним поведением.
А теперь - внимание! - капсула, подобно сфере, тоже является исключением из правил и рассчитывается иными алгоритмами. Потому не имеет угловатостей и рассчитывается быстрее того же цилиндра с приемлемым количеством сегментов. Помните об этом.

Полный код примера вы найдёте в аттаче "PhysXExample4.zip"

Что-то уже поздновато
Думаю, на сегодня всё. Завтра я расскажу о хуллах и тримешах.
Продолжайте экспериментировать.

PhysXExample3.zip (571 байт)
PhysXExample4.zip (727 байт)

Материал публикуется с письменного согласия автора

Источник: http://forum.boolean.name/showthread.php?p=109281

Категория: PhysX | Добавил: Spidy (04.03.2010) | Автор: Автомат W
Просмотров: 7416 | Комментарии: 1 | Теги: PhysX, враппер | Рейтинг: 0.0/0
Всего комментариев: 1
1 kxm8595  
0
Привет всем, дайте пожалуйста ключ от физикса плиз на почту kxm.pl@yandex.ru
и желательно сам физикс, а то я незнаю где его качать((

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Newton [1]
библиотека nwphx.dll
PhysX [2]
Форма входа

Наш опрос
Сколько проектов Вы начинали (в скольких участвовали)?
Всего ответов: 144
Поиск
Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0
Друзья сайта
  • Все об умных часах и фитнес-браслетах
  • Все о поездах и железных дорогах!
  • Aндроид-клуб
  • Автоистория СССР
  • Блог о wordpress
  • Ноты для фортепиано

  • WIFI DIRECT

    все для wordpress



    умные часы Swatch
    умные очки Sony
    умные часы Fitbit Surge