.[ ČeskéHry.cz ].
Opět OBB - kontaktní body

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 25. srpen 2009, 18:14:07    Předmět: Opět OBB - kontaktní body Odpovědět s citátem

Pořád přesně nechápu, co jsou kontaktní body při OBB kolizích. Body potřebuju vypočítat pro aplikování fyziky.



Pokud by mi někdo v tomhle obrázku vyznačil, co potřebuju spočítat jako kontaktní body, hrozně by mi to pomohlo. Popř pokud by někdo mohl nakreslit nebo ukázat nějaké další modelové případy.


Pokud mám totiž kostky takhle položené na sobě, tak je to jasné. Ovšem takováhle situace nenastane, jelikož nejdřív počítám kolize, mtd a hloubku a pak potřebuju body.. a pak teprve kostky rozhodim od sebe
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 25. srpen 2009, 23:57:49    Předmět: Odpovědět s citátem

Klicovy slova, ktery te zajimaj, jsou "contact manifold".

Tady mas navod, jak na ne (s odkazem do zdrojaku Bullet):
http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?p=&f=&t=226

A tady mas obrazek, jak se body dotyku vetsinou volej. Figl je v tom, ze kazdej z objektu ma jinou sadu bodu dotyku, ktery jsou ale sparovany. Cerveny puntiky jsou body dotyku patrici ke spodnimu objektu, zeleny puntiky patrej k hornimu objektu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 26. srpen 2009, 09:21:27    Předmět: Odpovědět s citátem

Aha.... takze hledám všechny kontaktní body... Nějak jsem žil v mylné představě, že hledám pouze body prvního dotyku. Tudíž pro ten tvůj obrázek by to byl jeden zelený a jeden červený.

Jestli to chápu dobře.
0) upravím pozici objektů z pohybu, který jsem zadal myší / klávesnicí
1) ze SATu získám mtd a velikost překryvu (delka mtd)
2) najdu všechny kontaktní body, které v daném okamžiku mají obě kostky (tzn. ty červené a zelené, co jsi maloval)
3) upravím mtd pro dané body (každý bod může mít jinou)
4) pro každý bod se provede reakce na kolizi v tomto bodě, odsunutí objektů od sebe (fyzika apod.)
5) -> 0)

0) není nutná, pokud nechám běžet auto-demo, kdy kostky sami padají gravitací

Je to víceméně takhle, nebo jsem to zase pochopil totálně blbě Rolling Eyes Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 26. srpen 2009, 11:03:53    Předmět: Odpovědět s citátem

perry napsal:
Aha.... takze hledám všechny kontaktní body... Nějak jsem žil v mylné představě, že hledám pouze body prvního dotyku. Tudíž pro ten tvůj obrázek by to byl jeden zelený a jeden červený.

Hledas vsechny body dotyku s tim, ze se casto jejich pocet limituje nejakym zpusobem. Napriklad vezmes jen body, ktery jsou nejdal ve smeru MTV. Ve 2D se jejich pocet casto limituje na 2. Ale tohle je spis vec optimalizace (pri vice bodech bude vysledek vypadat zhruba stejne, ale vypocet bude pomalejsi).

citace:

...
3) upravím mtd pro dané body (každý bod může mít jinou)
4) pro každý bod se provede reakce na kolizi v tomto bodě, odsunutí objektů od sebe (fyzika apod.)
5) -> 0)

Ne Smile MTV pri reakci na kolizi (vypocet impulzu) vubec nepotrebujes, takze neni potreba ji upravovat. Pro vypocet impulzu potrebujes vedet relativni rychlost obou objektu v kontaktu. Tu vypocitas jako rozdil rychlosti prvniho objektu v kontaktu, kterej k nemu prislusi (cervenej) a rychlost druhyho objektu v kontaktu, kterej k nemu prislusi (zelenej). Rychlost objektu v urcitym bode spoticas jako
R = C - P
V = Vl + (R x Va) ,
kde C je pozice kontaktu, P je stred objektu, Vl je linearni rychlost objektu, Va je uhlova rychlost objektu. Mozna je tam misto plus minus Smile Takhle to teda vypada ve 2D, nevim ted rychle, jak to do 3D rozsirit, ale to urcite najdes na netu.

