سورس قلعه با OpenGL به زبان C++
در این بخش سورس قلعه با OpenGL را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی C++ نوشته شده است. این پروژه یک شبیه سازی مناسب در زمینه های گرافیک کامپیوتری، رباتیک و مکانیک است و با مشاهده سورس کد آن می توانید چیز های مناسبی را یاد بگیرید. در ادامه می توانید توضیحات و تصاویر مربوط به این برنامه را مشاهده کنید.
توضیحات پروژه
در این پروژه OpenGL، بعد از اجرا شدن برنامه، یک قلعه با استفاده از توابع کتابخانه OpenGL طراحی می شود و کاربر می تواند با استفاده از کلید های مشخص شده دوربین در زوایای مختلف به حرکت درآورد.
در زیر کلیدهایی که به منظور کنترل این ربات در نظر گرفته شده اند را مشاهده می کنید:
- کلید D: برای حرکت دادن دوربین به سمت راست استفاده می شود.
- کلید A: برای حرکت دادن دوربین به سمت چپ استفاده می شود.
- کلید W: برای حرکت دادن دوربین به سمت جلو استفاده می شود.
- کلید S: برای حرکت دادن دوربین به سمت عقب استفاده می شود.
- کلید X: برای حرکت دادن دوربین به سمت بالا استفاده می شود.
- کلید Y: برای حرکت دادن دوربین به سمت پایین استفاده می شود.
در زیر برخی از توابع استفاده شده در این پروژه را مشاهده می کنید:
- تابع keyDown: برای مدیریت کلید های فشرده شده استفاده می شود.
- تابع display: برای نمایش شیء های موجود در صفحه استفاده می شود.
- تابع drawWall: برای ترسیم دیوار های قلعه استفاده می شود.
- تابع init: برای مقداردهی اولیه و آماده سازی برنامه استفاده می شود.
قسمت های از سورس پروژه:
#include <math.h> //sine and cosine functions #include <windows.h> #include "camera.h" #include <gl\glut.h> //includes gl.h and glu.h #define PI 3.1415265359 static GLfloat MatSpec[] = { 1.0,1.0,1.0,1.0 }; static GLfloat MatShininess[] = { 45.0 }; static GLfloat LightPos[] = { -2.0,1.5,1.0,0.0 }; static GLfloat ModelAmb[] = { 0.5,0.5,0.5,0.0 }; CCamera Camera; GLint TowerListNum, WallsListNum; //Numbers of the display lists GLint WallsList; //Tower properties: int NumOfEdges = 20; GLfloat LowerHeight = 3.0; GLfloat HigherHeight = 3.5; GLfloat HR = 1.3; //Radius of the highest part //Wall properties: GLfloat WallElementSize = 0.2; GLfloat WallHeight = 2.0; void DrawHigherWallPart(int NumElements) { glBegin(GL_QUADS); for (int i = 0; i < NumElements; i++) { glNormal3f(0.0, 0.0, -1.0); glVertex3f(i*2.0 * WallElementSize, 0.0, 0.0); glVertex3f(i*2.0 * WallElementSize, WallElementSize, 0.0); glVertex3f((i*2.0 + 1.0) * WallElementSize, WallElementSize, 0.0); glVertex3f((i*2.0 + 1.0) * WallElementSize, 0.0, 0.0); } glEnd(); } void DrawWall(GLfloat Length) { glBegin(GL_QUADS); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, WallHeight, 0.0); glVertex3f(Length, WallHeight, 0.0); glVertex3f(Length, 0.0, 0.0); glEnd(); int i = (int)(Length / WallElementSize / 2); if (i * WallElementSize > Length) i--; glPushMatrix(); glTranslatef(0.0, WallHeight, 0.0); DrawHigherWallPart(i); glPopMatrix(); } void Init(void) //used to create the display lists { TowerListNum = glGenLists(1); GLfloat x, z; int i; GLfloat NVectY; //y component for the NVects of the higher part glNewList(TowerListNum, GL_COMPILE); glBegin(GL_QUADS); //Create the lower part of the tower: for (i = 0; i < NumOfEdges - 1; i++) { x = cos((float)i / (float)NumOfEdges * PI * 2.0); z = sin((float)i / (float)NumOfEdges * PI * 2.0); glNormal3f(x, 0.0, z); glVertex3f(x, LowerHeight, z); //same x,z and NVect: glVertex3f(x, 0.0, z); x = cos((float)(i + 1) / (float)NumOfEdges * PI * 2.0); z = sin((float)(i + 1) / (float)NumOfEdges * PI * 2.0); glNormal3f(x, 0.0, z); glVertex3f(x, 0.0, z); //same x,z and NVect: glVertex3f(x, LowerHeight, z); } x = cos((float)i / (float)NumOfEdges * PI * 2.0); z = sin((float)i / (float)NumOfEdges * PI * 2.0); glNormal3f(x, 0.0, z); glVertex3f(x, LowerHeight, z); //same x,z and NVect: glVertex3f(x, 0.0, z); x = cos(1.0 / (float)NumOfEdges * PI * 2.0); z = sin(1.0 / (float)NumOfEdges * PI * 2.0); glNormal3f(x, 0.0, z); glVertex3f(x, 0.0, z); //same x,z and NVect: glVertex3f(x, LowerHeight, z); //Create the higher part: //The y component is the same for all NVects, so we can calculate it here: NVectY = (HR - 1.0) / (LowerHeight - HigherHeight) * (HR - 1.0); for (i = 0; i < NumOfEdges - 1; i++) { x = cos((float)i / (float)NumOfEdges * PI * 2.0); z = sin((float)i / (float)NumOfEdges * PI * 2.0); glNormal3f(x, NVectY, z); glVertex3f(x*HR, HigherHeight, z*HR); //same x,z and NVect: glVertex3f(x, LowerHeight, z); x = cos((float)(i + 1) / (float)NumOfEdges * PI * 2.0); z = sin((float)(i + 1) / (float)NumOfEdges * PI * 2.0); glNormal3f(x, NVectY, z); glVertex3f(x, LowerHeight, z); //same x,z and NVect: glVertex3f(x*HR, HigherHeight, z*HR); } x = cos((float)i / (float)NumOfEdges * PI * 2.0); z = sin((float)i / (float)NumOfEdges * PI * 2.0); glNormal3f(x, NVectY, z); glVertex3f(x*HR, HigherHeight, z*HR); //same x,z and NVect: glVertex3f(x, LowerHeight, z); x = cos(1.0 / (float)NumOfEdges * PI * 2.0); z = sin(1.0 / (float)NumOfEdges * PI * 2.0); glNormal3f(x, NVectY, z); glVertex3f(x, LowerHeight, z); //same x,z and NVect: glVertex3f(x*HR, HigherHeight, z*HR); glEnd(); glEndList(); WallsListNum = glGenLists(1); glNewList(WallsListNum, GL_COMPILE); DrawWall(10.0); glPushMatrix(); glTranslatef(10.0, 0.0, 0.0); glPushMatrix(); glRotatef(270.0, 0.0, 1.0, 0.0); DrawWall(10.0); glPopMatrix(); glTranslatef(0.0, 0.0, 10.0); glPushMatrix(); glRotatef(180.0, 0.0, 1.0, 0.0); DrawWall(5.0); glRotatef(90.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, 5.0); DrawWall(5.0); glPopMatrix(); glTranslatef(-5.0, 0.0, 5.0); glPushMatrix(); glRotatef(180.0, 0.0, 1.0, 0.0); DrawWall(5.0); glPopMatrix(); //Last and longest piece: glPushMatrix(); glRotatef(90.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -5.0); DrawWall(6.0); //the "door" glTranslatef(6.0, 0.0, 0.0); glBegin(GL_QUADS); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, WallHeight / 2.0, 0.0); glVertex3f(0.0, WallHeight, 0.0); glVertex3f(3.0, WallHeight, 0.0); glVertex3f(3.0, WallHeight / 2.0, 0.0); glEnd(); i = (int)(3.0 / WallElementSize / 2); if (i * WallElementSize > 3.0) i--; glPushMatrix(); glTranslatef(0.0, WallHeight, 0.0); DrawHigherWallPart(i); glPopMatrix(); glTranslatef(3.0, 0.0, 0.0); DrawWall(6.0); glPopMatrix(); glPopMatrix(); glEndList(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(700, 500); glutCreateWindow("SourceSara.Com | Castle"); glEnable(GL_DEPTH_TEST); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glClearColor(0.0, 0.0, 0.0, 0.0); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutKeyboardFunc(KeyDown); Camera.Move(F3dVector(0.0, 5.0, 20.0)); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpec); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, MatShininess); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ModelAmb); Init(); glutMainLoop(); return 0; }
نکات
- این پروژه در نرم افزار Visual Studio نسخه ۲۰۱۵ تست شده است و به خوبی کار می کند.
- به منظور اجرای پروژه های OpenGL باید آن را بر روی IDE خود نصب کنید (آموزش نصب OpenGL).
- در صورت نا مفهوم بودن بخشی از کد، می توانید در قسمت نظرات مطرح کنید تا برای شما توضیح داده شود.
نوشته سورس قلعه با OpenGL به زبان C++ اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.