|
Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр |
07.11.2013, 20:51
|
#1
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Распознавание коллизий
Какие есть способы определения коллизий произвольных тел?
P.S. На ум приходит только уравнение плоскости полигона и проверка положения вертексов стороннего тела относительно этого полигона.
__________________
|
(Offline)
|
|
07.11.2013, 23:09
|
#2
|
|
Ответ: Распознавание коллизий
самое простое - разбиваешь на выпуклые тела и проверяешь уже между ними
|
|
|
07.11.2013, 23:29
|
#3
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Распознавание коллизий
Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?
__________________
|
(Offline)
|
|
07.11.2013, 23:41
|
#4
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Распознавание коллизий
Хотя нет, работает. Самый примитив(столкновение с кубом):
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
__________________
|
(Offline)
|
|
08.11.2013, 02:22
|
#5
|
|
Ответ: Распознавание коллизий
Сообщение от Devilox
Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?
|
в реальной жизни нету такого, на то она и реальная жизнь - не все тела можно задать треугольниками, такие тела как сфера, цилиндр, капсула задаются формулами
- проверка коллизии trimesh vs trimesh есть, но она настолько дорогая и проблемная что везде пытаются от нее избавится
- самая адекватная замена trimesh это разбить его на несколько convex (выпуклые объекты)
- в свое время такой движок как ODE вообще не поддерживал trimesh vs trimesh коллизии
- во всех физ движках написана куча функций проверок в стиле sphere vs capsule, sphere vs convex, convex vs convex и тд
|
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2013, 10:01
|
#6
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Распознавание коллизий
В таком случае остаётся понять, как делить объект на части. Существуют ли общепринятые алгоритмы?
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:15.
|