[ Acid @ 07.12.2003. 17:18 ] @
Kako da utvrdim da li su se dva mesh-a sudarila?
[ Reljam @ 07.12.2003. 19:57 ] @
To je jedno relativno komplikovano pitanje - postoje citave knjige koje se bave tom problematikom. Pogledaj na guglu malo o "bounding box"ovima, to je jedan od nacina da utvrdis da li je doslo do dodira izmedju dva mesha. D3DXComputeBoundingBox je D3DX funkcija koja sluzi za racunjanje bounding boxova, ali ipak treba da pogledas prvo malo teorije.

Bilo bi dobro i da nabavis neku knjigu o 3D programiranju - jer lako je poceti, nacrtati nesto sto se vrti na ekranu, ali posle toga se stvari brzo komplikuju.
[ yooyo @ 09.12.2003. 22:50 ] @
Reljam je u pravu... Zavisi od toga koliko zelis "siguran" sudar. Mozes da koristis
od bounding boxova, sfera, uproscenih mesheva ili bas svih vertexa/poligona.

Sto je proracun precizniji, trosi se vise CPU vremena. Za izuzetno precizne sudare
prave se specijalne strukture podataka za svaki mesh i metode kojima se daje odredjeno
vreme za proracun (u milisekundama), pa sto vise vremena potrose dobijes precizniji rezultat.

No da ne sirim previse... ako je za igru... onda uzmi neku jednostavnu metodu... (boxovi ili sfere)

yooyo
[ Acid @ 10.12.2003. 21:54 ] @
Naravno da mi treba najprostiji vid sudara, ali kako?
[ yooyo @ 10.12.2003. 23:03 ] @
Hmmm.. Napravi boundary box oko svakog objekta i chekiraj da li su se 2 boxa negde presekla (dodirnula) i to je to... Ako su boxovi poravnati sa osama (axis aligned) sistema,
onda se presek svodi na nekoliko poredjenja.

Ako imas mnogo objekata, onda raspodeli objekte u npr. octree, pa ces
na taj nacin eliminisati veliki broj nepotrebnih poredjenja.

Ako koristis sfere onda se sudar detektuje ako je rastojanje izmedju 2 sfere
manje od zbira njihovih poluprecnika.

yooyo
[ Reljam @ 10.12.2003. 23:20 ] @
Tacno, i samo jedna mala ispravka / optimizacija: kvadrat razdaljine treba da bude manji od kvadrata zbira poluprecnika. :)
[ Gojko Vujovic @ 11.12.2003. 01:48 ] @
Zar ne govorite uvek da ne treba ništa optimizovati ("to je gubljenje vremena")?

Sve će to hardver pozlatiti.
[ yooyo @ 11.12.2003. 09:59 ] @
Citat:
Gojko Vujovic:
Zar ne govorite uvek da ne treba ništa optimizovati ("to je gubljenje vremena")?

Sve će to hardver pozlatiti.


:)))

Ko je to rekao!?

yooyo
[ Acid @ 11.12.2003. 11:15 ] @
Pogledao sam u Help-u kako napraviti Bounding Sphere i sve mi je jasno osim sledeceg:
Code:

objectRadius = Geometry.ComputeBoundingSphere(vertexData,
                                              pMesh.NumberVertices,
                                              pMesh.VertexFormat,
                                              out objectCenter);


