Како направити коцку у ОпенГЛ -у

Аутор: Gregory Harris
Датум Стварања: 12 Април 2021
Ажурирати Датум: 1 Јули 2024
Anonim
Како направити коцку у ОпенГЛ -у - Друштво
Како направити коцку у ОпенГЛ -у - Друштво

Садржај

ОпенГЛ је алат за 3Д програмирање који вам омогућава да креирате сложене 3Д слике од једноставних облика. У овом чланку ћете научити како уз његову помоћ нацртати једноставну коцку која се може ротирати у три димензије!

Кораци

Део 1 од 3: Почетна инсталација

  1. 1 Инсталирајте ОпенГЛ. Почните са водичем о томе како да инсталирате ОпенГЛ на рачунар. Ако већ имате ОпенГЛ и Ц компајлер, можете прескочити овај корак и прећи на следећи.
  2. 2 Направите документ. Направите нову датотеку у свом омиљеном уређивачу кода и сачувајте је као мицубе.ц
  3. 3 Додајте #инцлудес. Ево основних директива #инцлуде које ће вам требати. Важно је запамтити да су директиве за различите оперативне системе различите, па стога морате изабрати све тако да је програм универзалан и да се може покренути на било ком систему.

      // Укључује #инцлуде стдио.х> #инцлуде стдарг.х> #инцлуде матх.х> #дефине ГЛ_ГЛЕКСТ_ПРОТОТИПЕС #ифдеф __АППЛЕ__ #инцлуде ГЛУТ / глут.х> #елсе #инцлуде ГЛ / глут.х> #ендиф

  4. 4 Додајте функционалне прототипе и глобале. Следећи корак је декларисање функционалних прототипова.

      // Функционални прототипи воид дисплаи (); воид специалКеис (); // Глобалне променљиве доубле ротате_и = 0; доубле ротате_к = 0;

  5. 5 Дефинишите функцију маин ().

      инт маин (инт аргц, цхар * аргв []) // Иницијализација ГЛУТ -а и обрада прилагођених параметара глутИнит (& аргц, аргв); // Затражите прозор са подршком за двоструко баферовање, З-пуферисање и праве боје глутИнитДисплаиМоде (ГЛУТ_ДОУБЛЕ

2. део од 3: Функција приказа ()

  1. 1 Схватите сврху функције дисплаи (). Сав посао око рендеровања коцке пашће на крхке линије ове функције. Општа идеја је следећа: нацртаћете шест засебних лица коцке и поставити их на одговарајуће положаје.
    • За свако лице ћете дефинисати четири угла, а ОпенГЛ ће их повезати линијама и испунити бојом коју сте одабрали. Како то учинити биће објашњено у наставку.
  2. 2 Додајте функцију глЦлеар (). Пре свега, када радимо са овом функцијом, потребно нам је бистра боја и з-пуфер... Без овога, стари ће бити видљив испод нове слике, а објекти које је нацртао програм биће неправилно позиционирани.

      воид дисплаи () // Обриши екран и З бафер глЦлеар (ГЛ_ЦОЛОР_БУФФЕР_БИТ

    • Обратите пажњу на последња два реда. Ово су функције глФлусх (); и глутСвапБуфферс ();, дајући ефекат двоструког пуферирања, који је горе описан.

