سورس قلعه با OpenGL به زبان C++
در این بخش سورس قلعه با OpenGL را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی C++ نوشته شده است. این پروژه یک شبیه سازی مناسب در زمینه های گرافیک کامپیوتری، رباتیک و مکانیک است و با مشاهده سورس کد آن می توانید چیز های مناسبی را یاد بگیرید. در ادامه می توانید توضیحات و تصاویر مربوط به این برنامه را مشاهده کنید.
توضیحات پروژه
در این پروژه OpenGL، بعد از اجرا شدن برنامه، یک قلعه با استفاده از توابع کتابخانه OpenGL طراحی می شود و کاربر می تواند با استفاده از کلید های مشخص شده دوربین در زوایای مختلف به حرکت درآورد.
در زیر کلیدهایی که به منظور کنترل این ربات در نظر گرفته شده اند را مشاهده می کنید:
- کلید D: برای حرکت دادن دوربین به سمت راست استفاده می شود.
- کلید A: برای حرکت دادن دوربین به سمت چپ استفاده می شود.
- کلید W: برای حرکت دادن دوربین به سمت جلو استفاده می شود.
- کلید S: برای حرکت دادن دوربین به سمت عقب استفاده می شود.
- کلید X: برای حرکت دادن دوربین به سمت بالا استفاده می شود.
- کلید Y: برای حرکت دادن دوربین به سمت پایین استفاده می شود.
در زیر برخی از توابع استفاده شده در این پروژه را مشاهده می کنید:
- تابع keyDown: برای مدیریت کلید های فشرده شده استفاده می شود.
- تابع display: برای نمایش شیء های موجود در صفحه استفاده می شود.
- تابع drawWall: برای ترسیم دیوار های قلعه استفاده می شود.
- تابع init: برای مقداردهی اولیه و آماده سازی برنامه استفاده می شود.
قسمت های از سورس پروژه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | #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 نسخه 2015 تست شده است و به خوبی کار می کند.
- به منظور اجرای پروژه های OpenGL باید آن را بر روی IDE خود نصب کنید (آموزش نصب OpenGL).
- در صورت نا مفهوم بودن بخشی از کد، می توانید در قسمت نظرات مطرح کنید تا برای شما توضیح داده شود.
هیچ نظری ثبت نشده است