Sta je objectCenter kada nije predhodno definisano; sta znaci OUT i kako to prevesti u VB?
Hvala
[ Reljam @ 11.12.2003. 19:36 ] @
Citat:
Gojko Vujovic:
Zar ne govorite uvek da ne treba ništa optimizovati ("to je gubljenje vremena")? Sve će to hardver pozlatiti.
Pa, postoji razlika izmedju optimizacije i koriscenja provereno losijih algoritama (bubble sort?). Ovo ipak spada u drugu kategoriju. A inace jedna od odlika iskusnijih programera je da znaju sta treba, a sta ne treba optimizovati. Ako vas zanima vise o ovoj temi, kao i o kriterijumu sta treba optimizovati, mozemo slobodno da otvorimo temu u "Art of Programming".
[ Acid @ 12.12.2003. 18:27 ] @
ima li koga?
[ Reljam @ 12.12.2003. 18:47 ] @
Ima, ali ovo je prvenstveno forum za grafiku, ne za VB. ObjectCenter je, jelte, centar objekta. Dakle tacka koja predstavlja centar objekta. A posto je out parametar, to znaci da ce funkcija tebi to da vrati, ne treba ti njoj da prosledjujes vrednosti, vec samo da joj das promenljivu u koju ce to ona da zapise. Pogledaj help za out parametere ili neku knjigu za Visual Basic.
[ Acid @ 12.12.2003. 21:03 ] @
Hvala na odgovoru
Znam da forum nije za VB ali je pitanje prvenstveno vezano za grafiku i grafiku u VB-u.
Pozdrav.
[ Acid @ 13.12.2003. 16:35 ] @
Uspeo sam da napravim boundarySphere, ali: na objektu koji ima koordinate 0,0,0 vrednosti za ObjectCenter su 0.6639903, 11.74995, 44.98951, a precnik 204.6698. Kada pomeram objekat vrednosti za centar sfere se ne menjaju! Sta nije u redu?
Hvala unapred.
[ Reljam @ 13.12.2003. 20:10 ] @
Bounding sphere se nalazi u koordinatnom sistemu tvog objekta, znaci ne pomera se kada pomeris objekat. Da bi je imao u world coordinates, treba da pomnozis poziciju bounding sphera sa istom transformacijom (world transform) sa kojom mnozis objekat da bi ga pomerio.
[ Acid @ 13.12.2003. 22:12 ] @
Hvala.
A BoundaryBox?
dva out paramaetra min,max kao vector3.
Sta predstavljaju min i max i koju vrednost vraca funkicja (kao sto ova sa sferom vraca precnik sfere). HVALA.
[ Reljam @ 13.12.2003. 22:55 ] @
To su dva vektora koji odredjuju bounding box. Posto je poravnat sa koordinatnim osama, to je sve sto ti treba da bi definisao 'kocku' (nije bas kocka, ali bas ni 'kutija' ne zvuci mnogo bolje).
[ Acid @ 14.12.2003. 22:01 ] @
Da li je moguce prikazati boundaryBox na ekranu?
[ Reljam @ 15.12.2003. 08:13 ] @
Jeste, ali moras sam da ga iscrtas. Najlakse je tako sto uzmes model kocke koja ima velicine strane 1, namestis joj neku poluprovidnu teksturu, i onda je namestis tamo gde treba.
[ Acid @ 15.12.2003. 10:38 ] @
1. Kako da u max-u nacrtam kocku a da njena ivica bude 1?
2. Kocka sa ivicom 1 treba da bude poravnata sa osama tako da se koordinatni pocetak nalazi u centru kocke ili u jednom uglu?
3. Kakva je veza izmedju min i max vektora i dimenzija kocke?

Hvala.
[ reject @ 15.12.2003. 12:40 ] @
1.Evo cubeta u .3ds i .dxf formatu pa ti vidi sta ti je lakse za import.
Nisu radjeni u Maxu, a exporter u .3ds exportuje samo trouglove, tako
da su svi poligoni trouglovi.
http://www.elitesecurity.org/poruka/fajluzporuku/250178
Sto se tice koordinatnog pocetka, on je u gornjem levom uglu ja
mislim, mada pivot point mozes lako da pomeris po zelji, zavisi kako
si organizovao stvari - mozes da pomeras pivot point u zeljenom smeru
ili ceo objekat u suprotnom smeru od zeljenog.
BTW, iscrtavanje bounding boxa je veoma bitno za testiranje enginea,
a ukoliko ne zelis da iscrtavas bounding box, ubaci kocku kao objekat
ciju koliziju testiras, posto su dimenzije kocke iste kao i dimenzije
bounding boxa oko kocke - dobices isti efekat.
[ Mina28 @ 16.12.2003. 20:21 ] @
Hvala Acidu sto je pokrenuo ovu temu jer sam se samo zbog nje registrovala na sajtu.
Ako nije mnogo da trazim da li neko moze da mi posalje neku klasu u C# ili VB-u koja proverava da li su se dve kocke sudarile (ucinite maloj bespomocnoj devojci :)
[ Acid @ 17.12.2003. 18:07 ] @
Dobro je da je Mina28 postavila odgovor jer sam isto hteo i ja da zamolim, a cinimi se da postajem malo dasadan sa ovim molbama i ovom temom :-(.
[ Mina28 @ 22.12.2003. 20:54 ] @
MOLIM VAS!!!!
zar je moguce da niko nece da pomogne pocetnicima u ovim "opasnim" vodama?
Znam da je molma malo obimna i teska ali nigde, jos jednom NIGDE na celom netu nisam uspela da pronadjem ono sto mi treba. Ako bilo ko moze da mi ovo posalje bicu mu vecnooooo zahvalna!
[ degojs @ 22.12.2003. 22:24 ] @
hahahaha Nikola, Acide crni... dobar pokušaj, dobar hahaha čuj Mina Bošnjaković.. hahah Dobro da nisi stavio Pamela Anderson :-)))

