OnCollisionStay и contact.point

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

OnCollisionStay и contact.point

Сообщение RestFall 20 окт 2012, 15:36

Как в OnCollisionStay узнать какой стороной коллизий произошел контакт?

т.е. передом, верхом, боком или низом?

например передо-мной стена, хочу проверить эту стену, делал рэйкастом, и отдельной коллизией, хочу узнать можно ли вот таким образом?

Синтаксис:
Используется csharp
        void OnCollisionStay (Collision coll)
        {
                grounded = true;
                foreach (ContactPoint coll_contact in coll.contacts) {
            Debug.DrawRay(coll_contact.point, coll_contact.normal * 10, Color.red);
        }
        }
 
Аватара пользователя
RestFall
UNIт
 
Сообщения: 118
Зарегистрирован: 21 мар 2012, 19:32
Откуда: Kazakhstan, Apple city
  • Сайт

Re: OnCollisionStay и contact.point

Сообщение AndreyMust19 20 окт 2012, 16:39

Считать вектор между центром объекта (центр коллайдера) и точкой касания, нормализировать его и смотреть координаты x, y, z.
Координата, к-я по модулю больше всех остальных, определяет сторону касания:
1) Если это Y и он меньше 0, значит касание "снизу", если больше 0, то "сверху".
2) Если это X и он меньше 0, значит слева, иначе "справа".
3) Если это Z и он меньше 0, то "сзади", иначе - "спереди".
Вместо вектора от центра объекта к точке касания можно брать contact.normal, но только помните что направление касания будет в обратную сторону (больше-меньше нуля поменяются местами).
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: OnCollisionStay и contact.point

Сообщение RestFall 20 окт 2012, 17:05

AndreyMust19 писал(а):Считать вектор между центром объекта (центр коллайдера) и точкой касания, нормализировать его и смотреть координаты x, y, z.
Координата, к-я по модулю больше всех остальных, определяет сторону касания:
1) Если это Y и он меньше 0, значит касание "снизу", если больше 0, то "сверху".
2) Если это X и он меньше 0, значит слева, иначе "справа".
3) Если это Z и он меньше 0, то "сзади", иначе - "спереди".
Вместо вектора от центра объекта к точке касания можно брать contact.normal, но только помните что направление касания будет в обратную сторону (больше-меньше нуля поменяются местами).


хммм, а как найти касание по модулю, т.е. как нормализовать координаты?

если юзать contact.normal то выходит что x: -1 это правая сторона, +1 левая, по z: -0,99999 это перед, если касаюсь задом то уже +0,99999, если не касаюсь не передом не задом, то z: 2,226999797 и т.д.... значения какие то нестабильные, как получить значения понадежнее?

конечно можно закрепить за значениями типа больше меньше того то, но если они изменятся, появится баг что не есть гуд...
Аватара пользователя
RestFall
UNIт
 
Сообщения: 118
Зарегистрирован: 21 мар 2012, 19:32
Откуда: Kazakhstan, Apple city
  • Сайт

Re: OnCollisionStay и contact.point

Сообщение AndreyMust19 20 окт 2012, 18:57

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

Re: OnCollisionStay и contact.point

Сообщение AMD 20 окт 2012, 21:18

Аналогичным вопросом задавался... делал по принципу райкаста, пускаемого во все шесть сторон на малое расстояние, и в зависимости от того, какой возвращает значение и делаю вывод.

Так же еще пытался сделать выводы основываясь на повороте объекта, относительно стандартного, однако тут... мягко говоря идиотизмом показалось... потому не стал.
(СС не использую)
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: OnCollisionStay и contact.point

Сообщение RestFall 20 окт 2012, 23:51

AndreyMust19 писал(а):как нормализовать вектор: Vector3.normalized
модуль: Mathf.Abs

спасибо за помощь!) решил просто высчитывать из contact.normal)
Аватара пользователя
RestFall
UNIт
 
Сообщения: 118
Зарегистрирован: 21 мар 2012, 19:32
Откуда: Kazakhstan, Apple city
  • Сайт

Re: OnCollisionStay и contact.point

Сообщение RestFall 21 окт 2012, 00:03

AMD писал(а):Аналогичным вопросом задавался... делал по принципу райкаста, пускаемого во все шесть сторон на малое расстояние, и в зависимости от того, какой возвращает значение и делаю вывод.

Так же еще пытался сделать выводы основываясь на повороте объекта, относительно стандартного, однако тут... мягко говоря идиотизмом показалось... потому не стал.
(СС не использую)

в итоге смог добится как бы выразится... более плавного игрового процесса, чем с рэйкастами) ведь использовать один основной несущий капсуль коллайлер вместо 6 рэйкастов это как минимум логично) и производительнее)
Аватара пользователя
RestFall
UNIт
 
Сообщения: 118
Зарегистрирован: 21 мар 2012, 19:32
Откуда: Kazakhstan, Apple city
  • Сайт

Re: OnCollisionStay и contact.point

Сообщение AMD 21 окт 2012, 01:17

Скрытый текст:
Почти оффтоп
Рейкасты можно использовать не только для определения в пространстве положения, но и ограничить возможность персонажа на большой скорости пробегать препятсвия.
Так что два в одном (а позже может и больше чем два) :)
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва


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

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

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