3. део 3: Интерактивност програма

  1. 1 Додајте функцију специалКеис (). У принципу, све је скоро спремно, али коцка се само извлачи, а не ротира. Да бисте то урадили, потребно је да креирате функција специалКеис (), који ће вам омогућити да ротирате коцку притиском на тастере са стрелицама!
    • За ову функцију су проглашене глобалне променљиве ротате_к и ротате_и. Када притиснете тастере са стрелицама налево и надесно, вредност ротате_и ће се повећати или смањити за пет степени. Вредност ротате_к ће се променити на исти начин, али овај пут притиском на тастере са стрелицама нагоре и надоле.
    • воид специалКеис (инт кеи, инт к, инт и) {// Стрелица надесно - повећајте ротацију за 5 степени иф (кеи == ГЛУТ_КЕИ_РИГХТ) ротате_и + = 5; // Стрелица улево - Смањи ротацију за 5 степени иначе иф (кеи == ГЛУТ_КЕИ_ЛЕФТ) ротате_и - = 5; елсе иф (кеи == ГЛУТ_КЕИ_УП) ротате_к + = 5; елсе иф (кеи == ГЛУТ_КЕИ_ДОВН) ротате_к - = 5; // Затражи освежавање екрана глутПостРедисплаи (); }

  2. 2 Додајте глРотате (). Последње што ћемо учинити је да додамо линију која ће нам омогућити да ротирамо објекат. Повратак на функцију приказ () а пре описа предње стране додати:

      // Ресетовање трансформација глЛоадИдентити (); // Ротирај када корисник промени Вредности ротате_к и ротате_и глРотатеф (ротате_к, 1.0, 0.0, 0.0); глРотатеф (ротате_и, 0.0, 1.0, 0.0); // Вишебојна страна - ПРЕДЊА ....

    • Имајте на уму да је синтакса глРотатеф ()што је слично синтакси глЦолор3ф () и глВертек3ф (), али увек захтева четири параметра. Први је угао ротације у степенима. Следеће три су осе дуж којих се одвија ротација, по редоследу к, и, з. За сада морамо да ротирамо коцку дуж две осе, к и и.
    • Све трансформације које дефинишемо у програму захтевају сличне редове. У основи, представљамо ротацију објекта дуж осе к као промену вредности ротате_к, а ротацију дуж осе и као промену вредности ротате_и. Међутим, ОпенГЛ ће све спојити у једну трансформациону матрицу. Сваки пут када позовете дисплаи, креираћете матрицу трансформације и глЛоадИдентити () ће вам омогућити да сваки пут започнете са новом матрицом.
    • Друге функције трансформације које сте можда користили су глТранслатеф () и глСцалеф (). Они су слични глРотатеф (), само што захтевају само три параметра: вредности к, и и з за промену величине и величину објекта.
    • Да би се све правилно приказало када се све три трансформације примене на један објекат, потребно је да трансформације поставите одговарајућим редоследом, наиме глТранслате, глРотате, глСцале - и никад другачије. ОпенГЛ трансформише објекат читајући програм одоздо према горе. Да бисте ово боље разумели, замислите како би коцка 1к1к1 изгледала након свих трансформација ако би их ОпенГЛ применио по приказаном редоследу (од врха до дна), а затим размислите о томе како би ОпенГЛ обрадио коцку читајући упутства одоздо према горе.
  3. 3 Додајте следеће команде за скалирање коцке два пута у правцима к и и, за окретање коцке за 180 степени по оси и и за померање коцке за 0,1 по оси к. Уверите се да су све релевантне команде, укључујући претходно дате команде глРотате (), у исправном редоследу. Ако се бојите погрешке, погледајте коначну верзију програма на крају чланка.

      // Више трансформација глТранслатеф (0.1, 0.0, 0.0); глРотатеф (180, 0.0, 1.0, 0.0); глСцалеф (2.0, 2.0, 0.0);

  4. 4 Саставите и покрените код. Рецимо да користите гцц као компајлер, па унесите следеће команде у свој терминал:

      На Линук -у: гцц цубе.ц -о коцка -лглут -лГЛ ./ мицубе На Мац -у: гцц -о фоо фоо.ц -фрамеворк ГЛУТ -фрамеворк ОпенГЛ ./ мицубе У оперативном систему Виндовс: гцц -Валл -офоо фоо.ц -лглут32цу - лглу32 -лопенгл32 ./ мицубе

  5. 5 Проверите коначни код. Ево коначног кода који је направио аутор чланка, а који не преводи коментаре.

      // // Датотека: мицубе.ц // Аутор: Матт Даислеи // Креирано: 25.4.2012 // Пројекат: Изворни код за Направите коцку у ОпенГЛ -у // Опис: Креира ОпенГЛ прозор и исцртава 3Д коцку/ / Да се ​​корисник може ротирати помоћу тастера са стрелицама // // Контроле: Стрелица налево -Ротирај налево // Стрелица надесно -Ротирај десно // Стрелица горе -Ротирај горе // Стрелица надоле -Ротирај надоле // ------ -------------------------------------------------- -// Укључује // -------------------------------------------- -------------- #инцлуде стдио.х> #инцлуде стдарг.х> #инцлуде матх.х> #дефине ГЛ_ГЛЕКСТ_ПРОТОТИПЕС #ифдеф __АППЛЕ__ #инцлуде ГЛУТ / глут.х> #елсе #инцлуде ГЛ / глут.х> #ендиф // ---------------------------------------- ------------------ // Прототипови функција // -------------------------- -------------------------------- воид дисплаи (); воид специалКеис (); // ------------------------------------------------ ---------- // Глобалне променљиве // ---------------------------------- ------------------------ двоструко ротирање_и = 0; доубле ротате_к = 0; // ------------------------------------------------ ---------- // дисплаи () Функција повратног позива // ------------------------------- --------------------------- воид дисплаи () // Очисти екран и З-бафер глЦлеар (ГЛ_ЦОЛОР_БУФФЕР_БИТ // ------ -------------------------------------------------- -// специалКеис () Функција повратног позива // ---------------------------------------- ------------------ воид специалКеис (инт кеи, инт к, инт и) {// Стрелица надесно-повећање ротације за 5 степени иф (кеи == ГЛУТ_КЕИ_РИГХТ) ротате_и + = 5; // Стрелица налево - смањи ротацију за 5 степени елсе иф (кеи == ГЛУТ_КЕИ_ЛЕФТ) ротате_и - = 5; елсе иф (кеи == ГЛУТ_КЕИ_УП) ротате_к + = 5; елсе иф (кеи == ГЛУТ_КЕИ_ДОВН) ротате_к - = 5; // Затражи ажурирање приказа глутПостРедисплаи ();} // ------------------------------------ ---------------------- // функција маин () // -------------------- -------------------------------------- инт маин (инт аргц, цхар * аргв [] ) ГЛУТ_РГБ