በ OpenGL (ከስዕሎች ጋር) ውስጥ ኪዩብ እንዴት እንደሚሠራ

ዝርዝር ሁኔታ:

በ OpenGL (ከስዕሎች ጋር) ውስጥ ኪዩብ እንዴት እንደሚሠራ
በ OpenGL (ከስዕሎች ጋር) ውስጥ ኪዩብ እንዴት እንደሚሠራ

ቪዲዮ: በ OpenGL (ከስዕሎች ጋር) ውስጥ ኪዩብ እንዴት እንደሚሠራ

ቪዲዮ: በ OpenGL (ከስዕሎች ጋር) ውስጥ ኪዩብ እንዴት እንደሚሠራ
ቪዲዮ: 🛑 ኮምፒውተር ላይ የስልክ አፕልኬሽን እንዴት መጫን እንችላለን || How to install a phone application on a computer 2024, ሚያዚያ
Anonim

OpenGL ውስብስብ ባለ ሶስት አቅጣጫዊ ትዕይንቶችን ከቀላል ጥንታዊ ነገሮች ለመሳል የሚያገለግል ኃይለኛ የ3-ል ፕሮግራም መሣሪያ ነው። ይህ ጽሑፍ በሦስት ልኬቶች ለማየት የሚሽከረከሩትን አንድ ቀላል ኩብ እንዴት መሳል እንደሚችሉ ያስተምርዎታል!

ለዚህ ፕሮጀክት የኮድ አርታዒ እና አንዳንድ የ C ፕሮግራም እውቀት ያስፈልግዎታል።

ደረጃዎች

የ 3 ክፍል 1 - የመጀመሪያ ማዋቀር

1994315 1 1
1994315 1 1

ደረጃ 1. OpenGL ን ይጫኑ ለመጀመር በስርዓትዎ ላይ OpenGL ን ለመጫን እነዚህን ደረጃዎች ይከተሉ።

አስቀድመው OpenGL ፣ እንዲሁም ተኳሃኝ የሆነ የ C አጠናቃሪ ተጭነው ከሆነ ይህንን ደረጃ መዝለል እና ወደ ቀጣዩ መሄድ ይችላሉ።

1994315 2 1
1994315 2 1

ደረጃ 2. ሰነዱን ይፍጠሩ።

በሚወዱት የኮድ አርታኢ ውስጥ አዲስ ፋይል ይፍጠሩ እና እንደ mycube.c አድርገው ያስቀምጡት

1994315 3 1
1994315 3 1

ደረጃ 3. አክል #ያካትታል።

እነዚህ ለፕሮግራምዎ የሚያስፈልጉዎትን መሠረታዊ ያካትታሉ። ለተለያዩ ኦፕሬቲንግ ሲስተሞች በእውነቱ የተለያዩ ማካተቶች መኖራቸውን መገንዘብ አስፈላጊ ነው። ፕሮግራምዎ ሁለገብ እና ለማንኛውም ተጠቃሚ ሊሠራ የሚችል መሆኑን ለማረጋገጥ እነዚህን ሁሉ ማካተትዎን ያረጋግጡ።

    // ያካተተ #አካትቷል #አካትት #አካትቷል #GL_GLEXT_PROTOTYPES #iff ን _APPLE_ #ያካተተ #ሌላ #ያካትቱ #endif

1994315 4 1
1994315 4 1

ደረጃ 4. የተግባር ናሙናዎችን እና ዓለም አቀፍ ተለዋዋጮችን ያክሉ።

ቀጣዩ እርምጃዎ አንዳንድ የተግባር ፕሮቶፖሎችን ማወጅ ነው።

    // የተግባር ፕሮቶታይቶች ባዶ ማሳያ (); ባዶነት ልዩ ቁልፎች (); // ግሎባል ተለዋዋጮች ድርብ rotate_y = 0; ድርብ rotate_x = 0;

1994315 5 1
1994315 5 1

