Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 28. červenec 2009, 17:24:32 Předmět: Prosím o pomoc s OBB |
|
|
Zdravím všechny...
http://newwiki.ceske-hry.cz/Kolize_a_n%C3%A1sledn%C3%A1_reakce Podle tohoto postupu jsem si vytvořil OBB kolize. Kolizi rozpoznám a nyní se snažím napsat fyziku pro odraz po kolizi... Ovšem tady nastává problém.
Nedari se mi najit min. penetraci.
Vyuzil jsem tento alg (prepsal jsem ho do C#, predkladam puvodni verzi):
kód: |
bool CalculateMTD(Vector& MTD, Vector* axAxes, iNumAxes) const
{
int min_axis = -1;
for(int I = 0; I < iNumAxes; I ++)
{
float length = axAxes[I].xAxis.Normalise(); //normalise axis, return the length
float d0 = (axAxes[I].maxa - axAxes[I].minb);
float d1 = (axAxes[I].maxb - axAxes[I].mina);
// bug. Means objects are separated, which they should not at this point
if (d0 < 0.0f || d1 < 0.0f)
return false;
if (d0 < d1)
{
axAxes[I].overlap = d0 / length;
}
else
{
axAxes[I].overlap = d1 / length;
axAxes[I].xAxis *= -1.0f; // need to push box B the other way
}
if (min_axis == -1 || axAxes[I].overlap < axAxes[min_axis].overlap)
{
min_axis = I;
}
}
// bug
if (min_axis == -1)
return false;
// Set the MTD (Direction * overlap amount).
MTD = axAxes[min_axis].xAxis * axAxes[min_axis].overlap;
Return true;
}
|
Problém je, ze i kdyz mam kolizi, tak rozdil intervalu min a max u dvou objektu mi vyjde zaporny...
float d0 = (axAxes[I].maxa - axAxes[I].minb);
float d1 = (axAxes[I].maxb - axAxes[I].mina);
Pokud mi nekdo poradi, budu jen rad...
Pokud se Vam nechce psat do fora, napiste mi prosim na ICQ: 270-356-276, poskytnu dalsi info a pripadne zdrojove kody |
|
Návrat nahoru |
|
 |
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
Zaslal: 28. červenec 2009, 23:23:09 Předmět: |
|
|
Moh bys nakreslit nejakou situaci, ve ktery k tomuhle dojde? |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 29. červenec 2009, 07:57:39 Předmět: |
|
|
Čau, koukám do svýho zdrojáku a jedinej rozdíl co jsem našel je, že tohle:
kód: |
if (d0 < d1)
{
axAxes[I].overlap = d0 / length;
}
else
{
axAxes[I].overlap = d1 / length;
axAxes[I].xAxis *= -1.0f; // need to push box B the other way
} |
mám takhle:
kód: |
if (d0 < d1)
{
axAxes[I].overlap = d0 / length;
axAxes[I].xAxis *= -1.0f; // need to push box B the other way
}
else
{
axAxes[I].overlap = d1 / length;
}
|
možná ty nakešovaný osy axAxes nejsou vpořádku, zkontroluj tu kolizní část _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. červenec 2009, 08:01:35 Předmět: |
|
|
Semo: K tomu se kód už nedostane... skončím u prvního returnu. Kdyby nebyli v pořádku nakešovaný osy, tak by to podle mě neoznamilo kolizi...
Naposledy upravil perry dne 31. říjen 2009, 13:13:15, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 29. červenec 2009, 10:23:27 Předmět: |
|
|
nevím nevím...
co tak vyhodit tuhle podmínku?
kód: |
// bug. Means objects are separated, which they should not at this point
if (d0 < 0.0f || d1 < 0.0f)
return false; |
Já jí tam nemám. Nemá vypadat takhle?
kód: |
// bug. Means objects are separated, which they should not at this point
if (d0 < 0.0f && d1 < 0.0f)
return false; |
_________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 29. červenec 2009, 10:27:37 Předmět: |
|
|
ještě mě napadá: ty crossproduktový osy normalizuješ nebo ne? (já ne) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. červenec 2009, 10:33:53 Předmět: |
|
|
Nenormalizuju osy, kdyz podminku vyhodim, tak pak mam ovsem "prunik" zaporny...
Jinak ohledne os boxu A a B... jak je pocitas ?
Ja takhle:
kód: |
this.axisX = vertices[B] - vertices[A]; //strana AB - k ose X
this.axisY = vertices[C] - vertices[A]; //strana AC - k ose y
this.axisZ = vertices[E] - vertices[A]; //strana AE - k ose z
this.axisX.TransformCoordinate(this.transformMatrix);
this.axisY.TransformCoordinate(this.transformMatrix);
this.axisZ.TransformCoordinate(this.transformMatrix);
|
transformMatrix je matice natoceni toho boxu (obsahuje yaw, pitch, roll)... ono je taky mozne, ze mam urcene blbe osy a vychazi to nahodou (coz by byla ovsem velka nahoda, jelikoz jsem tu kostku zkousel i ruzne rotovat a zdalo se, ze to kolizi pozna +- pixel, coz ovsem zalezi na rychlosti pohybu boxu) |
|
Návrat nahoru |
|
 |
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
Zaslal: 29. červenec 2009, 11:50:21 Předmět: |
|
|
Pokud je ta kontrolni podminka splnena, tak to znamena, ze existuje oddelovaci osa pro A a B a kolize neexistuje. Takze budto ke kolizi opravdu nedoslo (a spatne ti to hlasi, coz podle toho, co rikas, asi problem nebude) nebo spatne projektujes objekty na osy. Jak delas tu projekci?
BTW na tyhle "bezpecnostni" podminky se hodi skvele assert. Zatimco kdyz misto toho akorat vratis false, tak to nespadne a pak pul hodiny hledas, proc to dava divny (ale nekdy "skoro spravny") hodnoty. Navic je celkove divny, ze fce CalculateMTD vubec neco vraci. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. červenec 2009, 12:06:41 Předmět: |
|
|
Projekci delam takhle:
kód: |
C = Vector3.Dot(boxA.Position, axis);
R = Math.Abs(Vector3.Dot(boxA.BoxOrientationX, axis)) +
Math.Abs(Vector3.Dot(boxA.BoxOrientationY, axis)) +
Math.Abs(Vector3.Dot(boxA.BoxOrientationZ, axis));
|
pak min je C - R a max C + R
boxA.Position je pozice stredu boxu na osach x, y, z
axis je aktualne testovana osa
boxOrientatinX je vektor slozeny z prvku svetove transf. matice
Jedinou chybu, kterou bych teoreticky mohl mit, jsou spatne urcene zakladni osy, jak jsem psal v minulem prispevku...
Pocitam je tak, ze jako osy udelam vektory AB, AC, AE ... a vypoctene vektory transformuji podle toho, jak je box natoceny... tim je dostanu rovnobezne s x, y, z...
Hestli mate cas, tak mi napiste nekdo na ICQ... probiralo by se to lepe |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. červenec 2009, 18:26:16 Předmět: |
|
|
Takže jsem asi našel pravděpodobné řešení:
Jak psal ]Semo[, vyhodit tuihle podmínku:
kód: |
// bug. Means objects are separated, which they should not at this point
if (d0 < 0.0f || d1 < 0.0f)
return false;
|
A to z jednoho prosteho duvodu. Jelikoz jsem zjistil, ze v jednom ze smeru je prekryv vzdy zaporny (proto je take v kodu tato cast:
kód: |
axAxes[I].xAxis *= -1.0f; // need to push box B the other way |
)
Děkuji všem a hlavně ]Semovi[ za rady a pomoc...
(P.S: Ono kromě této chyby, jsem měl ještě zásadní BUG v počítání os.. ale to už by bylo na jinou sekci ) |
|
Návrat nahoru |
|
 |
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
Zaslal: 29. červenec 2009, 19:36:02 Předmět: |
|
|
Bejt tebou bych tam tu podminku nechal a radsi zjistil, proc je prekryv nekdy zapornej (a fixnul to)... nebo si koledujes o to, ze zavleces bug dal, a pak ho budes daleko hur hledat. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. červenec 2009, 19:53:26 Předmět: |
|
|
Zaporny prekryv je podle me proto, ze se dostanu do zapornych os na jednom boxu a do kladnych na druhem. J
elikoz jeden box je staticky, tak me na nem nezajimaji prekryvy, protoze ho nikam "odpalovat" nebudu.... jinak by ten kladny prekryv byl na nem.... nebo mi to tak alespon vychazi
Ty zaporne prekryvy jsou vzdycky jenom na jednom z boxu a odpovidaji zanoreni... podle me je ta podminka v tom kodu, odkud jsem to bral blbe... ani kdyz jsem o tom premyslel neni logicka.. to OR je podle me AND...
Jak jsem psal, k cemu by tam pak bylo nasobeni -1x, kdyby to nikdy nemohlo byt zaporny (tohle vynasobeni prave vyhodi + vysledek na - prekryvu) |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 30. červenec 2009, 09:02:54 Předmět: |
|
|
Tak to je fajn. Kolizi otestuješ snadno, hlavně aby fungovala. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
|