forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   Распознавание коллизий (http://forum.boolean.name/showthread.php?t=18682)

Devilox 07.11.2013 20:51

Распознавание коллизий
 
Какие есть способы определения коллизий произвольных тел?

P.S. На ум приходит только уравнение плоскости полигона и проверка положения вертексов стороннего тела относительно этого полигона.

jimon 07.11.2013 23:09

Ответ: Распознавание коллизий
 
самое простое - разбиваешь на выпуклые тела и проверяешь уже между ними

Devilox 07.11.2013 23:29

Ответ: Распознавание коллизий
 
Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?

Devilox 07.11.2013 23:41

Ответ: Распознавание коллизий
 
Хотя нет, работает. Самый примитив(столкновение с кубом):
Код:

Function CollisionDetection()
        surf = GetSurface(sphere,1)
        For k = 1 To CountVertices(surf)
                If (VertexX(surf,k) + EntityX(sphere)) >= x1 And (VertexX(surf,k) + EntityX(sphere)) <= x2
                        If (VertexY(surf,k) + EntityY(sphere)) >= y1 And (VertexY(surf,k) + EntityY(sphere)) <= y2
                                If (VertexZ(surf,k) + EntityZ(sphere)) >= z1 And (VertexZ(surf,k) + EntityZ(sphere)) <= z2
                                        MoveEntity sphere,0,0,-v
                                EndIf
                        EndIf
                EndIf
        Next
End Function


jimon 08.11.2013 02:22

Ответ: Распознавание коллизий
 
Цитата:

Сообщение от Devilox (Сообщение 269774)
Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?

в реальной жизни нету такого, на то она и реальная жизнь
  • не все тела можно задать треугольниками, такие тела как сфера, цилиндр, капсула задаются формулами
  • проверка коллизии trimesh vs trimesh есть, но она настолько дорогая и проблемная что везде пытаются от нее избавится
  • самая адекватная замена trimesh это разбить его на несколько convex (выпуклые объекты)
  • в свое время такой движок как ODE вообще не поддерживал trimesh vs trimesh коллизии
  • во всех физ движках написана куча функций проверок в стиле sphere vs capsule, sphere vs convex, convex vs convex и тд

Devilox 08.11.2013 10:01

Ответ: Распознавание коллизий
 
В таком случае остаётся понять, как делить объект на части. Существуют ли общепринятые алгоритмы?


Часовой пояс GMT +4, время: 23:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot