Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];

Вниз

Коллизии кубиков   Найти похожие ветки 

 
pasha676   (2003-06-02 12:53) [0]

Подобная тема уже не раз всплывала в размых темах форума. Хотелось бы обсудить поподробнее.

Постоновка задачи.
Дано два 3D-объекта. Каждый описывается габаритным контейнером. Контейнер описывается шестью точками и есть собственно прямоугольник. Как отловить факт пересечения оптимальным способом?

Мне в голову пока идет только одно решение - лобовое. Считаем пересечение каждой из сторон первого кубика с каждой из сторон второго кубика. При этом считаем по принцыпу пересекающихся плоскостей+потом сравнение на принадлежность к сторонам.

Но может быть более оптимальное решение?


 
Mirovodin   (2003-06-02 13:26) [1]

Немного оптимизируем.

Дно куба A1,A2,A3,A4. Вершиа B1,B2,B3,B4. Соединяем A1-В4 диагональ или диаметр описанной сферы. Проще сначало проверять расстояния между центрами этих сфер всего 1 вычисление. Т.к. диаметр и его половину можно рассчитать заранее. Так сразу отметается половина столкновений, а уж если условие выполнилось, то по твоему алгоритму.


 
JohnJ   (2003-06-02 16:57) [2]

А тупо проверить каждую точку не быстрее будет?
Я сейчас прикинул и думаю, что не быстрее! А со сферой - вообще классно придумано! :)


 
Mirovodin   (2003-06-02 17:05) [3]

Можно еще оптимизировать, я подумаю как это можно сделать. Но вся проблема в том, что в итоге все равно придётся анализировать плоскости, если хотим узнать как именно столкнулись объекты.


 
pasha676   (2003-06-02 17:09) [4]

Со сферой хорошо, если априорно паралепипеды действительно близки к кубической форме и/или предметы находяться достаточно далеко друг от друга. Хороший выигрыш. А вот если предметы вытянутые и рядом... то сфера к сожалению ничего не даст :(.


> А тупо проверить каждую точку не быстрее будет?

Что есть проверить каждую точку?

А есть ли алгоритм по типу находиться точка внутри другого контейнера? Если есть то может попробывать найти по каждой из восьми точек есть ли она в другом контейнере и все.




 
pasha676   (2003-06-02 17:10) [5]


> если хотим узнать как именно столкнулись объекты.


Для начала нужен факт столкновения. Если уже столкнулись - то понятно.


 
Mirovodin   (2003-06-02 17:32) [6]

2 pasha676


> А вот если предметы вытянутые и рядом... то сфера к сожалению
> ничего не даст :(.


Нее тут нужно действовать методом " разделяй и властвуй " быстрым алгоритмом мы откидываем 90%, а вот 10% которые может быть столкнулись мы анализируем точно. Можно откидывать да же по расстоянию между центрами масс объектов :
Допутим :
Если > 10 м. - 100% не столкнуться.
< 10 м. начинаем сложный анализ.

Порог можно подбирать исходя из размеров самых замысловатых и вытянутых объектов.


 
pasha676   (2003-06-03 09:36) [7]

2Mirovodin

Я полностью согласен насчет того, что надо делать предварительный подсчет - это здорово улутшить производительность.

Вот насчет коллизии контейнеров.

Еще один алгоритм, может навскидку скажешь будет ли это работать и будет ли это работать быстрее плоскостей.

1) Берем вектора расположения и направления 1-го контейнера
2) Составляем матрицу преобразования (по этим векторам) - шлобальная система координат - локальная система координат контейнера.
3) Берем координаты вертексов 2-го контейнера, преобразовываем к системе координат первого и просто сравниваем покоординатно вертексы, таким образом, чтобы заметить пересечение.

Правда не совсем понятно можно ли сравнить расположение вертексов и сделать вывод о пересечении самих контейнеров...


 
Mirovodin   (2003-06-03 10:52) [8]

2 pasha676

Это конечно хорошо, мы устанавливаем факт колизии контейнеров. Но это несколько сложнее. И опять же мы установили факт стокновения контейнеров ! Но не объектов в них.

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

1. Делаем анализ расстояния между объектами т.е. расстояние между их центрами. D

2. Вычисляем радиус описанной сферы объекта - расстояние между центром и самой удаленной от нее точкой сложного объекта. R

Это было описано выше, просто уточняем, а далее новое :

3. Вычисляем радиус вписанной сферы - расстояние между центром и самой близкой к нему точкой сложного объекта. r

4. Сравниваем эти радиусы :

По результатам сравнения возможны 3 варианта :

Сумма a) R1+R2<D - объекты не столкнуться.
б) r1+r2>D - объекты столкнуться.
( результат б ) [8] 2 pasha676

Это конечно хорошо, мы устанавливаем факт колизии контейнеров. Но это несколько сложнее. И опять же мы установили факт стокновения контейнеров ! Но не объектов в них.

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

1. Делаем анализ расстояния между объектами т.е. расстояние между их центрами. D

2. Вычисляем радиус описанной сферы объекта - расстояние между центром и самой удаленной от нее точкой сложного объекта. R

Это было описано выше, просто уточняем, а далее новое :

3. Вычисляем радиус вписанной сферы - расстояние между центром и самой близкой к нему точкой сложного объекта. r

4. Сравниваем эти радиусы :

По результатам сравнения возможны 3 варианта :

Сумма a) R1+R2<D - объекты не столкнуться.
б) r1+r2>D - объекты столкнуться.
с) Сложный алгоритм проверки.

Пункты 2 и 3 делаются на этапе создания модели. Производится всего 1 вычисление D. Единственный "-" при столкновении объектов (результат б ) не известно как именно столкнулись модели. Сложные алгоритмы оценки позволяют возвращать результат - фигуру столкновения. Т.е. набор полигонов.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
11-52132
Deimos
2003-04-01 23:39
2003.12.16
помогите начинающему...


3-52101
Cat
2003-11-24 12:26
2003.12.16
На сервере-таблица, клиенту нужно к ней подключиться, нужен путь


14-52359
Думкин
2003-11-23 05:18
2003.12.16
С днем рождения! 23 ноября.


3-52118
Fighter
2003-11-24 06:03
2003.12.16
Сохранение результата запроса в dbf


3-52088
Devourer
2003-11-24 14:36
2003.12.16
Лог изменений в таблице





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский