Sliding Collision

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Sliding Collision

Сообщение Vovik » 02.03.2005 (Ср) 20:12

Собсно вот с чем столкнулся... У меня есть коробка... Простая коллизия с ней - эт ерунда - луч с треугольником (да и инфы в сети хватает)... А вот чтоб скользила по стороне в зависимости от угла - тут уже трудности... Может кто сталкивался? Теория или примеры.... хоть че-нть...ну очень нуна :cry:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.03.2005 (Ср) 20:29

По теории столкновений на форуме чуть раньше. У меня в ДХ7 и не зависело от угла (типа "уткнулся-застрял") . Думаю не мешало-бы повторно, более глубоко заняться.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 02.03.2005 (Ср) 23:32

Yurich писал(а): Думаю не мешало-бы повторно, более глубоко заняться.
Давно пора! :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 02.03.2005 (Ср) 23:50

Vovik писал(а):
Yurich писал(а): Думаю не мешало-бы повторно, более глубоко заняться.
Давно пора! :roll:

Только в купе с ВАМИ!
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 02.03.2005 (Ср) 23:57

Yurich писал(а):
Vovik писал(а):
Yurich писал(а): Думаю не мешало-бы повторно, более глубоко заняться.
Давно пора! :roll:

Только в купе с ВАМИ!


о... не советую! щас Вован тебя вопросами затопит :lol:



а вообше что именно вы хотите? для каких обхектов? для какого применения?
ХЎ

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 04.03.2005 (Пт) 18:35

Вообще надо вот это http://gdlinks.hut.ru/cdfaq/obb.shtml#obb ... но проблемы с с++ :oops:

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 04.03.2005 (Пт) 21:59

там не Sliding Colision Detection, а просто детекция столкновений, которая возвращает Да\нет. Скользящую детекцию все равно придется придумывать самому =)
ХЎ

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 05.03.2005 (Сб) 3:06

d3drm писал(а):там не Sliding Colision Detection, а просто детекция столкновений, которая возвращает Да\нет. Скользящую детекцию все равно придется придумывать самому =)
Я понимаю... мне хотяб этот алгоритм нормально.... а sliding - сам попробую придумать... :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 05.03.2005 (Сб) 16:11

Vovik писал(а):
d3drm писал(а):там не Sliding Colision Detection, а просто детекция столкновений, которая возвращает Да\нет. Скользящую детекцию все равно придется придумывать самому =)
Я понимаю... мне хотяб этот алгоритм нормально.... а sliding - сам попробую придумать... :roll:

Для стен алгоритм представляется несложным. А вот в совокупе с подвижными объектами??? Вобщем думаю, думаю!
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 05.03.2005 (Сб) 18:02

Народ, ну помогите плиз коллизией OBB с OBB :cry: Читаю эту статью, точнее код и не могу въехать в него... мало того что с++, так еще и черт знает что... :cry:

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 05.03.2005 (Сб) 22:36

Слушай, а если попробовать векторно?
Т.е. у тебя есть вектор перемещения. Так? Далее, проверяем пересекается ли вектор с плоскостями OBB. Если да, то делаем проекцию вектора на эту поверхность, и получаем вектор-перемещения, который заставит исходный объект скользить вдоль поверхности.
Решение подходит правда для ровной стены, вдоль которой будет скользить объект.
А дальше - сложнее.

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 05.03.2005 (Сб) 22:41

Хм... кстати, если дело происходит с двумя OBB, то стоит задумать об разворачивании объекта скольжения парралельно плоскости скольжения...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.03.2005 (Вс) 10:23

по любому если стена неровная можно проверить столкновения по треугольникам. расскажи лучше как сделать проекцию на плоскость?
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 07.03.2005 (Пн) 10:12

Задам глупый вопрос :oops:
Что такое
AABB и ОВВ

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 07.03.2005 (Пн) 11:30

Bonesnapper писал(а):Задам глупый вопрос :oops:
Что такое
AABB и ОВВ

AABB (Axis-Aligned Bounding Box)
OBB (Oriented Bounding Box)

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.03.2005 (Пт) 17:41

Люди добрые, помогите плз переводом: :cry:
Код: Выделить всё
mVector a = E,
           b = obb.E,
           Pa = P,
           Pb = obb.P;

   mMatrix3 A = (mMatrix3)M,
            B = (mMatrix3)obb.M;

   //смещение в мировой системе координат
   mVector v = Pb - Pa;

   //смещение в системе координат А
   mVector T = A * v;

   //создаем матрицу поворота B относительно А
   const mMatrix3 R(A * B.Transpose());

 
:roll:

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 18.03.2005 (Пт) 22:22

Откуда выдрал? По этому куску ничё не понятно...
Дай весь код - я те помогу. Anatron@mail.ru

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 19.03.2005 (Сб) 8:29

Anatron писал(а):Откуда выдрал? По этому куску ничё не понятно...
Дай весь код - я те помогу. Anatron@mail.ru
http://gdlinks.hut.ru/cdfaq/obb.shtml#obb - вот линка.... там сверху я давал...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 22.03.2005 (Вт) 19:57

Тишина гробовая..... Ну че там, разобрался? :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 22.03.2005 (Вт) 22:06

Vovik писал(а):Тишина гробовая..... Ну че там, разобрался? :roll:

D3DRM, MIKLE
вы куда пропали?
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 23.03.2005 (Ср) 1:29

Yurich, лично я никуда не пропадал. я за этой темой слежу, но постить нечего.

Я уже предлагал попробовать написать физический движок, но что-то никто не загорелся желанием.

что тут обсуждать? где основа? С целью тоже никто не определился, для чего этот алгоритм нужен, как его будут использовать.

