Hoe maak je een kubus in opengl

OpenGL is een 3D-programmeergereedschap waarmee u complexe driedimensionale beelden van eenvoudige formulieren kunt maken. Uit dit artikel leert u hoe u ermee kunt tekenen, zal een eenvoudige kubus helpen die in drie dimensies kan worden geroteerd!

Stappen

Deel 1 van 3:
Eerste installatie
een. Installeer OpenGL. Start S OpenGL-installatiegeleiders op jouw computer. Als OpenGL en de compiler met u al hebben, kunt u deze stap overslaan en naar de volgende gaan.
  • 2. Maak een document. Maak een nieuw bestand in uw favoriete codeeditor en sla deze op als MyCube.C
  • 3. Voeg #inclusief toe. Hier zijn de belangrijkste #include-richtlijnen die u nodig hebt. Het is belangrijk om te onthouden dat richtlijnen voor verschillende besturingssystemen verschillend zijn, en daarom is het noodzakelijk om alles te kiezen, zodat het programma universeel is en het kan worden gelanceerd in elk systeem.
    // bevat # omvatten #Erbij betrekken #Erbij betrekken #DEFINE GL_GELXT_PROTOTYPES # IFDEF __Apple __ # Omvat # else # opnemen #endif
  • 4. Voeg functionele prototypen en globale variabelen toe. De volgende stap zal functionele prototypen verklaren.
    // Functioneel prototypesvoid-display () - Void Specialkys () - // Global Variablessdeble Rotate_y = 0-Double Rotate_x = 0-
  • vijf. Stel de hoofd () functie in.
    Int Main (INGRC, CHAR * ARGV []) // Initialiseer glut en proces Gebruiker ParametersGlutinit (& ARGC, ARGV) - // Vraag een dubbel bufferende venster aan, Z-bufferisatie en kleurenschema True ColorGlutinitDisplayMode (Glut_double 
  • Deel 2 van 3:
    Display () functie
    een. Begrijp de toewijzing van de functie () functie. Alle werkzaamheden op tekenen van Cuba valt op fragiele lijnen van deze functie. Het idee in het algemeen is als volgt: u tekent zes afzonderlijke gezichten van de kubus en plaats ze in de juiste posities.
    • Voor elk gezicht definieert u vierhoek en OpenGL verbindt ze met lijnen en vul de kleur die u kiest. Hieronder zal het zien hoe het te doen.
  • 2. Voeg de GLCLEAR () -functie toe. Allereerst, werken we met deze functie, we hebben nodig Duidelijke kleur en z-buffer. Zonder dit zal onder het nieuwe patroon oud worden gezien en zullen de door het programma getrokken objecten onjuist worden geregeld.
    Void display () gl_depth_buffer_bit)-
  • 3. Voeg GLBEGIN () EN GLEND (). OpenGL-objecten zijn combinaties van verschillende polygonen. Team GLBEGIN () Sta ons toe om een ​​object met u te tekenen - het is als een potlood, die u een figuur tekent zonder het van papier te scheuren. Om het potlood van het vel te scheuren en begin iets nieuws te tekenen, heb je een team nodig Glend (). In dit artikel zullen we GL_POLYGON gebruiken om elke rand van de kubus te tekenen, hoewel het mogelijk is om andere parameters zoals GL_LINE, GL_QUAD of GL_TRIANGLE te gebruiken om andere vormen te maken.
  • Begin met de voorkant van de kubus. Later zullen we de kleur toevoegen aan elk van de zes gezichten.
  • // Multicolor Side - Frontglbegin (GL_POLYGON) - // Verses Toevoegen in de volgende stepglend ()-
  • 4. Voeg de functie GlvertEx3F () toe. Nu u het programma hebt uitgelegd dat u wilt beginnen met het tekenen van een polygoon, hebt u nodig Vertices instellen Object. De Glverex-functie heeft verschillende vormen, waarvan het gebruik afhangt van wat u met uw object wilt doen.
  • Ten eerste - Hoeveel metingen werkt u? Figuur 3 in Glvertex3F geeft drie dimensies aan. U kunt echter in 2 werken, en in 4 metingen. De letter F geeft op zijn beurt aan dat we werken met drijvende puntkomma`s. Hier kunt u echter integer, dubbele of korte typen gebruiken.
  • Merk op dat alle punten zijn ingesteld tegen de klok in pijlen. Hoewel het niet erg belangrijk is, maar wanneer je begint met werken aan verlichting, textuur, behandeling van niet-tariefgezichten, zal de gewoonte om alles tegen de klok in te voorschrijven erg handig voor jou.
  • Voeg de hoekpunten toe tussen de GLBEGIN () en Gleend () Lijnen.


  • // Multicolor Side - FrontGLBEGIN (GL_POLYGON) -GLVVERTEX3F (-0.vijftig.vijftig.5) - // p1glvertex3f (-0.5.0.vijftig.5) - // p2glvertex3f (0.5.0.vijftig.5) - // p3glvertex3f (0.vijftig.vijftig.5) - // p4glend ()-
  • vijf. Voeg de functie GLCOLOR3F () toe. GLCOLOR handelt op veel manieren vergelijkbaar met Glverex. Punten U kunt gegevenstypen van korte, geheel getal, dubbel of float instellen. Elke kleur heeft een waarde van 0 tot 1. Alle nullen zijn zwart, alle eenheden - respectievelijk wit. Figuur 3 in GLCOLOR3F () geeft het RGB-kleurenschema aan zonder alfakanaal. Alpha-kanaalkleuren zijn verantwoordelijk voor de transparantie ervan. Als u de alfakanaalwaarde wilt wijzigen, gebruikt u GLCOLOR4F () met de laatste parameter van 0 tot 1, dat is, van ondoorzichtig tot transparantie.
  • CALLING GLCOLOR3F () REASSEREN ELKE VERTEX van het opgegeven punt in de opgegeven kleur. Met andere woorden, als alle vier de hoekpunten rood moeten zijn, stelt dan slechts één alleen de kleurwaarde in voordat u de GLVERTEX3F-opdrachten () belt, en ze zullen allemaal rood zijn.
  • In het voorbeeld van het voorste gedeelte hieronder kunt u zien hoe de nieuwe kleur van elke vertex is ingesteld. Wanneer u het doet, kunt u kennis maken met een interessant kenmerk van de bloemenopengl. Aangezien elk snuifje van de polygoon zijn eigen kleur heeft, mengt OpenGL automatisch kleuren! De code die is geplaatst, laat zien hoe u vier hoekpunten met dezelfde kleur kunt maken.
  • // Multicolor Side - Frontglbegin (GL_POLYGON) -GLCOLOR3F (1.0, 0.0, 0.0) -GVERVEX3F (0.vijftig.vijftig.5) - // P1 RedglColor3F (0.0, 1.0, 0.0) -GVERVEX3F (0.5.0.vijftig.5) - // P2 GreenglColor3F (0.0, 0.0, 1.0) -GVERVEX3F (-0.5.0.vijftig.5) - // P3 Blueglcolor3F (1.0, 0.0, 1.0) -GVERVEX3F (-0.vijftig.vijftig.5) - // P4 PurpleGLend ()-
  • 6. Teken andere gezichten Cuba. Beter, natuurlijk, als u zelf de locatie van de rest van de kubus en elk van de hoekpunten vindt, maar omwille van de eenvoud hebben we ze voor u berekend. De code wordt gegeven B De definitieve functie-display () onderstaand.
    // White Side - Achterglbegin (GL_POLYGON) -GLCOLOR3F (1.0.1.0, 1.0) -GVERVEX3F (0.vijftig.vijftig.5) -GVERVERTEX3F (0.5.0.vijftig.5) -GVERVERTEX3F (-0.5.0.vijftig.5) -GVERVERTEX3F (-0.vijftig.vijftig.5) -Glog () - // Violet Side - RuralGLBEGIN (GL_POLYGON) -GLCOLOR3F (1.0,0.0.1.0) -GVERVEX3F (0.vijftig.vijftig.5) -GVERVERTEX3F (0.5.0.vijftig.5) -GVERVERTEX3F (0.5.0.5.0.5) -GVERVERTEX3F (0.vijftig.5.0.5) - Glend () - // Green Side - LeftGLBEGIN (GL_POLYGON) -GLCOLOR3F (0.0.1.0,0.0) -GVERVEX3F (-0.vijftig.5.0.5) -GVERVERTEX3F (-0.5.0.5.0.5) -GVERVERTEX3F (-0.5.0.vijftig.5) -GVERVERTEX3F (-0.vijftig.vijftig.5) - Glend () - // Blue Side - Ouderglbegin (GL_POLYGON) -GLCOLOR3F (0.0,0.0.1.0) -GVERVEX3F (0.5.0.5.0.5) -GVERVERTEX3F (0.5.0.vijftig.5) -GVERVERTEX3F (-0.5.0.vijftig.5) -GVERVERTEX3F (-0.5.0.5.0.5) -Glog () - // Rode kant - NIZHNYGLBEGIN (GL_POLYGON) -GLCLECOLOR3F (1.0,0.0,0.0) -GVERVEX3F (0.vijftig.vijftig.5) -GVERVERTEX3F (0.vijftig.5.0.5) -GVERVERTEX3F (-0.vijftig.5.0.5) -GVERVERTEX3F (-0.vijftig.vijftig.5) - Glend () - Glflush () - Glutswapbuffers ()-
  • Let op de laatste twee lijnen. Dit zijn functies GLFLUSH ()- en glutswapbuffers ()-, Het effect van dubbele buffering geven, dat hierboven werd verteld.
  • Deel 3 van 3:
    Interactief programma
    een. Voeg de functie SpecialKeys () toe. In principe is alles bijna klaar, maar de kubus is alleen getekend en draait niet. Om dit te doen, maakt u Specialkys () functie, die de kubus roteert door op de pijltjestoetsen te drukken!
    • Het was voor deze functie die de wereldwijde variabelen rotate_x en rotate_y werden aangekondigd. Wanneer u op de pijltjestoetsen "Links" en "Rechts" drukt, neemt de rotatiewaarde van de rotatie in of af van vijf graden. Evenzo zullen we de waarde van rotate_x wijzigen, maar al op de pijltoetsen "Up" en omlaag drukken.
    Void Specialkys (INT-KEY, INT X, INT Y) {// RECHTSPROWN - Toenemende rotatie van 5 gradenIF (sleutel == glut_key_right) rotate_y + = 5 - // linker pijl - vermindering van rotatie van 5 gradenelse indien (sleutel == glut_key_left) rotate_y - = 5-anders if (key == glut_key_up) rotate_x + = 5-anders if (key == glut_key_down) rotate_x - = 5 - // verzoek om een ​​screenglutpostredplayplay () -}
  • 2. Voeg GLROTATE () toe. Het laatste wat we zullen doen is een touw toevoegen die ons in staat stelt om het object te roteren. Keer terug naar de functie SCHERM () En vóór het beschrijven van de voorkant, voeg dan toe:
    // Reset TransformationsGlloadIdentity () - // Rotatie bij het wijzigen van de gebruiker Rotate_x en Rotate_Yglotatef-waarden (Rotate_x, 1.0, 0.0, 0.0) -glrotatef (rotate_y, 0.0, 1.0, 0.0) - // Multicolor Side - Front....
  • Merk op dat syntaxis GLROTATEF (), die vergelijkbaar is met de syntaxis van GLCOLOR3F () en GlvertEx3F (), maar altijd de indicatie van vier parameters vereist. Eerst - de rotatiehoek in graden. De volgende drie-assen waarvoor rotatie gaat, in de volgorde X, Y, Z. Tot nu toe moeten we de kubus roteren op twee assen, x en u.
  • Voor alle transformaties die we het programma specificeren, zijn vergelijkbare lijnen vereist. In feite vertegenwoordigen we de rotatie van het object langs de x-as als een verandering in de rotatiewaardewaarde, en de rotatie van de as van de as - als een verandering in de waarde van rotate_y. OpenGL zal echter alles verenigen in één transformatiematrix. Of u de weergavefunctie belt, u maakt een transformatiematrix en Gladingtiteit () stelt je in staat om elke keer met een nieuwe matrix te beginnen.
  • Andere transformatiefuncties die u zou kunnen gebruiken is glcalenlatef () en GLCALEF (). Ze zijn vergelijkbaar met GLROTATEF (), behalve dat slechts drie parameters vereisen: de waarden X, Y en Z om het object te wijzigen en te schalen.
  • Zodat alles correct wordt weergegeven wanneer alle drie de transformaties op één object worden toegepast, moet u transformaties in de juiste volgorde instellen, namelijk Gltranslate, Glotate, Glscale - en nooit anders. OpenGL transformeert een object dat het programma leest vanaf de onderkant omhoog. Om dit beter te begrijpen, stelt u dan voor hoe de 1x1x1-kubus voor alle transformaties zal zorgen als OpenGL ze in een bevel aanbracht als die aangegeven (van boven naar beneden) en dan nadenken over hoe OpenGL de kubus behandelt, de instructies van onderop lijdt,.
  • 3. Voeg de volgende opdrachten toe voor twee-time kubusschaling langs assen X en Y, om een ​​kubus 180 graden langs de as van de as te draaien, evenals om de kubus met 0,1 langs de x-as te verplaatsen. Zorg ervoor dat alle relevante opdrachten, inclusief eerder opgegeven GLROTATE () -opdrachten, in de juiste volgorde worden opgegeven. Als u bang bent om u te vergissen, zie de definitieve versie van het programma aan het einde van het artikel.
    // Andere transformatiesGltranslatef (0.10.0, 0.0) -glrotatef (180, 0.0, 1.0, 0.0) -glscalef (2.0, 2.0, 0.0)-
  • 4. Compileren en voer de code uit. Stel dat u GCC als compiler gebruikt, dus voer de volgende opdrachten in op de terminal:
    Op Linux: GCC CUBE.C -O CUBE -LGLUT -LGL./ MyCuben Mac: GCC -O foo foo.C -Framework Glut -Framework OpenGL./ MyCube Windows: GCC -Wall -Fooo Foo.C -LGLUT32CU -LGLU32 -LOPENGL32./ MyCube
  • vijf. Controleer de definitieve code. Hier is de definitieve code die is gemaakt door de auteur van het artikel waarin opmerkingen niet werden vertaald.
    //// Bestand: MyCube.C // Auteur: Matt Daisley // Gemaakt: 4/25 / 2012 // project: broncode voor het maken van een kubus in OpenGL // Beschrijving: Creëert een OpenGL-venster en trekt een 3D-kubus // die de gebruiker kan draaien met behulp van de Pijltjestoetsen // // Controles: Links Pijl - Roteren Links // Rechte pijl - Rigeer rechts // omhoog pijl - draai omhoog // omlaag pijl - Draai naar beneden // ------------ -------------------------------------------- // omvat // - --------------------------------------------------- - ------- # omvatten #Erbij betrekken #Erbij betrekken #DeFine GL_GELXT_PROTOTYPES # IFDEF __Apple __ # Omvat # else # omvatten # endif // ----------------------------------- - ------------------------ //-functie prototypes // ---------------------- --- -------------------------------------- Void Display () - Void SpecialKeys () - // ------------------------------------------------ ----- ------- // Global variabelen // ----------------------------------- -------- ---------------------- Double rotate_y = 0-Double Rotate_x = 0 - // ---------- --------------------------------------------------- / / Display () Callback-functie / / ----------------------------------------------- -------- --------- Veel display () // Clear Screen en Z-BuffergLClear (GL_COLOR_BUFFER_BIT // ---------------------- ------------------------------------------ // Specialkys () Callback-functie // - ---------------------------------------------------- --------- void SpecialKeys (INT-toets, int x, int y) {// rechter pijl - verhoog de rotatie met 5 diploma (sleutel == glut_key_right) rotate_y + = 5 - // linker pijl - afnemende rotatie Met 5 grenzen if (key == glut_key__ Links) Rotate_y - = 5-anders if (key == glut_key_up) rotate_x + = 5-anders if (key == glut_key_down) rotate_x - = 5 - // verzoek display upategistrodisplay () -} // -------- --------------------------------------------------- - - // Main () functie // ----------------------------------------- --- ------------------- IN MAIN (INT ARGC, CHAR * ARGV []) Glut_Depth) - // Maak vensterGlutCreatewindow ("Geweldige kubus") - // Schakel Z-Buffer Dieptest TestGleenable (GL_DEPTH_TEST) - // Callback FunctionsGlutdisplayFunc (Display) -GlutspecialFunc (SpecialKeys) - // Pass Control to Glut for EventsGlutmainLoop () - // Keer terug naar Osreturn 0-
  • Deel in het sociale netwerk:
    Vergelijkbaar