Steps3d - oktatóprogramok - mac os x programozás - opengl alkalmazás írása kakaóval
Ebben a cikkben megfontoljuk, hogy programokat írjunk az Objective-C / Objectiver-C ++ programmal kapcsolatban. együttműködik az OpenGL könyvtárral. Az előző cikkel ellentétben azonban teljes kakaót készítünk, használjuk az Interface Builder ablaktervezést, szabványos osztályokat használunk a textúrák betöltéséhez és az üzenetek feldolgozásához az egérből.
Tehát az első lépésünk, mint korábban, az XCode indítása és az alkalmazás típusának kiválasztása - "Cocoa Application".
1. ábra: Válassza ki az alkalmazás típusát.
Nevezzük a projektet - az OpenGL Kakaó példát, és állítsuk be az utat.
2. ábra: Az alkalmazás nevének és könyvtárának megadása.
A projekt létrehozása után haladéktalanul kezdje el a MainMenu.nib fájllal való munkát (az Interface Builder hívásával, kattintson duplán erre a fájlra).
3. ábra: Első lépések a MainMenu.nib.
Ha az OpenGL-t a Kakaóban szeretné használni, akkor a legkényelmesebb az NSOpenGLView osztályból örökölt objektumok használata. Ez az osztály szinte mindent tartalmaz, amire szüksége van az OpenGL-hez való munkához, és sok esetben elegendő csak a DrawRect: módszer felülbírálása.
Projekt megnyitása ablak Interface Builder „és a Classes lapon, és írja be a keresőmezőbe a nevét az osztály, ahonnan azt akarjuk, hogy az örökölt - NSOpenGLView.
Miután megtalálta az osztályt, válasszuk ki és nyomjuk meg az Enter billentyűt. Ez létrehoz egy új, az NSOpenGLView-ből örökölt osztályt, a MyOpenGLView pedig a neve.
4. ábra. Új osztály létrehozása az NSOpenGLView alapján.
Ezután használja a MyOpenGLView osztályok / fájlok létrehozása parancsot. hozza létre ehhez az osztályhoz szükséges fájlokat (5. ábra), és adja hozzá az aktuális projekthez (6.
5. ábra: .m és .h fájlok létrehozása egy új osztályhoz.
6. ábra: A létrehozott fájlok mentése.
Most nyissuk meg az objektum palettáját az utolsó lapon, ahol meglátjuk a kész objektumot az OpenGL - NSOpenGLView használatával.
7. ábra: Az OpenGL és a web használatához szükséges alapelemek.
Húzza be az alkalmazás ablakába, és illessze be a 8. ábrán látható módon.
8. ábra: Az OpenGL összetevő helye az ablakban.
Ezután beállítjuk az Autosizing paramétereket, mint a 2. ábrán. 9.
9. ábra: Autózási paraméterek beállítása.
Továbbá, mivel szeretnénk használni az objektum nem egy osztály NSOpenGLView és objektumosztálynak belőle származó MyOpenGLView, meg kell ragadni a lehetőséget, hogy az Interface Builder „, és egyértelműen meg kell határozni a tényleges osztályban. Ehhez nyissa meg a felügyelő lapra, és válassza az Egyéni osztály az osztály ténylegesen felhasznált MyOpenGLView.
10. ábra: Adja meg a ténylegesen használt osztályt.
A felhasznált osztály kifejezett megadása mellett meg kell adnia számos attribútumot, amelyek közvetlenül kapcsolódnak az OpenGL-hez való munkához. Ehhez nyissa meg az Attribútumok lapot, és állítsa be az OpenGL paramétereket, ahogy az az 1. ábrán látható. 11.
11. ábra: Az OpenGL paraméterek beállítása.
Most menjünk az XCode-ba és állítsuk be a drawRect: mód legegyszerűbb végrehajtását a MyOpenGLView.m fájlban.
Ne feledje, hogy a DrawRect módszeren belül: azonnal használjuk az OpenGL parancsokat. Vegye figyelembe továbbá, hogy a kép kimenete az OpenGL segítségével mindig a glFlush () paranccsal fejeződik be.
Ha most összeállítjuk és futtatjuk az alkalmazásunkat, akkor fekete téglalapot fogunk látni az ablakunkban. Ne feledje, hogy az átméretezéskor a fekete téglalap dimenziói ennek megfelelően változnak.
12. ábra Egy működő alkalmazás.
Alkalmazásunk módosítása valami sokkal értelmesebb, mint egy fekete képernyő. Itt nagyon hasznos lesz a C ++ kód és az Objective-C kód kombinálása az Objective-C ++ segítségével.
Nevezze át a fájlt XCode MyOpenGLView.m a MyOpenGLView.mm (elmondani a fordítónak, hogy ez a fájl tartalmazza a program Objective-C ++).
Ezután adja hozzá a Vector2D.h fájlokat a projekthez. Vector2D.cpp. Vector3D.h. Vector3D.cpp. Vector4D.h és Vector4D.cpp.
Módosítsa a MyOpenGLView.mm fájl tartalmát is, mint a következő listában.
A globális változók és a drawBox funkció nem hordoz semmilyen Mac OS X-specifitást, és az objektum tervezési és forgatási paramétereinek meghatározására szolgál.
Nézzük az átformálási módszert. Szinte teljesen megegyezik a GLUT formázó eseménykezelővel, kivéve, hogy az új dimenziók nincsenek kifejezetten átvitelre, de ezeket meg kell keresni, ha egy limites üzenetet küldenek magának.
Az üzenetre adott válaszként az NSRect struktúrát visszaküldik, amely a méretmezőben a vizuális összetevő méretét tartalmazza. Vegye figyelembe, hogy a méretet lebegőpontos számok határozzák meg.
A méretek megszerzése után egy szabványos kód követi, amely nem tér el a GLUT megfelelő kódjától.
A következő lépések hozzá tudnak kapcsolni az objektumot az egérrel, és támogatják a textúrákat.
Az objektum elforgatásának az egérrel való ellátásához felül kell fejezni az egérDown: and mouseDragged: metódusokat a MyOpenGLView osztályban.
Az első ilyen módszert az egér gombjainak megnyomásával hívja (ha még mindig úgy gondolja, hogy az egérnek csak egyetlen gombja van a Macs-on, akkor nagyon rosszul vagy.) Ez a módszer az NSEvent osztály egy objektumához mutató mutatót veszi figyelembe. amely minden információt továbbít a megfelelő eseményről. Ebből az információból csak az a pont koordinátái szükségesek, amelyeken az egér kattintása történt. Ezután ezeket a koordinátákat a mouseOld változón tárolja.
Az egér kurzor koordinátáinak eléréséhez az esemény objektum idején egy locationInWindow üzenet kerül elküldésre. amely az ablak koordinátarendszerével koordinátákat ad vissza. Ezután használhatja az NSView osztály konverziós: fromView: módját.
Ezt a módszert arra használják, hogy a koordinátákat egy nézet koordinátarendszeréről egy másik nézet koordinátarendszerére lefordítsák. Ha az NSView osztály egyik objektumának mutatója helyett a rendszert, amelynek koordinátáját le kell fordítani a koordinátákat, nulla értéket ad. akkor ebben az esetben van egy fordítás a nézetből álló ablak koordinátarendszeréből.
Mac OS X megkülönbözteti (a GLUT) egyszerű egér mozgását (ha nem nyomja meg valamelyik egérgomb) - ez megfelel az üzenet mouseMoved: - és az egér mozgatásával, miközben bármelyik egér gomb - ez megfelel az üzenet mouseDragged:.
Az ilyen megosztottságnak van bizonyos jelentése - leggyakrabban az utolsó típusú üzenetek szükségesek, míg az első típusú üzeneteket leginkább sikeresen figyelmen kívül hagyják. Ezért a Mac OS X lehet engedélyezni / letiltani az üzenetet küldő mouseMoved: (bár lehet, hogy ez annak köszönhető, hogy az örökölt NextStep'a és a harc a sebesség).
Mindössze annyit kell tennünk az egérben. meg kell találni a különbséget az egér koordinátái között az előző hívás és az aktuális között, hogy beállítsák a forgási szögeket, és tárolják az egérOld-ban lévő jelenlegi koordinátaértéket erre a különbségre. Ezt követően küldenie kell magát egy üzenetsorozatraNeedsDisplay: az YES paraméterrel az ablak tartalmának újratervezését okozhatja.
A megfelelő módszert kódot az alábbiakban mutatjuk be.
Fájlok textúrájának betöltése érdekében a legkönnyebb a Mac OS X által készített kész készleteket használni - ennek eredményeképpen többféle textúra formátumot támogatunk.
Készítjük a kódot a fájlnak a megadott névvel egy külön módszerrel való betöltésére:
Mint látható a fenti kódot, a fájl tartalmát a textúra töltjük NSData osztály objektum (egy üzenet osztály dataWithContentsOfFile :), mert egy képet készít formájában NSBitmapImageRep osztályban például (üzenetletöltés imageRepWithData osztály :), ami után a beépített fejjel lefelé, függőleges kép, és betöltődik az OpenGL textúrába a szokásos módon.
Sajnos a fájlok betöltését nem szabad az osztályba tartozó init * módszerbe helyezni. Ez a felhasználó által beírt osztályok objektumainak nib fájljából történő betöltés sajátos jellegéből adódik.
Ha az Interface Builder szabvány osztályok csak fel a tollhegy-file archivált arculati elemek egyedi osztályok, hogy ő nem tud, mert nem rendelkezik a kódot ilyen osztályok.
Ennek eredményeképpen néhány adat kerül a nib-fájlba, amely szerint a kívánt objektum speciális módon van kialakítva a terhelési fázisban. Ez az eljárás nagyon sajátos, és ennek következtében jobb, ha az awakeFromNib üzenetet az ilyen objektumok inicializálására használják. minden objektumhoz küldve, miután a nib-fájl összes objektuma teljesen betöltődött.
Mi egy alternatív megközelítés (valójában egy változata terhelés felszólításra vagy lusta értékelés) - a módszer drawRect: ellenőrizni fogjuk az ID a textúra (összes példány például a változók Objective-C mindig zéró kezdeti értékre), és ha ez nulla, akkor hozzon létre egy textúra betölti kép a fájlból.
Az alábbi ábra a létrehozott program képernyőképét mutatja.
13. ábra: Végleges alkalmazás.
Egy nagyon kényelmes hely a textúrák tárolására a program forrásai, pontosabban a nib-fájl. Annak érdekében, hogy textúrát adjon hozzá a nib-fájlhoz, csak nyissa meg a Képek lapot, és húzza ott a textúra fájlt.
Mivel a nib fájl valójában egy könyvtár, amely része az alkalmazás könyvtárnak, a textúra fájlunk egy olyan rendszeres fájl, amely valahol az alkalmazás könyvtárában található. Az adott névhez tartozó képek eléréséhez használja az NSBundle osztályt és annak módszereit.
A fenti loadTextureFromResource módszer az OpenGL textúrák alkalmazásforrásokból történő betöltésére szolgál. Ehhez először meg kell mutatni egy mutatót egy NSBundle objektumhoz. A megfelelő nib fájl, amelyben a kívánt textúra található.
Ha ezt a textúrát a fő nib fájlba (MainMenu.nib) szeretnénk elhelyezni, akkor kényelmesen használhatjuk a mainBundle módszert annak eléréséhez. Visszaad egy mutatót a fő nib fájlnak megfelelő NSBundle objektumhoz.
Ezt követően, hogy az utat, hogy a képfájl által használt név üzenetek pathForImageResource: (eléréséhez az audio források segítségével egy üzenetet pathForSoundResource való hozzáférés források bármilyen típusú üzenet pathForResource :. OfType :).
A textúra fájl elérési útja után a korábban bevezetett loadTextureFromFile: módszer betölti.
UCoz technológiát alkalmaznak