OpenGL'de küp nasıl yapılır

Yazar: Gregory Harris
Yaratılış Tarihi: 12 Nisan 2021
Güncelleme Tarihi: 1 Temmuz 2024
Anonim
WSL + VSCode + Windows Terminal ile Geliştirici Ortamınızı Kurun - Muhammed Oğuz - #MLSA
Video: WSL + VSCode + Windows Terminal ile Geliştirici Ortamınızı Kurun - Muhammed Oğuz - #MLSA

İçerik

OpenGL, basit şekillerden karmaşık 3B görüntüler oluşturmanıza olanak tanıyan bir 3B programlama aracıdır. Bu yazıda, onun yardımıyla üç boyutlu döndürülebilen basit bir küp çizmeyi öğreneceksiniz!

adımlar

Bölüm 1/3: İlk Kurulum

  1. 1 OpenGL'yi yükleyin. OpenGL'yi bilgisayarınıza nasıl kuracağınıza dair bir eğitimle başlayın. Halihazırda OpenGL ve bir C derleyiciniz varsa, bu adımı atlayabilir ve bir sonrakine geçebilirsiniz.
  2. 2 Bir belge oluşturun. Favori kod düzenleyicinizde yeni bir dosya oluşturun ve mycube.c olarak kaydedin
  3. 3 #include ekleyin. İşte ihtiyacınız olan temel #include yönergeleri. Farklı işletim sistemleri için yönergelerin farklı olduğunu hatırlamak önemlidir ve bu nedenle programın evrensel olması ve herhangi bir sistemde çalıştırılabilmesi için her şeyi seçmeniz gerekir.

      // #include stdio.h içerir> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 İşlevsel prototipler ve küreseller ekleyin. Bir sonraki adım, işlevsel prototipleri bildirmektir.

      // İşlevsel prototipler gösterimi geçersiz kılar (); özel Tuşları geçersiz kıl (); // Global değişkenler double döndürme_y = 0; çift ​​döndürme_x = 0;

  5. 5 ana () işlevini tanımlayın.

      int main (int argc, char * argv []) // GLUT'u başlat ve özel parametreleri glutInit (& argc, argv); // Çift Arabelleğe Alma, Z-Tamponlama ve Gerçek Renk glutInitDisplayMode (GLUT_DOUBLE) Destekli Bir Pencere İsteyin

Bölüm 2/3: Ekran () İşlevi

  1. 1 Görüntüleme () işlevinin amacını anlayın. Küpün işlenmesiyle ilgili tüm çalışmalar bu işlevin kırılgan hatlarına düşecektir. Genel fikir şudur: Küpün altı ayrı yüzünü çizecek ve bunları kendi konumlarına yerleştireceksiniz.
    • Her yüz için dört köşe tanımlayacaksınız ve OpenGL bunları çizgilerle birleştirecek ve seçtiğiniz renkle dolduracak. Bunun nasıl yapılacağı aşağıda açıklanacaktır.
  2. 2 glClear () işlevi ekleyin. Her şeyden önce, bu fonksiyonla çalışırken ihtiyacımız olan açık renk ve z-tampon... Bu olmadan, eskisi yeni resmin altında görünecek ve program tarafından çizilen nesneler yanlış konumlandırılacaktır.

      void display () // Ekranı ve Z Tamponunu Temizle glClear (GL_COLOR_BUFFER_BIT

    • Son iki satıra dikkat edin. bunlar fonksiyonlar glFlush(); ve glutSwapBuffers ();, yukarıda açıklanan çift tamponlamanın etkisini verir.

