Hirdetés

Alkalmazásfejlesztés badára: Hengerek és kúpok

Bevezető

A gömbtesszellálással foglalkozó bejegyzés végén említettem, hogy ahhoz hasonló módszerrel képesek vagyunk hengert, illetve kúpot előállítani. A titok itt is a koordinátarendszerek közötti váltásokban rejlik, ugyanis létezik egy úgynevezett henger-koordinátarendszer (cylindrical coordinate system). Az algoritmus hasonló lesz a gömbnél alkalmazotthoz, először kiszámítjuk a henger-koordinátákat, majd átváltjuk ezeket a homogén koordinátareendszerbe.

A henger-koordinátarendszerben egy pontot úgy tudunk megadni, mintha az egy képzeletbeli henger felületén helyezkedne el. A Déscartes-féle x,y,z-t most egy ρ, egy φ és egy l (magasság) koordinátára cseréljük. A működése a következő: a φ a forgásszög, ami a Déscartes-féle y tengely körül, arra merőlegesen forog. Ez meghatároz egy vektort, melynek a hosszát adja meg a ρ (sugár). Azonban így csak két dimenzióban tudnánk mozogni, az l (magasság) koordináta segítségével a harmadikba lépünk: ez megfelel a Déscartes-féle y koordinátának. Ha nem világos a (kissé talán homályosnak tűnő) magyarázatom, az alábbi képen egyszerűen meg lehet érteni.

Az algoritmus a következő: henger esetén minden “vertex-oszlopban” két koordináta megegyezik (ρ és φ), csak magasságban (l) térnek el, ezért ezeket csak egyszer kell kiszámítani. Ezt meg is tesszük, azaz a 2Π-t (henger koordinátarendszerben is radiánban kell számolnunk) annyi részre osztjuk, amekkora “vízszintes részletességet szeretnénk”. Nyilván minél nagyobb ez a szám, annál kevésbé lesz “recés” a hengerünk, hiszen annál több háromszöggel közelítjük a kört. Majd ez után felépítjük a hengert, emeletről emeletre, ahány “szintre” szeretnénk bontani, erre majd később visszatérek.

Megvagyunk a hengertesttel, jöhet az alsó és felső rész. Ez két egyszerű körlapot jelent, aminek a szerkesztéséhez a TRIANGLE FAN-t fogjuk használni. Ez egy beépített háromszögrajzolási módszer OpenGL-ben, megadjuk neki a középpontot, majd a kör pontjait (érdemes ugyanolyan részletességű felbontást beállítani, mint a hengernél tettük), és kicsapja nekünk a körlapot.

A csavar az egészben, ha egy kicsit módosítjuk az algoritmusunkat, alkalmas lesz kúp, illetve csonka kúp rajzolásra. A trükk az egészben, hogy ha összehasonlítjuka két objektumot, arra az egetrengető különbségre jutunk, hogy míg a henger esetén a ρ állandó, kúp esetben ez változó (egyenletesen csökken). Mivel a hengerünket is szintekre bontottuk, így ide nagyon könnyen beépíthetjük a kis turpisságot: minden szintnél egy adott szakasszal csökkentjük a sugarat. Ha a ρ a henger csúcsához érve 0-ra csökken, kúpot kapunk, ha nem 0, csonka kúpot.

Normalizálás

Túl vagyunk a dolog mesh-építés részén, azonban, mint az a fényes-anyagos bejegyzésben is olvasható, ahhoz, hogy light használata esetén realisztikus hatást kapjunk, be kell állítanunk a normálvektorokat. Egy henger normálvektorait egy marék lepke is meg tudná mondani, hiszen minden pontban megegyezik az adott pontbeli x és z koordinátákkal, persze normalizálva, az y-t pedig 0-nak véve. Kúpszerű testeknél sem sokkal bonyolultabb a helyzet, az x és z koordináták megegyeznek a pontunk megfelelő koordinátáival, azonban az y-nál trükkösebb a helyzet: ez mindig akkora, amekkora a magasságbeli (l) különbség két “hengerszint” között. Az alábbi képből könnyen megérthető. Az alsó és felső körlap esetén a normálvektorok egyértelműek (y=1 és y=-1).

How about some hardcode?

A kódról csak pár rövid mondatot írnék. A konstruktor öt paramétert vár: alsó körlap sugara, felső körlap sugara, magasság, függőleges és vízszintes felosztás mértéke. Hasonlóan a MySphere-hez, itt is három függvényre osztottam a rajzolást. A calculateVertex végzi a koordináták közti átváltást, a drawPolygon a háromszögek kirajzolását és a normálvektorok helyes beállítását. A draw számítja ki a vertexeket, és hívogatja meg a másik két függvényt. Itt rajzolom ki a körlapokat is, amennyiben szükséges (ha a megfelelő fedlapsugár nem 0). Az eredmény az alábbi képeken látható wireframeként illetve solid objectként.

A sample kód, bár talán nem a legtökéletesebb, természetesen ismét letölthető. Így már minden adott, hogy az eddig ismert technológiákból összehozzuk egy primitív játék primitív pályáját.

holdmester

Azóta történt

Előzmények