Хауди хоу, мои невероятные друзья, я снова с вами! Впрочем, это немного не из моего репертуара. После долгого перерыва статьи в этом топике продолжаются, постараюсь писать почаще. Сегодня на повестке дня Хиндж.
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)
Удаляется Хиндж точно так же, как и Сферикал, то есть так:
Так что удаление джойнтов по левому шифту будет работать без проблем.
Полный код примера вы найдёте в аттаче "PhysXExample14.zip"
Следующий пост будет посвящён регдоллу
(напишу пост после получения аттестата)