Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Математика

Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр

Ответ
 
Опции темы
Старый 07.11.2013, 20:51   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Распознавание коллизий

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

P.S. На ум приходит только уравнение плоскости полигона и проверка положения вертексов стороннего тела относительно этого полигона.
__________________
(Offline)
 
Ответить с цитированием
Старый 07.11.2013, 23:09   #2
jimon
 
Сообщений: n/a
Ответ: Распознавание коллизий

самое простое - разбиваешь на выпуклые тела и проверяешь уже между ними
 
Ответить с цитированием
Старый 07.11.2013, 23:29   #3
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Распознавание коллизий

Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?
__________________
(Offline)
 
Ответить с цитированием
Старый 07.11.2013, 23:41   #4
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 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
jimon
 
Сообщений: n/a
Ответ: Распознавание коллизий

Сообщение от Devilox Посмотреть сообщение
Это-то понятно, но меня интересует именно определение столкновения в общем, пересчёт - это уже после. "произвольных тел" я написал, чтобы отделить алгоритмы, работающие как для куба, так и для более сложных фигур.
Я вот вспомнил ещё метод: задать параллелепипед двумя координатами, а потом проверить, пересекает ли какой-нибудь вертекс стороннего тела заданную область.. Метод работает, но только для одной стороны. Можно его как-нибудь доработать?
в реальной жизни нету такого, на то она и реальная жизнь
  • не все тела можно задать треугольниками, такие тела как сфера, цилиндр, капсула задаются формулами
  • проверка коллизии trimesh vs trimesh есть, но она настолько дорогая и проблемная что везде пытаются от нее избавится
  • самая адекватная замена trimesh это разбить его на несколько convex (выпуклые объекты)
  • в свое время такой движок как ODE вообще не поддерживал trimesh vs trimesh коллизии
  • во всех физ движках написана куча функций проверок в стиле sphere vs capsule, sphere vs convex, convex vs convex и тд
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (08.11.2013)
Старый 08.11.2013, 10:01   #6
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Распознавание коллизий

В таком случае остаётся понять, как делить объект на части. Существуют ли общепринятые алгоритмы?
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com