Pak je potreba vypocitat vektor impulzu, kterej na objekty (v bode jejich kontaktu) aplikujes. Pro odvozeni koukni bud sem nebo sem (nejvic te zajima predposledni prispevek). V zaklade vychazis z toho, ze chces, aby po aplikaci impulzu byla relativni rychlost objektu v kontaktu 0. Pak si za ty rychlosti akorat sikovne dosadis tak, aby ti z toho vylezla aktualni relativni rychlost objektu, hmotnosti a inerce.

No a kde se teda vezme v uvahu MTV? Budto nikde a spokojis se s tim, ze se objekty budou nejakou dobu mirne prekryvat, a nebo jejich stredy jednoduse posunes od sebe o MTV/2. To ale muze zpusobit mirny skubani pri reseni kolize, proto se casto pouziva prvni moznost nebo se MTV umele zmensi. Napr. kdyz si pustis demo Box2D a zvetsis dostatecne simulacni krok, tak uvidis, ze Box2D prekryv neresi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 26. srpen 2009, 11:08:15    Předmět: Odpovědět s citátem

perry napsal:
Nějak jsem žil v mylné představě, že hledám pouze body prvního dotyku. Tudíž pro ten tvůj obrázek by to byl jeden zelený a jeden červený.

Byly by tam 2 pary kontaktu. Tj. oba cerveny i oba zeleny. Cervenej nalevo a zelenej nalevo jsou vlastne 1 kontakt rozdelenej do dvou... je lepsi ten par chapat jako jeden kontakt Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 26. srpen 2009, 11:25:55    Předmět: Odpovědět s citátem

Díky... odpoledne / zítra se s tím zkusím propasovat Smile... zatím mi jde o kontaktní body. Fyzika je ještě daleko Smile

Jinak co se týče mtd... právě že doteď (asi tři týdny :/) jsem se snažil vypočítat kontaktní body pomocí mtd a normály kolize, co vypadlo ze SAT testu... bohužel se mi to nijak nepodařilo, ačkoliv jsem ten zdrojový kód prakticky "opsal" z jiných enginů (zkoušel jsem asi 3, ani jeden nefunguje). Nechápu to Idea Crying or Very sad. Přitom data ze SATu jsou imho na 90% dobře. Kolize pouze s gravitací (kostky padají, odsunou se od sebe ve směru normály kolize o mtd / 2) funguje.

No vypočtu ty body asi "brutal-forcem"... projdu hrany na jedne kostce a zjistim, kde protinaji steny na druhe (a naopak). Rychlost ovšem nic moc, podle mě (i když ty algoritmy co jsem nasel meli bezne O(n2) nebo i O(n3))

A mtd / 2 používám, jen pokud mám oba objekty v pohybu. Pokud jeden stojí a druhý se hýbe, pak ho odsunu o celé mtd. (Zatím řeším případ jedna kostka stojí (podlaha) a druhá se hýbe (padá na podlahu) Smile )
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 26. srpen 2009, 17:47:11    Předmět: Odpovědět s citátem

perry napsal:
Jinak co se týče mtd... právě že doteď (asi tři týdny :/) jsem se snažil vypočítat kontaktní body pomocí mtd a normály kolize, co vypadlo ze SAT testu... bohužel se mi to nijak nepodařilo, ačkoliv jsem ten zdrojový kód prakticky "opsal" z jiných enginů (zkoušel jsem asi 3, ani jeden nefunguje). Nechápu to Idea Crying or Very sad. Přitom data ze SATu jsou imho na 90% dobře. Kolize pouze s gravitací (kostky padají, odsunou se od sebe ve směru normály kolize o mtd / 2) funguje.

A jak je hledas? Ja nejdriv projektnu vsechny vrcholy objektu na MTV, zjistim maximum. Pak projdu vrcholy znovu a ulozim si stranou ty, jejichz projekce je v nejakym delta okoli toho maxima. V tomhle kroku muzu prave limitovat jejich pocet. Kdyz tyhle body mam (pro oba objekty), tak je projektu na primku kolmou na MTD. Vzhledem k tomu, ze ve 2D mam maximalne 2*2 bodu, tak je pomerne malo moznosti, ktery muzou nastat. Tak je proste ruco rozlisim a podle toho urcim, jak budou vypadat kontakty. Ale ve 3D to bude chtit asi neco sofistikovanejsiho. Jak jsi na to sel ty?