Bölüm 3/3: Program Etkileşimi

  1. 1 specialKeys() işlevini ekleyin. Prensip olarak, her şey neredeyse hazırdır, ancak küp yalnızca çizilir ve döndürülmez. Bunu yapmak için oluşturmanız gerekir özel Tuşlar () işlevi, ok tuşlarına basarak küpü döndürmenizi sağlayacak!
    • Bu fonksiyon için genel rotasyon_x ve döndürme_y değişkenleri bildirildi. Sol ve sağ ok tuşlarına bastığınızda döndürme_y değeri beş derece artacak veya azalacaktır. döndürme_x değeri aynı şekilde değişecektir, ancak bu sefer yukarı ve aşağı ok tuşlarına basarak.
    • void specialKeys (int tuşu, int x, int y) {// Sağ ok - (anahtar == GLUT_KEY_RIGHT) döndürme_y + = 5 ise dönüşü 5 derece artırın; // Sol Ok - Döndürmeyi 5 Derece Azalt eğer (anahtar == GLUT_KEY_LEFT) döndürme_y - = 5; yoksa (anahtar == GLUT_KEY_UP) döndürme_x + = 5; yoksa (anahtar == GLUT_KEY_DOWN) döndürme_x - = 5; // Ekran Yenilemesini İste glutPostRedisplay (); }

  2. 2 glRotate () ekleyin. Yapacağımız son şey, nesneyi döndürmemize izin verecek bir çizgi eklemek. İşleve dön Görüntüle () ve FRONT tarafının açıklamasından önce şunu ekleyin:

      // Dönüştürmeleri Sıfırla glLoadIdentity (); // Kullanıcı Değiştiğinde Döndür Rotate_x ve rotary_y glRotatef değerleri (rotate_x, 1.0, 0.0, 0.0); glRotatef (döndürme_y, 0.0, 1.0, 0.0); // Çok renkli taraf - ÖN ....

    • Lütfen sözdiziminin glRotatef ()glColor3f() ve glVertex3f() sözdizimine benzer, ancak her zaman dört parametre gerektirir. Birincisi, derece cinsinden dönme açısıdır. Sonraki üçü, x, y, z sırasına göre dönüşün gerçekleştiği eksenlerdir. Şimdilik, küpü iki eksen, x ve y boyunca döndürmemiz gerekiyor.
    • Programda tanımladığımız tüm dönüşümler benzer satırlar gerektirir. Temel olarak, bir nesnenin x ekseni boyunca dönüşünü döndürme_x değerindeki bir değişiklik olarak ve y ekseni boyunca dönüşü de döndürme_y değerindeki bir değişiklik olarak temsil ederiz. Ancak OpenGL, her şeyi tek bir dönüşüm matrisinde toplayacaktır. Display'i her çağırdığınızda, bir dönüşüm matrisi oluşturacaksınız ve glLoadIdentity () her seferinde yeni bir matrisle başlamanıza izin verecektir.
    • Kullanmış olabileceğiniz diğer dönüştürme işlevleri glTranslatef() ve glScalef()'tir. glRotatef () işlevine benzerler, ancak yalnızca üç parametreye ihtiyaç duyarlar: nesneyi yeniden boyutlandırmak ve ölçeklendirmek için x, y ve z değerleri.
    • Üç dönüşümün tümü tek bir nesneye uygulandığında her şeyin doğru görüntülenmesi için, dönüşümleri uygun sırada ayarlamanız gerekir, yani glTranslate, glRotate, glScale - ve asla başka türlü. OpenGL, programı aşağıdan yukarıya okuyarak nesneyi dönüştürür. Bunu daha iyi anlamak için, OpenGL bunları gösterilen sırada (yukarıdan aşağıya) uygularsa 1x1x1 küpünün tüm dönüşümlerden sonra nasıl görüneceğini hayal edin ve ardından talimatları aşağıdan yukarıya okuyarak OpenGL'nin küpü nasıl işleyeceğini düşünün.
  3. 3 Küpü x ve y yönlerinde iki kez ölçeklendirmek, küpü y ekseninde 180 derece döndürmek ve küpü x ekseninde 0.1 hareket ettirmek için aşağıdaki komutları ekleyin. Daha önce verilen glRotate() komutları dahil tüm ilgili komutların doğru sırada olduğundan emin olun. Hata yapmaktan korkuyorsanız, makalenin sonunda programın son halini görün.

      // Daha Fazla Dönüşüm glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 4 Kodu derleyin ve çalıştırın. Diyelim ki derleyiciniz olarak gcc kullanıyorsunuz, bu nedenle aşağıdaki komutları terminalinize girin:

      Linux'ta: gcc cube.c -o cube -lglut -lGL ./ mycube Mac'te: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Windows'ta: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Son kodu kontrol edin. İşte makalenin yazarı tarafından oluşturulan ve yorumları çevirmeyen son kod.

      // // Dosya: mycube.c // Yazar: Matt Daisley // Oluşturuldu: 25.04.2012 // Proje: OpenGL'de Küp Oluştur için kaynak kodu // Açıklama: Bir OpenGL penceresi oluşturur ve bir 3B küp çizer / / Kullanıcının ok tuşlarını kullanarak döndürebileceği // // Kontroller: Sol Ok - Sola Döndür // Sağ Ok - Sağa Döndür // Yukarı Ok - Yukarı Döndür // Aşağı Ok - Aşağı Döndür // ------ -------------------------------------------------- - // İçerir // ------------------------------------------- - -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else # include GL / glut.h> #endif // ------------------------------------------ - ------------------ // Fonksiyon Prototipleri // ------------------------- - -------------------------------- boş ekran (); özel Tuşları geçersiz kıl (); // ------------------------------------------------ ---------- // Global Değişkenler // ---------------------------------- ------------------------ çift döndürme_y = 0; çift ​​döndürme_x = 0; // ------------------------------------------------ ---------- // görüntüleme () Geri arama işlevi // ------------------------------- --------------------------- ekranı geçersiz kıl () // Ekranı temizle ve Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // özel Tuşlar () Geri Çağırma İşlevi // ------------------------------------------ - ------------------ void specialKeys (int tuşu, int x, int y) {// Sağ ok - döndürmeyi 5 derece artırın (anahtar == GLUT_KEY_RIGHT) döndürme_y + = 5; // Sol ok - döndürmeyi 5 derece azaltır, değilse (anahtar == GLUT_KEY_LEFT) döndürme_y - = 5; değilse (anahtar == GLUT_KEY_UP) döndürme_x + = 5; değilse (anahtar == GLUT_KEY_DOWN) döndürme_x - = 5; // glutPostRedisplay görüntüleme güncellemesi iste ();} // ----------------------------------- - ---------------------- // ana () işlevi // ------------------- - -------------------------------------- int ana (int argc, char * argv [ ] ) GLUT_RGB