просто перевести код? может имеет смысл просто написать dll и использовать ее в своем проекте? Или использовать готовые бесплатные физические библиотеки.

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

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

Но, опять же, зачем изобретать колесо? Возможно кто-то скажет, что хочется свое возыметь, но какое это "свое", если придумано другими? Возражения? Это всего лишь пример? Так вот если пример, то какие могут быть трудности? Возможно просто гр-н Vovik еще не дорос до этого, следует немного поучить геометрию и С++, а затем уже снова лезть в эти дебри.

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

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 23.03.2005 (Ср) 8:30

d3drm писал(а):Vovik как я смотрю сам делать ничего не хочет, хоть бы пропостил пример со своими неудачными попытками.

алгоритм по ссылке весь описан, хоть совсем не подробно. Кода - совсем ничего. код перевести в принципе нечего делать, если действительно этим заняться.
Я не так уж ничего не делаю... Я очень много делаю... Вот, че есть:
mVector3D - аналог D3DVECTOR
Rotation - поворот коробки...
CollisionRayPlane - пересечение луча сразу с двумя треугольниками(объедененная ф-ция для удобства)...
Код: Выделить всё
Public Function CollisionSliding(Before As mVector3D, Position As mVector3D) As mVector3D
With XFile
  Dim PosF As D3DVECTOR, PosS As D3DVECTOR
  Dim DirF As D3DVECTOR, DirS As D3DVECTOR
    Dim t As Double
   
    Dim Vc(7) As D3DVECTOR
    Dim Mat1 As D3DMATRIX
    Dim Matrix As D3DMATRIX
    Dim i As Integer
     
    Vc(0) = Vec3D(.Box.Max.X, .Box.Min.Y, .Box.Min.Z)
    Vc(1) = Vec3D(.Box.Max.X, .Box.Min.Y, .Box.Max.Z)
    Vc(2) = Vec3D(.Box.Min.X, .Box.Min.Y, .Box.Max.Z)
    Vc(3) = Vec3D(.Box.Min.X, .Box.Min.Y, .Box.Min.Z)
    Vc(4) = Vec3D(.Box.Max.X, .Box.Max.Y, .Box.Min.Z)
    Vc(5) = Vec3D(.Box.Max.X, .Box.Max.Y, .Box.Max.Z)
    Vc(6) = Vec3D(.Box.Min.X, .Box.Max.Y, .Box.Max.Z)
    Vc(7) = Vec3D(.Box.Min.X, .Box.Max.Y, .Box.Min.Z)
 
    D3DXMatrixRotationX Matrix, -.Rotation.X
    D3DXMatrixRotationZ Mat1, -.Rotation.Z
    D3DXMatrixMultiply Matrix, Mat1, Matrix
    D3DXMatrixRotationY Mat1, -.Rotation.Y
    D3DXMatrixMultiply Matrix, Mat1, Matrix
   
    D3DXVec3TransformCoord Vc(0), Vc(0), Matrix
    D3DXVec3TransformCoord Vc(1), Vc(1), Matrix
    D3DXVec3TransformCoord Vc(2), Vc(2), Matrix
    D3DXVec3TransformCoord Vc(3), Vc(3), Matrix
    D3DXVec3TransformCoord Vc(4), Vc(4), Matrix
    D3DXVec3TransformCoord Vc(5), Vc(5), Matrix
    D3DXVec3TransformCoord Vc(6), Vc(6), Matrix
    D3DXVec3TransformCoord Vc(7), Vc(7), Matrix
   
  DirF.Z = 1
  DirS.X = 1
       
  D3DXVec3Normalize DirF, DirF
  D3DXVec3Normalize DirS, DirS

  PosF = Vec3D(Position.X, Position.Y, Position.Z)
  PosS = Vec3D(Position.X, Position.Y, Position.Z)
   
  PosF.Z = PosF.Z - 2
  PosS.X = PosS.X - 2

  Dim NewPos As mVector3D
   
  NewPos = Position

  If CollisionRayPlane(PosF, DirF, _
     Vc(1), Vc(2), Vc(6), Vc(5), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.Z = Before.Z
  End If

  If CollisionRayPlane(PosS, DirS, _
     Vc(1), Vc(2), Vc(6), Vc(5), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.X = Before.X
  End If

  If CollisionRayPlane(PosF, DirF, _
     Vc(0), Vc(3), Vc(7), Vc(4), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.Z = Before.Z
  End If

  If CollisionRayPlane(PosS, DirS, _
     Vc(0), Vc(3), Vc(7), Vc(4), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.X = Before.X
  End If

  If CollisionRayPlane(PosF, DirF, _
     Vc(0), Vc(1), Vc(5), Vc(4), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.Z = Before.Z
  End If

  If CollisionRayPlane(PosS, DirS, _
     Vc(0), Vc(1), Vc(5), Vc(4), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.X = Before.X
  End If

  If CollisionRayPlane(PosF, DirF, _
     Vc(2), Vc(3), Vc(7), Vc(6), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.Z = Before.Z
  End If

  If CollisionRayPlane(PosS, DirS, _
     Vc(2), Vc(3), Vc(7), Vc(6), t, 0, 0) Then
     If t > 0 And t < 4 Then NewPos.X = Before.X
  End If

CollisionSliding = NewPos
End With
End Function
работает, но не совсем... трабла в том, что через углы коробки можно проскочить... поэтому решил коллизить две OBB коробки, а потом слайдинг добавить...
Все дело в том, что коробки у меня задаются 8-мью вершинами, а как их коллизить (эти коробки) наиболее эффективно - не понятно...
Можно попробовать через проекции, но это столько условий.... есть же алгоритмы, но негде про это почитать.... вырванные куски... :cry:


Вернуться в Мультимедиа

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

Сейчас этот форум просматривают: Google-бот и гости: 35

    TopList