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

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

Blitz-физика
  Большинство уважаемых читателей играло в такие шедевры игровой индустрии как DOOM, Half-Life и др.? Наверняка вы наслаждались физикой в этих играх: реалистичным поведением и взаимодействием предметов. Тем, как катится бочка или кантуется ящик. Оказывается, такую физику можно сделать даже на Blitz. Об этом и пойдет речь в предлагаемом цикле статей.
  В начале будет немного теории. Я знаю, теория не настолько интересна, как программирование. Но без нее дальше будет много непонятного. Потом коротко рассмотрим существующие физические движки. В конце приведу пример создания физического мира. Материал совсем новый, постараюсь изложить ясно и остановится на нужных моментах более подробно.
  Мы не будим писать физику предметов с нуля. Это очень трудоемкий и очень долгий процесс. Для этого существуют так называемые физические движки. Физический движок — это программа, которая рассчитывает физику предметов, сделанная для применения в играх и в других приложениях. Используется в играх как отдельный модуль для создания физического мира. На данный момент наиболее популярны: ODE, Newton, Takomak, Havok и PhysX. ODE — бесплатный и распространяется с исходным кодом. Newton тоже бесплатный, обладает высокой стабильностью, но по этой причине, увы, проигрывает в скорости. Havok и PhysX — самые быстрые, обладают очень большим спектром возможностей. Havok знаком по игре Half–Life 2, для нее он и был разработан. К сожалению, по причине его дороговизны я не смог его оценить. На PhysX игры только начали появляться. Вот игры, которые используют этот движок:

• Tom Clancy's Ghost Recon Advanced Warfighter;
• Rise of Nations: Rise of Legends (патч);
• Bet on Soldier: Blood Sport (патч);
• Bet on Soldier: Blood Of Sahara Expansion Pack;
• CellFactor: Combat Training;
• City of Villains (патч);
• Gunship Apocalypse;
• Stoked Rider: Big Mountain Snowboarding;
• Switchball.

  Остановимся на PhysX и в дальнейшем будем делать все только на нем. Почему именно он? PhysX намного быстрее других движков, очень гибок в настройках, имеет богатый спектр возможностей (их мы оценим по ходу изучения), а главное — его можно использовать бесплатно на условиях рекламы (иначе говоря, в вашей игре вы должны всеми возможными способами расхваливать PhysX, но можно поступить и иначе — просто заплатить кругленькую сумму долларов).
  Если кто-то еще не знает, то PhysX был разработан компанией AGEIA для плат PhysX. Плата предназначена для ускорения просчета физики. Вот что нам обещает производитель чипа:

• динамика твердого тела;
• универсальный детектор столкновений;
• анализ конечных элементов;
• динамика мягких тел;
• движение жидкостей;
• симулятор волос и одежды;
• позволяет рассчитывать физику нескольких сотен предметов одновременно ( рис. 1).


  К сожалению, в бесплатной версии половиной возможностей невозможно воспользоваться. Недоступны будут, например, движение жидкостей, симулятор волос и одежды.
  Но то, что нам нужно, будет прекрасно работать и без денег. Конечно, есть недостатки: придется качать пятимегабайтный драйвер. Без него никак . PhysX не работает под «реликтовой» Windows 98 и ей подобными.
  Теперь вы знаете, что такое физический движок и знаете где он применяется. Приступим к делу. Качаем драйвера: itmbin.nm.ru/physx/physx.zip — 5 метров (самые последние дрова можно закачать на сайте support.ageia.com, там же можно узнать подробную информацию), инсталлируем. Качаем PhysX — ddownloadd.nm.ru/Blitzpx.rar (либо смотрите на сайте dev.swargo.com в файлах, там буду выкладывать уроки и последние обновления — следите за новостями). Теперь ВНИМАТЕЛЬНО: в архиве два файла — Blitzpx.dll и Blitzpx.decls. Копируем их в папку X:\Blitz3d\userlibs. Все, движок готов к использованию. Создаем в блитце новый проект.
 
Graphics3D 640,480
SetBuffer BackBuffer() ;создаем камеру
cam=CreateCamera()
PositionEntity cam,0,3,-10 ;создаем свет
light=CreateLight()
PositionEntity light,15,66,15 ;создаем плоскость
plane=CreatePlane()
EntityColor plane,0,200,100 ;Инициализация физики
PxCreateWorld(1) pxSetGravity(0,-10,0) ;физика кубика
cube_body = PxCreateCube(1,1,1,3,2)
pxSetPosition cube_body,0,7,0
pxSetRotation cube_body,30,0,40
cube_mesh=CreateCube()
Repeat ;расчет физики
RenderPhysic(30, 0)
pxSetEntity(cube_mesh, cube_body)
UpdateWorld()
RenderWorld()
Flip
Until KeyHit(1)
End

  Теперь разберем каждую команду и все параметры функций по отдельности.