citace:
A mtd / 2 používám, jen pokud mám oba objekty v pohybu. Pokud jeden stojí a druhý se hýbe, pak ho odsunu o celé mtd. (Zatím řeším případ jedna kostka stojí (podlaha) a druhá se hýbe (padá na podlahu) Smile )

Nemusis delit MTV presne na pul, ale muzes ho rozdelit podle pomeru hmotnosti objektu. Statickymu objektu pak das nekonecne velkou hmotnost.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 26. srpen 2009, 18:07:47    Předmět: Odpovědět s citátem

No tak sel.. spíš jsem to opsal, ale to je detail.

Nejdřív jsem zjistil vrcholy boxu (supportVertices) ktere jsou nejblize k mtd (vicemene to udelao to, ze to zvyraznilo steny / hrany / body kolize).

podle poctu bodu jsem bud mel kolizi face x face, face x edge nebo jinou

Tyhle body jsem potom setridil tak aby odpovidali poradi ve smeru / proti smeru hod. rucicek.
face x face - provedla se fce. clipVertices, kterou jsem nejak presne nepochopil a tady je právě ten kámen úrazu. Tahle funkce se chová dost divně a přijde mi, že nefunguje.
edge x face - převedlo se na bod x plocha a to se provedlo 2x (pro 1. a 2. bod)

A tím jsem měl získat kontaktní body, na které jsem potom volal fci. apply Impulses. Jenomže ty body, co z toho vylezli vypadají takhle:

Kolizní body

Support Vertices
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 26. srpen 2009, 18:37:01    Předmět: Odpovědět s citátem

Jo, tak to je stejnej postup, jako sem popisoval. A mas pravdu, nefunguje ten clipping face x face, support points mas spravne. Ve vysledku bys mel mit 4 body v horni stene dolniho objektu a 4 (k nim prislusejici) body v dolni stene horniho objektu. Jak presne by to melo to melo vypadat ti nenakreslim, apc z toho obrazku neni patrna hloubka.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 26. srpen 2009, 18:54:11    Předmět: Odpovědět s citátem

No správně to asi bude tak jak jsi to maloval v prvním tvém příspěvku, akorát to samé bude i na zadní stěně. Ty kostky jsou na sebe položené přesně 1:1 takže předek i zadek je stejný (je to jenom 2D protažený do hlouby... neni to tak, že by jedna kostka byla např. přes tu první)

Co ovšem nechápu je, proč ten clipping nejde. Ten program jsem viděl funkční a fungoval - je to vytažený odsud http://www.xbdev.net/physics/RigidBodyImpulseCubes/ (kde také beru základ fyziky).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 26. srpen 2009, 18:56:30    Předmět: Odpovědět s citátem

Studovat to nebudu Smile Okoukni Bullet a ODE, jak to maji udelany.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 26. srpen 2009, 19:21:50    Předmět: Odpovědět s citátem

To jsem ani nečekal, že bys to studoval Smile Spíš kdybys někdy potřeboval... docela dobrá stránka... starší ale něco se tam najde
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. srpen 2009, 17:00:00    Předmět: Odpovědět s citátem

Takže Brutal-Forcem mi ty body cca. vyjdou.



Ovšem nevim, jak je na tom efektivita

Nástřel kódu:
kód:

for (int i = 0; i < 6; i++) //steny
  for (int j = 0; j < 12; j++) //hrany
    if (face.LinePlaneIntersection(edge, ref intersectionPoint))
      if (face.IsInsidePlane(intersectionPoint))
       if (edge.IsOnLineSegment(intersectionPoint)) ... kolizni bod


A celé to musím pustit 2x nejdřív brát stěny kostky A a hrany B a pak to otočit
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 4. září 2009, 15:27:01    Předmět: Odpovědět s citátem

V tomhle případě budou ty body navoleny jak ? Smile

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna