Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
18:15-18:45
Adott egy szakasz két végponttal a modell-koordinátarendszerben: (1,1,-3) és (1,1,3). Van egy transzformációs mátrixunk, ami modellből visz világkoordinátába:
És van egy másik transzformációs mátrixunk, ami világkoordinátákból visz normalizált eszközkoordinátákba:
Mely pixeleket színezi ki a DDA szakaszrajzoló algoritmus, ha a viewport felbontása 6x6?
-- Mezzanine - 2006.12.07.
Megoldás:
A két mátrixot össze kell szorozni, majd a homogén koordinátás pontokkal balról meg kell szorozni.
Ezzel a konkatenált mátrixszal szorozzuk meg balról az egyes pontokkal. A pontokat előtte természetesen homogén koordinátára alakítjuk, azaz mögé csapunk egy 1-est. A transzformációk után a pontok:
javította: adamo
A vágást a homogén koordinátarendszerben kell elvégezni, hiszen látszik, hogy átfordulás lesz (a negyedik koordináta a kettő pont között 9-ről -9-re vált, tehát a 0-t érinti!). Írjuk fel a vágósíkokat, illetve hogy azok szerint az egyes pontok a sík jó oldalán vannak, avagy sem.
Vágósíkok |
[x,y,z,h]=[3,3,-3,9] |
[x,y,z,h]=[3,3,15,-9]
|
|
bent |
kint
|
|
bent |
kint
|
|
bent |
kint
|
|
bent |
kint
|
|
bent |
kint
|
|
bent |
bent
|
Jól látszik, hogy belső pont, hiszen minden vágósík szerint belülre esik. Ezután azon sorokra, ahol valamely pont kiesik a síkból, el kell végeznünk a megfelelő síkra történő vágást. Írjuk fel a szakasz egyenletét a koordinátákra külön-külön:
Most nézzük meg, hogy az egyes vágósíkokkal való metszetüknél milyen értéket vesz fel!
A fentiekből tehát kiderül, hogy a szakaszunk két helyen is metszi a vágósíkokat. Igen ám, de honnan tudjuk, hogy melyik metszéspont az, amelyik minket érdekel? Tudjuk, hogy a a belső pont. Ha a szakasz egyenletébe behelyettesítjük a értéket, akkor azt kapjuk, hogy a levágott pont koordinátái: . Ugyanezt -ra kiszámolva kapjuk, hogy .
Megjegyzés:
Szerintem egy apró számítási hiba miatt pont koordinátái: . -- Bandita - 2008.06.03.
Képzeljünk el egy kockát, amelyben van egy belső pontunk és egy olyan szakasz indul ki belőle, amely két helyen is metsz (nyilván két különböző) síkot. Hogyan lehetséges ez? Úgy, hogy igazából nem egy kockára vágunk, hanem a kockát határoló síkokra! Nyilván az lesz a számunkra érdekes metszéspont, amely a belső ponthoz közelebb esik (a másik metszéspont ugyanis már a kockán kívül, annak egyik lapja által kijelölt síkkal való metszést jelenti!). Meg kell határoznunk tehát és távolságot, és az a pont lesz a jó nekünk, amelyre ez a távolságmérték kisebb.
Emlékeztető: vektorok távolságát úgy számítjuk, hogy a koordinátánkénti különbségek négyzetét összegezzük, majd az egész összegnek a gyökét vesszük.
Megjegyzés:
Mivel pont koordinátái: , ezért
Szerencsére ez nem befolyásolja a feladat további megoldását :) -- Bandita - 2008.06.03.
Ebből látható, hogy a lesz a metszéspont, amit kerestünk, vagyis a síkokra vágott pontunk -ban lesz.
Így a szakasz két végpontja a vágás, illetve homogén osztás után:
A képernyőkoordinátarendszerben a szakaszt a következőképpen kapjuk meg:
A pont a képernyőn:
A pont a képernyőn:
Így a szakaszrajzoló algoritmus a (4,4), (5,5) és (6,6) pixeleket fogja kiszínezni. A vágósíkokkal való metszésszámításnál egyébként már látszódott, hogy a szakasz mind az x, mind az y (sőt, a z) vágósíkokat is ugyanazon paraméternél metszi, azaz éppen a képernyő jobb felső sarkán hagyja el a képernyőt.
-- NeoXon - 2006.12.08.
Megjegyzés:
Ebben a gondolatmenetben egy apró hiba, hogy a vágósikok pontos számítása:
Azaz, ha h>0:
ha h<0:
Ebből pedig:
Vágósíkok |
[x,y,z,h]=[3,3,-3,9] |
[x,y,z,h]=[3,3,15,-9]
|
|
bent |
|
|
bent |
|
|
bent |
|
|
bent |
|
|
bent |
|
|
bent |
|
|
|
bent
|
|
|
bent
|
|
|
bent
|
|
|
bent
|
|
|
bent
|
|
|
kint
|
De ez nem befolyásolja a végeredményt, szerencsére :)
-- Gyenö - 2007.10.29.