ደረጃ 5. ዋናውን () ተግባር ያዋቅሩ።

    int main (int argc ፣ char* argv ) {// GLUT ን ያስጀምሩ እና የተጠቃሚ ግቤቶችን glutInit (& argc ፣ argv); // በ Z- buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) ድርብ የታሸገ እውነተኛ የቀለም መስኮት ይጠይቁ ፤

  • ይህ መግለጫ አካባቢዎን ያዘጋጃል። የ OpenGL ፕሮግራሞችን በሚጽፉበት ጊዜ ማስታወስ ያለብዎት አንድ ትልቅ ነገር ሁሉንም ነገር መጠየቅ አለብዎት። እርስዎ የሚፈልጉትን ተግባር ለማግኘት የእርስዎ ፕሮግራም እንዴት እንደሚሠራ እና ምን ማካተት እንዳለብዎት የበለጠ ግንዛቤ እንዲኖርዎት ይጠይቃል። በዚህ መስመር ውስጥ ማሳያውን በድርብ ማባዛት ፣ በ RGB ቀለም እና በ Z- ቋት ያዋቅሩታል።
  • ድርብ ማባዛት ምስሎች በማያ ገጹ ላይ በሚስሉበት ምክንያት የሚከሰተውን ችግር ለማስወገድ በግራፊክስ ፕሮግራሞች ውስጥ የሚያገለግል ዘዴ ነው። ትዕይንቱን እንደገና በለወጡ ቁጥር ማሳያው መጀመሪያ መደምሰስ አለበት ከዚያም አዲሱ መረጃ ይሳባል። ድርብ ማወዛወዝ ሳይኖር ማያ ገጹ ተደምስሶ እና ተደጋግሞ እንደገና ሲገለበጥ ብልጭ ድርግም የሚል ውጤት ያያሉ።
  • ለመሳል ሁለተኛ ቋት በማከል ይህ ችግር ተስተካክሏል። በዚህ ዘዴ ፣ ምስል ወደ መጀመሪያው ቋት ይሳባል እና ያ ቋት ለእርስዎ ይታያል። የሚቀጥለው ክፈፍ ወደ ሁለተኛው ቋት ይሳባል እና ያ ሲጠናቀቅ ሁለቱ መያዣዎች ቦታዎችን ይለውጣሉ። ወዲያውኑ ሁለተኛውን ቋት ያያሉ ፣ ግን ከእኛ ተደብቆ ፣ የመጀመሪያው ቋት ተሠርዞ ሲጨርስ በሦስተኛው ክፈፍ እየተቀየረ ነው።
  • እርስዎም ማንቃት ይፈልጋሉ አርጂቢ ቀለም በእርስዎ መስኮት ውስጥ ስርዓት።
  • Z- ማደብዘዝ እርስዎ የሚፈልጉትን 3 -ል ውጤቶች እንዴት እንደሚያገኙ ነው። OpenGL ከ x ፣ y እና z መጥረቢያዎች ጋር ባለ ሶስት አቅጣጫዊ አስተባባሪ ስርዓትን ይጠቀማል። አንድ ነገር ወደ እርስዎ ቅርብ ነው የሚል ውጤት ለመስጠት በ z ዘንግ ላይ ያለው ቦታ ተጨምሯል ፣ ሆኖም ፣ በሩ ዘንግ ላይ ያለው ቦታ እየቀነሰ እንዲሄድ ለማድረግ።
1994315 6 1
1994315 6 1

ደረጃ 6. መስኮቱን ይፍጠሩ።

ቀጣዩ ደረጃ ወደ መስኮቱን ይፍጠሩ በውስጡ ኪዩቡን የሚስሉበት። በዚህ መማሪያ ውስጥ መስኮቱ “ግሩም ኩብ” ይባላል።

    // የመስኮት glutCreateWindow (“ግሩም ኩብ”) ይፍጠሩ ፤

1994315 7 1
1994315 7 1

ደረጃ 7. የጥልቅ ሙከራን ያንቁ።

ምንም ልዩ ባህሪዎች ነቅተዋል ብሎ ስለማያስብ OpenGL ጥብቅ ቋንቋ ነው። ቀደም ብለው የተመለከቱትን የ Z- ቋት በመጠቀም ፕሮግራምዎ በ 3-ልኬቶች በትክክል እንዲታይ ፣ ያስፈልግዎታል ጥልቀት-ሙከራን ያንቁ. OpenGL ን ማሰስዎን በሚቀጥሉበት ጊዜ ብርሃንን ፣ ሸካራዎችን ፣ ኩርባዎችን እና ሌሎችንም ጨምሮ ማንቃት የሚያስፈልጋቸውን ብዙ ባህሪያትን ያገኛሉ።

    // የ Z- ቋት ጥልቀት ሙከራ glEnable ን ያንቁ (GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

ደረጃ 8. የመልሶ መደወያ ተግባሮችን ያክሉ።

ቀደም ሲል የቅድመ -ምሳሌዎቹን የፃፉላቸው የመልሶ ማግኛ ተግባራት እዚህ አሉ። በዋናው ዑደት በኩል እያንዳንዱ ጊዜ እነዚህ ተግባራት ይባላሉ። የማሳያ ተግባሩ ከቀዳሚው ጥሪ ጀምሮ በተደረጉ ተለዋዋጮች ላይ በተደረጉ ማናቸውም ለውጦች ላይ በመመርኮዝ ትዕይንቱን እንደገና ያስተካክላል። የልዩ ኪይስ ተግባር ከፕሮግራሙ ጋር እንድንገናኝ ያስችለናል።

    // የጥሪ መልሶ ማግኛ ተግባራት glutDisplayFunc (ማሳያ); glutSpecialFunc (ልዩ ቁልፎች);

1994315 9 1
1994315 9 1

ደረጃ 9. MainLoop ን ይጀምሩ።

እነማዎች እና የተጠቃሚ መስተጋብር ለመፍቀድ ፕሮግራሙን እስኪዘጉ ድረስ ይህ ዋናውን ተግባር ያስታውሰዋል።

    // ለዝግጅቶች glutMainLoop () ለ GLUT ቁጥጥርን ያስተላልፉ ፤ // ወደ OS መመለስ 0; }

የ 3 ክፍል 2 - የማሳያ () ተግባር

1994315 10 1
1994315 10 1

ደረጃ 1. የዚህን ተግባር ዓላማ ይረዱ።

ኩብዎን የመሳል ሥራ ሁሉ በዚህ ተግባር ውስጥ ይከናወናል። ከኩቤዎ በስተጀርባ ያለው አጠቃላይ ሀሳብ ሁሉንም ስድስት ጎኖች በግለሰብ ደረጃ መሳል እና በተገቢው ቦታ ላይ ማስቀመጥ ነው።

በፅንሰ -ሀሳብ ፣ እያንዳንዱ ወገን አራቱን ማዕዘኖች በመለየት እና OpenGL መስመሮቹን እንዲያገናኝ እና እርስዎ በሚገልፁት ቀለም እንዲሞሉ በማድረግ ይሳላል። ይህንን ለማድረግ ከዚህ በታች ደረጃዎች አሉ።

1994315 11 1
1994315 11 1

ደረጃ 2. glClear () ያክሉ።

በዚህ ተግባር ውስጥ መውሰድ ያለብዎት የመጀመሪያው እርምጃ ነው ቀለሙን እና የ Z ቋትን ያፅዱ. ያለ እነዚህ እርምጃዎች ፣ የድሮዎቹ ሥዕሎች በአዲሶቹ ሥዕሎች ስር አሁንም ሊታዩ ይችላሉ እና የተቀረጹ ዕቃዎች በማያ ገጹ ላይ በትክክለኛው ቦታ ላይ አይገኙም።

    ባዶ ማሳያ () {// ማያ ገጽን እና የ Z- ቋት glClear ን (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

ደረጃ 3. glBegin () እና glEnd () ን ያክሉ።

OpenGL ነገሮችን እንደ የተለያዩ ፖሊጎኖች ጥምረት ይገልፃል። ን በመጠቀም glBegin () ትዕዛዝ ፣ ቅርፅን የሚስማማ እርሳስን በጥሩ ሁኔታ አስቀምጠዋል። እርሳሱን ለማንሳት እና አዲስ ቅርፅ ለመጀመር ፣ መጠቀም አለብዎት glEnd () ትእዛዝ። በዚህ መማሪያ ውስጥ እያንዳንዱን የኩቤውን ጎን ለመሳል GL_POLYGON ን ይጠቀማሉ ነገር ግን ሌሎች ቅርጾችን ለመፍጠር እንደ GL_LINE ፣ GL_QUAD ወይም GL_TRIANGLE ያሉ ሌሎች የመለኪያ አማራጮችን መጠቀም ይቻላል።

  • እዚህ ከኩብዎ ፊት ይጀምራሉ። በኋላ በሁሉም 6 ጎኖች ላይ ቀለም ያክላሉ።
  • // ባለብዙ ቀለም ጎን - FRONT glBegin (GL_POLYGON); // ጫፎች በሚቀጥለው ደረጃ glEnd () ውስጥ ይታከላሉ ፤

1994315 13 1
1994315 13 1

ደረጃ 4. glVertex3f () ን ይጨምሩ።

አንዴ ባለ ብዙ ጎንዎን ለመጀመር እንደሚፈልጉ ከገለጹ በኋላ ያስፈልግዎታል ጫፎቹን ይግለጹ የነገሩን ነገር። glVertex ከእቃዎ ጋር ምን ማድረግ እንደሚፈልጉ ላይ በመመስረት በርካታ ቅጾች አሉት።

  • የመጀመሪያው በስንት ልኬቶች ውስጥ እየሰሩ ነው። ከላይ በ glVertex3f ውስጥ ያለው 3 በ 3 ልኬቶች እየሳሉ ነው ይላል። በ 2 ወይም በ 4 ልኬቶች መስራትም ይቻላል። በ glVertex3f ውስጥ ያለው f ከላይ በተንሳፋፊ ነጥብ ቁጥሮች እየሰሩ ነው ይላል። እንዲሁም አጫጭር ፣ ኢንቲጀር ወይም ድርብ መጠቀም ይችላሉ።
  • እነዚህ ነጥቦች በ ሀ የተገለጹ መሆናቸውን ልብ ይበሉ በተቃራኒ ሰዓት አቅጣጫ ዘዴ። ይህ በአሁኑ ጊዜ በጣም አስፈላጊ አይደለም ነገር ግን ከብርሃን ፣ ከሽመናዎች እና ከኩላ ፊት ጋር መሥራት ሲጀምሩ ይህ በማይታመን ሁኔታ አስፈላጊ ይሆናል ስለዚህ ነጥቦችዎን በተቃራኒ ሰዓት አቅጣጫ የመወሰን ልማድ ይኑርዎት።
  • በ glBegin () እና glEnd () መስመሮች መካከል ጫፎችን ይጨምሩ።
  • // ባለብዙ ቀለም ጎን - FRONT glBegin (GL_POLYGON); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); // P1 glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); // P2 glVertex3f (0.5 ፣ 0.5 ፣ -0.5); // P3 glVertex3f (0.5 ፣ -0.5 ፣ -0.5); // P4 glEnd ();

1994315 14 1
1994315 14 1

ደረጃ 5. glColor3f () ን ያክሉ።

glColor ከ glVertex ጋር በተመሳሳይ ሁኔታ ይሠራል። ነጥቦችን እንደ ቁምጣ ፣ ኢንቲጀር ፣ ድርብ ወይም ተንሳፋፊ እንደሆኑ መግለፅ ይችላሉ። እያንዳንዱ ቀለም ከ 0 ወደ 1. ሁሉም 0 ነጥቡን ጥቁር ያደርገዋል እና ሁሉም 1 ነጥቡን ነጭ ያደርገዋል። በ glColor3f () ውስጥ ያለው 3 የሚያመለክተው የ RGB ቀለም ስርዓትን ያለ የአልፋ ሰርጥ ነው። የአንድ ቀለም አልፋ ግልፅነቱን ይገልጻል። የአልፋ ደረጃን ለመለወጥ ፣ ግሎኮሎር 4 ን () ን በመጠቀም የመጨረሻው ግቤት ከ 0 እስከ 1 እሴት ለሆነ ግልፅነት ግልፅነት።

  • GlColor3f () ን ሲደውሉ ከዚያ ነጥብ ላይ የተወሰደ እያንዳንዱ ጫፍ በዚያ ቀለም ይሆናል። ስለዚህ ፣ አራቱም ጫፎች ቀይ እንዲሆኑ ከፈለጉ ፣ ከ glVertex3f () ትዕዛዞች በፊት አንድ ጊዜ ብቻ ቀለሙን ያዘጋጁ እና ሁሉም ጫፎች ቀይ ይሆናሉ።
  • ከዚህ በታች የተገለጸው የፊት ጎን ለእያንዳንዱ ጫፍ አዲስ ቀለም እንዴት እንደሚገለፅ ያሳያል። ይህንን ሲያደርጉ የ OpenGL ቀለሞችን አስደሳች ንብረት ማየት ይችላሉ። እያንዳንዱ ባለ ብዙ ጎን ጫፍ የራሱ ቀለም ስላለው ፣ OpenGL ቀለሞችን በራስ -ሰር ያዋህዳል! ቀጣዩ ደረጃ ተመሳሳይ ቀለም ያላቸውን አራት ጫፎች እንዴት እንደሚመድቡ ያሳያል።
  • // ባለብዙ ቀለም ጎን - FRONT glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 0.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); // P1 ቀይ glColor3f ነው (0.0 ፣ 1.0 ፣ 0.0); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); // P2 አረንጓዴ glColor3f ነው (0.0 ፣ 0.0 ፣ 1.0); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); // P3 ሰማያዊ glColor3f ነው (1.0 ፣ 0.0 ፣ 1.0); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); // P4 ሐምራዊ glEnd ነው ();

1994315 15 1
1994315 15 1

ደረጃ 6. ሌሎቹን ጎኖች ይያዙ።

ለሌላው አምስት የኩባው ጎኖች የእያንዳንዱ ጫፍ ቦታ ምን እንደሚሆን ይገንዘቡ ነገር ግን ለቀላልነት እነዚህ ለእርስዎ የተሰሉ እና በ ውስጥ ተካትተዋል የመጨረሻ ማሳያ () ተግባር ከታች።

    // ነጭ ጎን - ተመለስ glBegin (GL_POLYGON); glColor3f (1.0 ፣ 1.0 ፣ 1.0); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glEnd (); // ሐምራዊ ጎን - RIGHT glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 1.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glEnd (); // አረንጓዴ ጎን - LEFT glBegin (GL_POLYGON); glColor3f (0.0 ፣ 1.0 ፣ 0.0); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); glEnd (); // ሰማያዊ ጎን - TOP glBegin (GL_POLYGON); glColor3f (0.0 ፣ 0.0 ፣ 1.0); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glEnd (); // ቀይ ጎን - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 0.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); glEnd (); glFlush (); glutSwapBuffers (); }

  • እንዲሁም ለዚህ ተግባር በሁለት የመጨረሻ የኮድ መስመሮች ውስጥ ማከል እንፈልጋለን። እነዚህ ናቸው glFlush ();

    እና glutSwapBuffers ();

    ስለ እርስዎ ቀደም ብለው የተማሩትን ድርብ የማጥፋት ውጤት የሚሰጠን።

የ 3 ክፍል 3 - የተጠቃሚ መስተጋብር

1994315 16 1
1994315 16 1

ደረጃ 1. ልዩ ቁልፎችን () ያክሉ።

ሊጨርሱ ነው ነገር ግን በአሁኑ ጊዜ አንድ ኩብ መሳል ይችላሉ ነገር ግን የሚሽከረከሩበት መንገድ የላቸውም። ይህንን ለማድረግ እርስዎ ያደርጋሉ ልዩ ቁልፎችን ይፍጠሩ () የቀስት ቁልፎችን ተጭነን ኩብውን ለማሽከርከር እኛን ለመፍቀድ ተግባር!

  • ይህ ተግባር የአለምአቀፍ ተለዋዋጮች rotate_x እና rotate_y ን ያወጁት ለዚህ ነው። የቀኝ እና የግራ ቀስት ቁልፎችን ሲጫኑ ፣ rotate_y በ 5 ዲግሪ ይጨምራል ወይም ይቀንሳል። በተመሳሳይ ፣ የላይ እና ታች ቀስት ቁልፎችን ሲጫኑ ፣ rotate_x በዚሁ መሠረት ይለወጣል።
  • ባዶ (ልዩ) ቁልፍ (int ቁልፍ ፣ int x ፣ int y) {// የቀስት ቀስት - (ቁልፍ == GLUT_KEY_RIGHT) rotate_y += 5 ከሆነ መዞርን በ 5 ዲግሪ ይጨምሩ። // የግራ ቀስት - ማሽከርከርን በ 5 ዲግሪ ሌላ ከሆነ (ቁልፍ == GLUT_KEY_LEFT) rotate_y - = 5; ሌላ ከሆነ (ቁልፍ == GLUT_KEY_UP) rotate_x += 5; ሌላ ከሆነ (ቁልፍ == GLUT_KEY_DOWN) rotate_x -= 5; // የማሳያ ዝመናን ይጠይቁ glutPostRedisplay (); }

1994315 17 1
1994315 17 1

ደረጃ 2. glRotate () ን ያክሉ።

የመጨረሻው መግለጫዎ ነገርዎን የሚያሽከረክር መግለጫ ማከል ነው። ወደ የማሳያ () ተግባር ይመለሱ እና ከፊት በኩል በፊት እነዚህን መስመሮች ያክሉ

    // ለውጦችን ዳግም ያስጀምሩ glLoadIdentity (); // ተጠቃሚው rotate_x ን እና rot_ glRotatef (rotate_x ፣ 1.0 ፣ 0.0 ፣ 0.0) ሲቀይር ያሽከርክሩ ፤ glRotatef (rotate_y ፣ 0.0 ፣ 1.0 ፣ 0.0); // ባለብዙ ቀለም ጎን - ፊት ለፊት….

  • መጀመሪያ ያስተውሉ የ አገባብ glRotatef () ከ glColor3f () እና glVertex3f () ጋር ተመሳሳይ ነው ፣ ግን ሁልጊዜ 4 መመዘኛዎችን ይፈልጋል። የመጀመሪያው ግቤት ለመተግበር የማሽከርከር ደረጃ ነው። ቀጣዮቹ ሶስት መመዘኛዎች የትኛውን ዘንግ እንደሚሽከረከሩ ይገልፃሉ የመጀመሪያው የ x ዘንግ ፣ ሁለተኛው የ y ዘንግ እና ሦስተኛው የ z ዘንግ ነው። አሁን ስለ x እና y-axis ብቻ ማሽከርከር ያስፈልግዎታል።
  • በፕሮግራምዎ ውስጥ የሚጽ writeቸው ሁሉም ለውጦች ከዚህ ጋር የሚመሳሰሉ መስመሮች ያስፈልጋቸዋል። በፅንሰ -ሀሳብ ፣ ይህንን ነገርዎን ስለ x ዘንግ በ rotate_x በተገለጸው መጠን በማሽከርከር እና ከዚያ በ y ዘንግ ዙሪያ በ rotate_y እንደሚሽከረከሩ አድርገው ማሰብ ይችላሉ። ሆኖም ፣ OpenGL እነዚህን ሁሉ መግለጫዎች ወደ አንድ የማትሪክስ ሽግግር ያዋህዳል። የማሳያውን ተግባር በጠሩ ቁጥር እርስዎ የትራንስፎርሜሽን ማትሪክስ ይገነባሉ እና glLoadIdentity () በእያንዳንዱ ማለፊያ አዲስ ማትሪክስ እንደሚጀምሩ ያረጋግጣል።
  • ሊተገብሯቸው የሚችሏቸው ሌሎች የለውጥ ተግባራት glTranslatef () እና glScalef () ናቸው። እነዚህ ተግባራት ከ glRotatef () ጋር ተመሳሳይ ናቸው ፣ ካልሆነ በስተቀር ፣ 3 ልኬቶችን ፣ x ፣ y እና z ን ብቻ የሚወስዱትን ነገር ለመተርጎም ወይም ለመለካት።
  • ሦስቱን ለውጦች በአንድ ነገር ላይ ሲተገብሩ ትክክለኛውን ውጤት ለማግኘት በትክክለኛው ቅደም ተከተል መተግበር ያስፈልግዎታል። ሁልጊዜ በትእዛዙ ውስጥ ይፃ writeቸው glTranslate ፣ glRotate ፣ ከዚያ glScale. OpenGL በመሠረቱ ለውጦቹን ከታች ወደ ላይ ይተገበራል። ይህንን ለመረዳት OpenGL ከላይ ወደ ታች ከተጠቀመ እና OpenGL ከታች ወደ ላይ ከተተገበረ ከለውጦቹ ጋር አንድ ቀላል 1x1x1 ኩብ ምን እንደሚመስል ለመገመት ይሞክሩ።
1994315 18 1
1994315 18 1

ደረጃ 3. ኩብውን በ x ዘንግ ፣ 2 በ y- ዘንግ ፣ ኩብውን በ 180 ዲግሪ ያሽከረክሩት ፣ ኩቦውን በ x1 ዘንግ 0.1 ለመተርጎም የሚከተሉትን ትዕዛዞች ያክሉ።

ከላይ እንደተገለፀው እነዚህን እና የቀደሙትን glRotate () ትዕዛዞችን በትክክለኛው ቅደም ተከተል ማደራጀቱን ያረጋግጡ። (እርግጠኛ ካልሆኑ ፣ ይህ የሚከናወነው በመማሪያው መጨረሻ ላይ በመጨረሻው ኮድ ውስጥ ነው።)

    // ሌሎች ለውጦች glTranslatef (0.1 ፣ 0.0 ፣ 0.0); glRotatef (180 ፣ 0.0 ፣ 1.0 ፣ 0.0); glScalef (2.0 ፣ 2.0 ፣ 0.0);

1994315 19 1
1994315 19 1

ደረጃ 4. ኮድዎን ያጠናቅሩ እና ያሂዱ።

Gcc ን እንደ የእርስዎ አጠናቃሪ እየተጠቀሙ እንደሆነ በመገመት ፣ እነዚህን ትዕዛዞች ፕሮግራምዎን ለማጠናቀር እና ለመፈተሽ ከእርስዎ ተርሚናል ያሂዱ።

    በሊኑክስ: gcc cube.c -o cube -lglut -lGL./ mycube On Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube በዊንዶውስ ላይ gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube

1994315 20 1
1994315 20 1

ደረጃ 5. የተሟላ ኮድዎን ይፈትሹ።

እንደዚህ መሆን አለበት -

    // // ፋይል: mycube.c // ደራሲ: ማት ዴይስሊ // የተፈጠረ: 4/25/2012 // ፕሮጀክት: በ OpenGL ውስጥ አንድ ኩብ ለመሥራት ምንጭ ኮድ // መግለጫ: የ OpenGL መስኮት ይፈጥራል እና 3 -ል ኩብ/ይስላል/ / ተጠቃሚው የቀስት ቁልፎቹን በመጠቀም ማሽከርከር እንደሚችል // // መቆጣጠሪያዎች -የግራ ቀስት -ወደ ግራ አዙር // የቀኝ ቀስት -ወደ ቀኝ አዙር / ወደ ላይ ቀስት -ወደ ላይ / ወደ ታች ቀስት -ወደ ታች ማሽከርከር // ------ -------------------------------------------------- -// ያካትታል // --------------------------------------------------- --------------- #አካትት #አካትት #አካትት #ገለጠ GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #ያካትቱ #ሌላ #ያካትቱ #endif // ------------- --------------------------------------------- // የተግባር ፕሮቶታይፕ / / ------------------------------------------------- --------- ባዶ ማሳያ (); ባዶነት ልዩ ቁልፎች (); // ------------------------------------------------ ---------- // ዓለም አቀፍ ተለዋዋጮች // ---------------------------------- ------------------------ ድርብ rotate_y = 0; ድርብ rotate_x = 0; // ------------------------------------------------ ---------- // ማሳያ () የመልሶ መደወያ ተግባር // ------------------------------- --------------------------- ባዶነት ማሳያ () {// የተጣራ ማያ ገጽ እና የ Z- buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // ለውጦችን ዳግም ያስጀምሩ glLoadIdentity (); // ሌሎች ሽግግሮች // glTranslatef (0.1 ፣ 0.0 ፣ 0.0); // አልተካተተም // glRotatef (180 ፣ 0.0 ፣ 1.0 ፣ 0.0) ፤ // አልተካተተም // ተጠቃሚ rotate_x እና rotate_y glRotatef (rotate_x ፣ 1.0 ፣ 0.0 ፣ 0.0) ሲቀይር ያሽከርክሩ ፤ glRotatef (rotate_y ፣ 0.0 ፣ 1.0 ፣ 0.0); // ሌሎች ሽግግሮች // glScalef (2.0 ፣ 2.0 ፣ 0.0); // አልተካተተም // ባለብዙ ቀለም ጎን - FRONT glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 0.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); // P1 ቀይ glColor3f ነው (0.0 ፣ 1.0 ፣ 0.0); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); // P2 አረንጓዴ glColor3f ነው (0.0 ፣ 0.0 ፣ 1.0); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); // P3 ሰማያዊ glColor3f ነው (1.0 ፣ 0.0 ፣ 1.0); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); // P4 ሐምራዊ glEnd ነው (); // ነጭ ጎን - ተመለስ glBegin (GL_POLYGON); glColor3f (1.0 ፣ 1.0 ፣ 1.0); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glEnd (); // ሐምራዊ ጎን - RIGHT glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 1.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glEnd (); // አረንጓዴ ጎን - LEFT glBegin (GL_POLYGON); glColor3f (0.0 ፣ 1.0 ፣ 0.0); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); glEnd (); // ሰማያዊ ጎን - TOP glBegin (GL_POLYGON); glColor3f (0.0 ፣ 0.0 ፣ 1.0); glVertex3f (0.5 ፣ 0.5 ፣ 0.5); glVertex3f (0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ 0.5 ፣ -0.5); glVertex3f (-0.5 ፣ 0.5 ፣ 0.5); glEnd (); // ቀይ ጎን - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0 ፣ 0.0 ፣ 0.0); glVertex3f (0.5 ፣ -0.5 ፣ -0.5); glVertex3f (0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ 0.5); glVertex3f (-0.5 ፣ -0.5 ፣ -0.5); glEnd (); glFlush (); glutSwapBuffers (); } // ---------------------------------------------- ----------- // specialKeys () የጥሪ ጥሪ ተግባር // ------------------------------ ---------------------------- ባዶ ልዩ ቁልፎች (int key, int x, int y) {// የቀስት ቀስት-መዞርን በ 5 ይጨምሩ ዲግሪ ከሆነ (ቁልፍ == GLUT_KEY_RIGHT) rotate_y += 5; // የግራ ቀስት - ሽክርክሪት በ 5 ዲግሪ ሌላ (ቁልፍ == GLUT_KEY_LEFT) ቢሽከረከር - = 5; ሌላ ከሆነ (ቁልፍ == GLUT_KEY_UP) rotate_x += 5; ሌላ ከሆነ (ቁልፍ == GLUT_KEY_DOWN) rotate_x -= 5; // የማሳያ ዝመናን ይጠይቁ glutPostRedisplay (); } // ---------------------------------------------- ----------- // ዋና () ተግባር // ------------------------------- --------------------------- int ዋና (int argc ፣ char* argv ) {// GLUT ን ያስጀምሩ እና የተጠቃሚ ግቤቶችን glutInit () & argc ፣ argv); // በ Z- buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) ድርብ የታሸገ እውነተኛ የቀለም መስኮት ይጠይቁ ፤ // የመስኮት glutCreateWindow (“ግሩም ኩብ”) ይፍጠሩ ፤ // የ Z- ቋት ጥልቀት ሙከራ glEnable ን ያንቁ (GL_DEPTH_TEST); // የጥሪ ጥሪ ተግባራት glutDisplayFunc (ማሳያ); glutSpecialFunc (ልዩ ቁልፎች); // ለዝግጅቶች glutMainLoop () ለ GLUT ቁጥጥርን ያስተላልፉ ፤ // ወደ OS መመለስ 0; }

የሚመከር: