Столкновение двух Meshcollider

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

Столкновение двух Meshcollider

Сообщение Gray-33 14 ноя 2012, 19:23

Здравствуйте!
Есть ли способ узнать точку контакта и нормаль к поверхности при столкновении(пересечении) двух Meshcollider?
Convex применить нельзя, нужна встреча именно при касании поверхностей, при convex будут варианты касания "пустых" частей. Просто rigidbody применить тоже не выйдет для данной задачи-оба объекта двигаются под управлением скриптов. В Unity вообще это возможно?
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение Gray-33 16 ноя 2012, 15:45

RaycastHit должен ведь видеть Meshcollider(isTrigger=true) без Convex?
Если использовать Raycast-сильно они вообще влияют на производительность? Скажем, по 8-10 лучей каждый кадр.
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение Gray-33 17 ноя 2012, 09:37

Может кто-нибудь подскажет в какую сторону копать?
Задача - есть персонаж, правая рука управляется скриптами: считывается input с мыши, рассчитываются нужные углы в суставах, перемещается рука из невидимых gameobjects(виртуальная рука), к их положениям приравниваются положения соответствующих костей руки персонажа, к кости кисти привязан объект-оружие. Нужно ввести физику.
Пробовал собрать виртуальную руку из rigidbody, соединенных hingejoint и управляемых с помощью spring или motor. Получается не очень стабильная система, главная проблема-при быстрых движениях объекты проскакивают сквозь друг друга и т.д.. Решил отказаться от этого способа.
Собственно, полностью физическая рука и не нужна. Все взаимодействия в случае коллизий можно описать самому. Вопрос-как сделать считывание этих коллизий? Навесить trigger'ов, превышающих размеры объектов виртуальной руки и оружия, и пускать Raycast в случае срабатывания одного из них? Пускать Raycast из каждого сустава в сторону его нового положения на длину перемещения?
Если кто-то сталкивался с чем-то подобным, подскажите, пожалуйста, лучший на ваш взгляд способ.

Пример того что есть на данный момент(без физики):
У вас нет доступа для просмотра вложений в этом сообщении.
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение lol 17 ноя 2012, 10:22

Что-то я не пойму, почему нельзя обвесить обычными бокс-коллайдерами и проверять на OnTriggerEnter или OnCollisionEnter, там на входе есть Collision, у которого есть точка и нормаль.
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Столкновение двух Meshcollider

Сообщение Gray-33 17 ноя 2012, 18:03

Скажем, секиру или саблю трудновато боксколлайдерами обвесить-да и выглядеть все равно будет не особо правдоподобно.
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение lol 17 ноя 2012, 22:42

Никто все равно не делает точечные коллизии ибо:
1) Это затратно
2) Игрок все равно скорее всего не заметит разницы в порыве боя
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Столкновение двух Meshcollider

Сообщение Gray-33 17 ноя 2012, 23:41

2) Собственно я и вожусь с процедурной анимацией чтобы было именно полноценное фехтование. Удар по любой траектории, криволинейной и изменяемой игроком в любой момент. Если упрощать-смысл пропадет, не получится дожимать оружие противника, закручивать его в блоке, делать финты и т.п..
1) Вот в том и вопрос-насколько затратно? Насколько Raycast затратны? И какой способ менее прожорлив-переферия из триггеров(зоны, выступающие за пределы оружия, кисти, локтя и плеча), с пусканием 1-2 лучей в сторону сработавшего триггера, или делать без триггеров, лучей 7-8? Или есть лучший способ?
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение AndreyMust19 18 ноя 2012, 00:06

Ну для шпаги или меча достаточно Box Collider, главное повернуть его так же, как лезвие.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Столкновение двух Meshcollider

Сообщение lol 18 ноя 2012, 10:25

2) Насчет процедурной анимации, в новой юнити про есть вроде IK.
1) я просто не представляю как можно рейкастом сделать точные коллизии? Пускать лучи из каждого сантиметра полигона?
Если тебя в проекте не будет кучи монстров, сложных сцен, а будет бой 2x2 на одной сцене, то, конечно, можно больше CPU потратить на проработанность боя.
Насчет ковекса, возможно, если разбить оружие на простые детали, каждая из которых хотя бы почти была выпуклой, то пустоты удалось бы минимизировать.
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Столкновение двух Meshcollider

