Показать сообщение отдельно
Старый 21.06.2009, 20:57   #13
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Учебник по PhysX Wrapper для Blitz3D

Хауди хоу, мои невероятные друзья, я снова с вами! Впрочем, это немного не из моего репертуара. После долгого перерыва статьи в этом топике продолжаются, постараюсь писать почаще. Сегодня на повестке дня Хиндж.

Hinge.

Это тоже очень распространённый вид сочленения. Это уже не шарнир (как сферический джойнт), а рычаг, который имеет лимит в виде плоского сектора. Посмотрите на картинку:



Как видно из неё, красный цилиндр уже не может свободно болтаться, а может только вращаться в серой плоскости.

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

Приступим к практике. Возьмём предыдущий пример (13-й, если мне память не изменяет) и заменим сферический джойнт на хиндж, а заодно увидим разницу в динамике.

Находим строчвку, где сцепляли два куба джойнтами. Нам необходимо создать хиндж, значит нам нужна команда:

pxJointCreateHinge%( body1%, body2%,x#,y#,z#,nx#,ny#,nz#)
Создаёт Хиндж, возвращает его хендл (если всё ок), или 0 (если почему-то не создалось) или BSOD, кому как повезёт (насчёт BSOD - шутка)

Параметры идентичны pxJointCreateSpherical, а именно:

body1, body2 - тела, которые будем сцеплять.
x, y, z - координаты джойнта при его создании.
nx, ny, nz - нормализованный вектор направления оси джойнта.

Внимание! Тела body1, body2 должны быть динамическими (т.е. иметь массу <> 0). Если вы хотите привязать тело к статике, то подставьте 0 вместо статического тела.

Теперь с чистой совестью заменяем Сферикал на Хиндж:

Joint = pxJointCreateHinge (Cube1\Body,Cube2\Body,x,y,z,0,1,0)
В принципе можно уже запустить и посмотреть на результат (не забудьте убрать то, что относится к сферикалу, иначе получите форточку)

Таак, крутится-то не в той плоскости. Меняем вектор направления оси хинджа:

Joint = pxJointCreateHinge (Cube1\Body,Cube2\Body,x,y,z,0,0,1)
Ну вот, теперь вращение намного более заметно. Как вы можете видеть, оно происходит только в одной плоскости.



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

Коллизию, как вы уже догадались, можно при необходимости врубить, вот так:

pxJointHingeSetCollision(joint%)
joint - джойнт, между телами которого надо включать коллизию.

юзаем:

pxJointHingeSetCollision(joint)
Как и в случае с любым другим джойнтом, лучше ограничивайте угол лимита, бо результат тот же, а жрёт меньше, если только по-другому ну совсем уж никак.

А вот так ограничивается угол:

pxJointHingeSetLimit(joint%,min#,max#)
Аргументы тут попроще, чем в случае со сферическим. Указывается только максимальное и минимальное значение углов.

joint - джойнт, с которым будет производиться манипуляция
min - минимальный угол
max - максимальный угол

Посему коллизию убираем, а юзаем лимит:

pxJointHingeSetLimit(joint,-30,30)
Контроля кручения вокруг своей оси по понятным причинам в Хиндже нет.
А вот растяжимость менять можно:

pxJointHingeSetLimitSpring(joint%,spr#,targetVal#)
Указывает растяжимость соединения. Аргументы те же, что и у сферического джойнта, вот только дампа нету:
joint - джойнт
spr - эластичность. По дефолту 0, может принимать значения от 0 до бесконечности.
targetVal - значение к которому стремиться. По дефолту 0.

Варнинг! Когда я попытался запустить это, у меня вылезла ошибка, мол, Function not found. Произошло это от того, что функция в хелпе есть, а в деклзе - нет. Путём ковыряния в либе Hex-редактором (да простят меня афторы: ведь не корысти ради, а народа для!) я нашёл решение траблы. Если у вас будет то же самое, то делаем такие действия: лезем в папку с блицом -> userlibls -> Blitzpx.decls (открывать Виндосовским Блокнотом) и где-нибудь (желательно рядом с остальными командами, имеющими отношение к джойнтам) прописываем такую строчку:
pxJointHingeSetLimitSpring(joint%, spr#, targetVal#):"_pxJointHingeSetSpring@12"
Теперь всё ок, можно запускать.
З.Ы. Написал Рендеру, обещал в ближайшей версии исправить.


Юзаем:

pxJointHingeSetLimitSpring(joint,10,0)
Удаляется Хиндж точно так же, как и Сферикал, то есть так:
pxDeleteJoint (joint)
Так что удаление джойнтов по левому шифту будет работать без проблем.

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

Следующий пост будет посвящён регдоллу (напишу пост после получения аттестата)
Вложения
Тип файла: zip PhysXExample14.zip (661 байт, 1617 просмотров)
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 21 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
3dr1aN (21.06.2009), Arles (27.10.2010), Blender (17.01.2010), Brain (15.01.2010), den (27.07.2010), Diablomania (14.08.2009), FireOwl (11.02.2010), h1dd3n (22.06.2009), Harter (08.10.2009), Hurrit (16.05.2010), Main Cry (28.06.2009), Nex (23.06.2009), PackegerX (03.02.2010), Randomize (03.07.2009), Slavik (28.06.2009), strayhnd (30.06.2010), Tadeus (22.06.2009), tormoz (21.06.2009), viper86 (16.07.2009), WhiteBlack (27.07.2010), ІГРОГРАЙКО (02.07.2009)