سورس دوچرخه سه بعدی با OpenGL به زبان C++
در این بخش سورس شبیه سازی هواپیمای کوچک با OpenGL را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی C++ نوشته شده است. سورس کد این پروژه برای یاد گیری چگونگی ساخت بازی های ساده و کوچک با OpenGL مناسب است و می توانید با مشاهده آن مواردی همچون حرکت دوربین، رسم اشکال مختلف، حرکت دادن شیء ها، گرید بندی را بیاموزید. در ادامه می توانید توضیحات و تصاویر مربوط به این برنامه را مشاهده کنید.
توضیحات پروژه
در این پروژه OpenGL، بعد از اجرا شدن برنامه، یک دوچرخه سه بعدی در صفحه گریدبندی شده رسم می شود و با اسفاده از ماوس می توان دوربین را جهت های مختلف حرکت داد. همچنین امکان به حرکت درآوردن دوچرخه با استفاده از کلید + و متوقف کردن آن با کلید – وجود دارد.
در زیر برخی از توابع استفاده شده در این پروژه را مشاهده می کنید:
- تابع motion: برای حرکت دادن دوچرخه استفاده می شود.
- تابع drawTyre: برای ترسیم چرخ های دوچرخه استفاده می شود.
- تابع drawPedals: برای رسم پدال دوچرخه استفاده می شود.
- تابع drawChain: برای رسم زنجیر دوچرخه استفاده می شود.
- تابع seat: برای ترسیم صندلی دوچرخه استفاده می شود.
قسمت های از سورس پروژه:
#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 نسخه ۲۰۱۵ تست شده است و به خوبی کار می کند.
- به منظور اجرای پروژه های OpenGL باید آن را بر روی IDE خود نصب کنید (آموزش نصب OpenGL).
- در صورت نا مفهوم بودن بخشی از کد، می توانید در قسمت نظرات مطرح کنید تا برای شما توضیح داده شود.
نوشته سورس دوچرخه سه بعدی با OpenGL به زبان C++ اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.