PxCreateWorld(1) — эта функция создает мир. Параметр 1 включает плоскость, с которой взаимодействуют предметы, 0 — отключает. Это самая первая команда в физике. Все остальные пишутся после.
  pxSetGravity(0,-10,0) — устанавливает вектор гравитации. В нашем случае ускорение свободного падения равно 10 м/с*с и направлено к земле. По умолчанию — 9.8.
  PxCreateCube(x, y, z, mass, dens) — эта функция создает параллелепипед с размерами по осям x, y, z и массой mass. Dens — плотность, пока об этом знать не обязательно, просто ставьте 1. В нашем случае мы создаем кубик с ребрами длиной 1 и массой 3.
  Функции pxSetPosition body, x, y, z и pxSetRotation body, pitch, yaw, roll устанавливают кубик в точке x, y, z и разворачивают под углами pitch, yaw, roll. То есть кубик будет создан в точке 0,7,0 и развернут под углами 30,0,40. 
  RenderPhysic(30,0) — рассчитывает физику всех предметов в сцене. 30 — время просчета физики: чем больше время просчета, тем меньше требуется ресурсов от компьютера. 0 — синхронизация отключена, 1 — включена. Синхронизацию следует использовать, если у вас в сцене число тел не превышает 400.
 
  pxSetEntity(cube_mesh, cube_body) — определяет каркас (меш) кубика для созданного нами физического тела. Можно обойтись без этой команды. Альтернативный способ рассмотрим потом.
 
  В сцене можно наложить текстуры на кубик и плоскость. Это придаст реалистичный вид нашему творению. Из кубика можно сделать деревянный ящик, картонную коробку или кирпич :-). Вот что получилось у меня ( рис. 2).

  Как видите, всего несколькими строчками можно описать полную физику кубика. Можете попробовать сами создать несколько кубиков. Только учтите, что кубики не должны лепиться друг на друга. Просто меняйте позицию каждого следующего тела. Вроде бы ничего сложного нет. Если возникнут вопросы — пишите. В следующий раз рассмотрим физику сферы, капсулы и некоторые настройки тел.
 


Источник: http://mycomp.com.ua
Категория: PhysX | Добавил: blitz3d (07.12.2007) | Автор: Андрей ГУТЫРЯ aka Render
Просмотров: 10388 | Комментарии: 14 | Рейтинг: 5.0/7
Всего комментариев: 131 2 »
13 Cfyz  
0
народ а есть у кого нить лицензия физикса для блитц ? а то демка всего 60 обьектов поддерживает (((

12 BSA  
0
Да ну какая тут физика Blitz3D? Это физика PhysX в Blitz3D!

11 kisik  
0
super ! prodoljaite delat sait dobavte statii po sozdaniu setevix igr pliz.

10 Anwind  
0
Вот есть хороший учебник http://forum.boolean.name/showthread.php?t=7568 Пример там же взял, для тех у кого, местный пример не работает, как и у меня, этот должен.
Graphics3D 640,480
SetBuffer BackBuffer()
;--------------------------------------------------------------------------------- ------------------------
pxCreateWorld(1,"");она и говорит Блитзу, что отныне в проекте используется Физикс
;камера--------------------------------------------------------------------------- ---------------------
cam = CreateCamera()
PositionEntity cam,0,10,-20
CameraClsColor cam,0,128,255
;свет----------------------------------------------------------------------------- ----------------------
light=CreateLight()
PositionEntity light,15,66,15
;так сказать земля---------------------------------------------------------------------------- -------
plane = CreatePlane()
EntityColor plane,64,128,128
;то что будет падать--------------------------------------------------------------------------- ----
Cube = CreateCube()
Body = pxBodyCreateCube(1,1,1,1);пользоватья ей нужно так же, как и простым блитзевским CreateCube().
pxBodySetPosition Body,0,50,0;функция, по сути, аналогична Блитзевской PositionEntity.

Repeat

UpdateWorld()
pxRenderPhysic(60,0);она собственно и обновляет физику.
pxBodySetEntity(Cube,Body);это тело, которое нужно устанавить в позицию и поворот соответствующего тела, body.
RenderWorld()
Flip
Until KeyHit(1)
End


9 Anwind  
0
На счет продолжения вот сылка на крутой учебник http://forum.boolean.name/showthread.php?t=7568
Пример там же взял, у всех кого не работал пример выше, этот должен работать, у меня верхний то же не пахал, это норм.
Graphics3D 640,480
SetBuffer BackBuffer()
;--------------------------------------------------------------------------------- ------------------------
pxCreateWorld(1,"");она и говорит Блитзу, что отныне в проекте используется Физикс
;камера--------------------------------------------------------------------------- ---------------------
cam = CreateCamera()
PositionEntity cam,0,10,-20
CameraClsColor cam,0,128,255
;свет----------------------------------------------------------------------------- ----------------------
light=CreateLight()
PositionEntity light,15,66,15
;так сказать земля---------------------------------------------------------------------------- -------
plane = CreatePlane()
EntityColor plane,64,128,128
;то что будет падать--------------------------------------------------------------------------- ----
Cube = CreateCube()
Body = pxBodyCreateCube(1,1,1,1);пользоватья ей нужно так же, как и простым блитзевским CreateCube().
pxBodySetPosition Body,0,50,0;функция, по сути, аналогична Блитзевской PositionEntity.

Repeat

UpdateWorld()
pxRenderPhysic(60,0);она собственно и обновляет физику.
pxBodySetEntity(Cube,Body);это тело, которое нужно устанавить в позицию и поворот соответствующего тела, body.
RenderWorld()
Flip
Until KeyHit(1)
End


8 Gamedev  
0
Кто может Дайте ссылку на PhysX для Блитца пожалуйста cry surprised sad

7 XpatrikX  
0
Народ, не знаете где хелп на русском скачать?

6 blitz3d_GOD  
0
скажите пожалста где можно полный help для PhysX скачать а то я меня есть какой то но там ваще описание команд маленькое по одному предложению всего и не описываються дополнительные параметры к функциям и примеров нет и ваще хрень какая то у меня а не help

5 minotaurus  
0
ссылка на драйвер не работает
и сайта dev.swargo.com-нет

4 артём  
0
Я физику установил и дрова все какие нашёл у меня все как бы работает и даже командные слова от физики выделяет как остальные, но он не рендерит её, то есть не визуализирует и пишет что команда RenderPhysic не существует, хотя сам её выделяет командой. Памагите мне пожалуйста что надо сделать что бы Blitz3D физику у меня визуализировал и не чего не просил

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

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


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

  • WIFI DIRECT

    все для wordpress



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