Сообщение Gray-33 18 ноя 2012, 13:33

2) Процедурная анимация уже написана и работает как и хотелось. Пробовал на IK - хуже, нужен именно контроль каждого сустава в отдельности.
1) А если использовать BoxCollider - по таблице Collision action matrix - оба оружия должны иметь rigidbody => встроенная физика будет принимать участие в процессе, а нужно только точку контакта и нормаль узнать. Вот в этом вся проблема...
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение lol 18 ноя 2012, 14:30

Ставь ригидбоди IsKinematic, чтобы физика не воздействовала. А коллайдеру скорее всего нужно будет поставить галку IsTrigger.
lol
Старожил
 
Сообщения: 508
Зарегистрирован: 15 ноя 2009, 10:48
Откуда: Москва

Re: Столкновение двух Meshcollider

Сообщение Gray-33 18 ноя 2012, 16:04

Kinematic rigidbody collider не дает коллизии с другим kinematic rigidbody collider, а у игроков не может быть у одного kinematic rigidbody а у второго просто rigidbody. Trigger не дает точки и нормали-только сработал или не сработал.
Все сводится к решению задачи: получить коллизию, точку контакта и нормаль к поверхности, но при этом чтобы физический движок никаких действий в отношении объектов не применял.
Почему так сложно сделать это штатной возможностью движка, мне лично непонятно-в сети куча тем с такими же бедолагами как я :)
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение Gray-33 18 ноя 2012, 20:39

Последовал совету lol, использовал составной коллайдер из боксколлайдеров.
В итоге получилось перехитрить физический движок!
Если кому пригодится:
1) Добавляем rigidbody к объекту "weapon". Ставим галочку isKinematic.
2) Создаем пустой объект "collider1" и назначаем ему родителя - объект "weapon".
3) Добавляем объекту "collide1" любой нужный примитив-коллайдер. Настраиваем его.
4) Добавляем rigidbody к объекту "collide1". Ставим все галочки во вкладке Constraints (FreezeAll).
5) Добавляем FixedJoint к объекту "collide1". Назначаем "weapon" в качестве Connected Body.
6) Повторяем пункты 2-5, создавая n-объектов collide[n], пока не получим составной коллайдер достаточно близкий к форме mesh'а "weapon".

В результате можно спокойно двигать оружие, считывать Collision, ContactPoint и Normal из функции OnCollisionEnter, но оно свободно проходит сквозь такое же оружие, например, не смещаются коллайдеры при взаимодействии с любым rigidbody(само rigidbody получает удар-но это уже решается предстоящими скриптами вашей собственной физики). Остается возможность считывать коллизии с Meshcollider'ами, т.к. коллайдер самого оружия собран из примитивов. Единственное что пришлось еще сделать-убрать галочку "use fixed update" в CharacterMotor - иначе при движении персонажа оружие вылетало из руки и потом ее догоняло :)
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение Gray-33 18 ноя 2012, 22:46

Не совсем в тему вопрос, но все же: у меня коллайдеры чилдрены посылают сообщения о столкновении в скрипт родителя, соответственно при отсутствии столкновения посылают false. В результате нет устойчивого контакта-коллизия считывается но тут же стирается. Как лучше организовать state коллизии по типу "логического ИЛИ"?
Gray-33
UNец
 
Сообщения: 31
Зарегистрирован: 04 фев 2012, 23:03

Re: Столкновение двух Meshcollider

Сообщение 6opoDuJI0 18 ноя 2012, 22:54

Gray-33 писал(а):Не совсем в тему вопрос, но все же: у меня коллайдеры чилдрены посылают сообщения о столкновении в скрипт родителя, соответственно при отсутствии столкновения посылают false. В результате нет устойчивого контакта-коллизия считывается но тут же стирается. Как лучше организовать state коллизии по типу "логического ИЛИ"?

непонял
Насколько я знаю, в момент начала коллизии посылается OnCollisionEnter.
Откуда тут булини?
С тем-же успехом вызывается OnCollisionStay с начала OnCollisionEnter и до самого OnCollisionExit.
А вам тоже нравится в мороз выпускать изо рта тонкую струйку пара и чувствовать себя драконом?:)
Аватара пользователя
6opoDuJI0
UNIт
 
Сообщения: 85
Зарегистрирован: 06 янв 2010, 20:00

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24