سورس دوچرخه سه بعدی با OpenGL به زبان C++
در این بخش سورس شبیه سازی هواپیمای کوچک با OpenGL را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی C++ نوشته شده است. سورس کد این پروژه برای یاد گیری چگونگی ساخت بازی های ساده و کوچک با OpenGL مناسب است و می توانید با مشاهده آن مواردی همچون حرکت دوربین، رسم اشکال مختلف، حرکت دادن شیء ها، گرید بندی را بیاموزید. در ادامه می توانید توضیحات و تصاویر مربوط به این برنامه را مشاهده کنید.
توضیحات پروژه
در این پروژه OpenGL، بعد از اجرا شدن برنامه، یک دوچرخه سه بعدی در صفحه گریدبندی شده رسم می شود و با اسفاده از ماوس می توان دوربین را جهت های مختلف حرکت داد. همچنین امکان به حرکت درآوردن دوچرخه با استفاده از کلید + و متوقف کردن آن با کلید – وجود دارد.
در زیر برخی از توابع استفاده شده در این پروژه را مشاهده می کنید:
- تابع motion: برای حرکت دادن دوچرخه استفاده می شود.
- تابع drawTyre: برای ترسیم چرخ های دوچرخه استفاده می شود.
- تابع drawPedals: برای رسم پدال دوچرخه استفاده می شود.
- تابع drawChain: برای رسم زنجیر دوچرخه استفاده می شود.
- تابع seat: برای ترسیم صندلی دوچرخه استفاده می شود.
قسمت های از سورس پروژه:
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 | #include <gl\glut.h> #include <stdio.h> #include <math.h> #define PI 3.14159 #define WIN_WIDTH 600 #define WIN_HEIGHT 500 #define CYCLE_LENGTH 3.3f #define ROD_RADIUS 0.05f #define NUM_SPOKES 20 #define SPOKE_ANGLE 18 #define RADIUS_WHEEL 1.0f #define TUBE_WIDTH 0.08f #define RIGHT_ROD 1.6f #define RIGHT_ANGLE 48.0f #define MIDDLE_ROD 1.7f #define MIDDLE_ANGLE 106.0f #define BACK_CONNECTOR 0.5f #define LEFT_ANGLE 50.0f #define WHEEL_OFFSET 0.11f #define WHEEL_LEN 1.1f #define TOP_LEN 1.5f #define CRANK_ROD 0.7f #define CRANK_RODS 1.12f #define CRANK_ANGLE 8.0f #define HANDLE_ROD 1.2f #define FRONT_INCLINE 70.0f #define HANDLE_LIMIT 70.0f #define INC_STEERING 2.0f #define INC_SPEED 0.05f /***************************************** * All the Global Variables are Here ****************************************/ /***************************************** * Cycle - related variables ******************************************/ GLfloat pedalAngle, speed, steering; /******************************* * User view realted variables ********************************/ GLfloat camx, camy, camz; GLfloat anglex, angley, anglez; /**************************** * Mouse related variables ****************************/ int prevx, prevy; GLenum Mouse; /************************** * Cycle position related * variables ***************************/ GLfloat xpos, zpos, direction; void ZCylinder(GLfloat radius, GLfloat length); void XCylinder(GLfloat radius, GLfloat length); void drawFrame(void); void gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth); void drawChain(void); void drawPedals(void); void drawTyre(void); void drawSeat(void); void help(void); void init(void); void reset(void); void display(void); void idle(void); void updateScene(void); void landmarks(void); void special(int key, int x, int y); void keyboard(unsigned char key, int x, int y); void mouse(int button, int state, int x, int y); void motion(int x, int y); void reshape(int w, int h); void glSetupFuncs(void); GLfloat Abs(GLfloat); GLfloat degrees(GLfloat); GLfloat radians(GLfloat); GLfloat angleSum(GLfloat, GLfloat); /************************************* * End of the header file *************************************/ /************************************** * Start of the source file "cycle.c" **************************************/ //#include "cycle.h" /****************************************** * A * 1 ========== 2 * /\ | B * / \ / 5 * E / \D / * / \ / C * / \ / * 3 ==========/ 4 * F * 1 = 212,82 * 2 = 368,82 * 5 = 369,94 * 3 = 112,220 * 4 = 249,232 * * 214 = 73 * 124 = 55 * 142 = 52 * 143 = 73 * 134 = 50 * 431 = 57 ****************************************/ void ZCylinder(GLfloat radius, GLfloat length) { GLUquadricObj *cylinder; cylinder = gluNewQuadric(); glPushMatrix(); glTranslatef(0.0f, 0.0f, 0.0f); gluCylinder(cylinder, radius, radius, length, 15, 5); glPopMatrix(); } void XCylinder(GLfloat radius, GLfloat length) { glPushMatrix(); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); ZCylinder(radius, length); glPopMatrix(); } // called by idle() void updateScene() { GLfloat xDelta, zDelta; GLfloat rotation; GLfloat sin_steering, cos_steering; // if the tricycle is not moving then do nothing if (-INC_SPEED < speed && speed < INC_SPEED) return; if (speed < 0.0f) pedalAngle = speed = 0.0f; // otherwise, calculate the new position of the tricycle // and the amount that each wheel has rotated. // The tricycle has moved "speed*(time elapsed)". // We assume that "(time elapsed)=1". xDelta = speed*cos(radians(direction + steering)); zDelta = speed*sin(radians(direction + steering)); xpos += xDelta; zpos -= zDelta; pedalAngle = degrees(angleSum(radians(pedalAngle), speed / RADIUS_WHEEL)); // we'll be using sin(steering) and cos(steering) more than once // so calculate the values one time for efficiency sin_steering = sin(radians(steering)); cos_steering = cos(radians(steering)); // see the assignment 3 "Hint" rotation = atan2(speed * sin_steering, CYCLE_LENGTH + speed * cos_steering); direction = degrees(angleSum(radians(direction), rotation)); } /***************************** * Reset The scene *****************************/ void reset() { anglex = angley = anglez = 0.0f; pedalAngle = steering = 0.0f; Mouse = GLUT_UP; pedalAngle = speed = steering = 0.0f; camx = camy = 0.0f; camz = 5.0f; xpos = zpos = 0.0f; direction = 0.0f; } int main(int argc, char *argv[]) { help(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(300, 100); glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); glutCreateWindow("SourceSara.Com | 3D Bicycle"); init(); glSetupFuncs(); glutMainLoop(); } |
نکات
- این پروژه در نرم افزار Visual Studio نسخه 2015 تست شده است و به خوبی کار می کند.
- به منظور اجرای پروژه های OpenGL باید آن را بر روی IDE خود نصب کنید (آموزش نصب OpenGL).
- در صورت نا مفهوم بودن بخشی از کد، می توانید در قسمت نظرات مطرح کنید تا برای شما توضیح داده شود.
هیچ نظری ثبت نشده است