Brišite mi poruku odmah, al' ovo je stvarno super-smešno :-)
[ darkosos @ 22.12.2003. 22:32 ] @
Evo ja slučajno nabasao ovde posle dužeg vremena i šta vidim : bespomoćna devojčica u nevolji. Cccc.
Nisam baš radio C#, a i VB slabo, mada ovaj poslednji bih slabo koristio za ovu vrstu rada. Elem, kad već pričaš o klasama, za sudar dve kocke ti ne trebaju klase. Treba ti samo jedna funkcija. Druga je stvar ako imaš klasu 3D objekata, svakoj dodeliš kocku u kojoj se nalazi, pa onda unutar klase praviš funkciju koja će proveriti da li se domaća seče sa nekom drugom. Ili napraviš friend-a.
U prethodnim post-ovima je već dosta rečeno na tu temu.
Moraćeš da budeš konkretnija da bi dobila konkretniji odgovor.
[ Reljam @ 24.12.2003. 20:30 ] @
Posto ovde pricamo o axis aligned bounding boxovima, to znaci da je relativno trivijalno utvrditi da li se dve kocke seku.

Svaka kocka (tj. box) je definisana sa dve tacke - gornjom levom i donjom desnom. Ovo je moguce uraditi zato sto su kocke poravnate sa osama sistema, i samim tim su kocke jednoznacno opisane.



Testiranje da li se kocke seku je sada prilicno lako: ako projektujemo obe kocke na X i na Y osu, kocke se seku ako se njihove projekcije seku na svakoj osi. Na slici sam projektovao obe kocke na ose, i kao sto se vidi, projekcije se seku na Y osi. Ali zato na X osi se projekcije ocigledno ne seku, tako da smo nasli barem jednu osu na kojoj se projekcije ne seku, i znaci, ni kocke se ne seku.

Isti princip vazi i u 3D.
[ Mildly Innovative LunnatX @ 26.01.2004. 23:50 ] @
Citat:

Ako nije mnogo da trazim da li neko moze da mi posalje neku klasu u C# ili VB-u koja proverava da li su se dve kocke sudarile (ucinite maloj bespomocnoj devojci :)


Kao covek koji u zivotu nije slovce odkucao u (odmahujuci glavom u stranu) VB moram reci da mi se zeludac obrce od ovakvih zahteva . Peruna mi , KLASA KOJA PROVERAVA JESU LI SE KOCKE SUDARILE ?

Devojce be , uzmes centar od svaki mesh , tj. kocku , pa proveris sa svaku drugu , sa ORJENTISANU KOCKASTU KOLIZIJU ;) ili LOPTASTU koliziju , sa pitagorinu teoremu sa jos jednu dimenziju , al kockastu koliziju zasnovanu na ose sveta mani da koristis , jer su rezultati , po mom skromnom misljenju , neupotrebljivi .

Loptasta kolizija ?
,,,,,,B
,,,z /| y
,,,,/,,|
,,/,,,,|
A -----
x
Znaci ako je tacka A bliza tacki B od radijusa tacke A odnosno ako je z duze od radijus A + radijus B ONDA IMAMO SUDAR !

znaci , PSEUDO kod :

za 2d

for A.KOCKA = svaka KOCKA
A\sudar = 0 ; pa da , resetujemo sudar !
for B.KOCKA = svaka KOCKA

if ( A\radijus + B\radijus ) ^2 > ( A\x - B\x ) ^2 + ( A\y - B\y ) ^2
A\sudar=B
B\sudar=A
endif

next
next

pa dodas jos jednu dimenziju !

A sad uzmi , pa napisi sama , LEGO kockice jesu zabavne , al je lepse kad pravis svoje ;)

:) Ovo je bas bilo zabavno ;))

[ Draghixa @ 28.02.2004. 00:34 ] @
Otidji na neki od site-ova koji se bavi Game Programming-om (moja preporuka je gamedev.net) i potrazi primjere vezano za colision detection.