سورس ربات سه بعدی با OpenGL به زبان C++

3d robot in opengl using cpp 5274 تصویر

سورس ربات سه بعدی با OpenGL به زبان C++

در این بخش سورس ربات سه بعدی با OpenGL را برای شما آماده کرده ایم که با استفاده از زبان برنامه نویسی C++ نوشته شده است. این پروژه یک شبیه سازی مناسب در زمینه های گرافیک کامپیوتری، رباتیک و مکانیک است و با مشاهده سورس کد آن می توانید چیز های مناسبی را یاد بگیرید. همچنین سورس کد این برنامه برای افرادی که قصد ساخت بازی های ساده با OpenGL را دارند نیز مناسب است. در ادامه می توانید توضیحات و تصاویر مربوط به این برنامه را مشاهده کنید.

توضیحات پروژه

در این پروژه OpenGL، بعد از اجرا شدن برنامه، یک ربات سه بعدی در صفحه رسم می شود که امکان حرکت در تمام جهت ها را دارد و کاربر می تواند با استفاده از صفحه کلید قسمت های مختلف ربات (مانند دست ها) را به حرکت درآورد. همچنین امکان تغییر زاویه دوربین و نور نیز در این پروژه قرار داده شده است.

در زیر کلیدهایی که به منظور کنترل این ربات در نظر گرفته شده اند را مشاهده می کنید:

  • کلید ۱ : دست چپ ربات را به به طرف چپ حرکت می دهد.
  • کلید ۲ : دست راست ربات را به طرف راست حرکت می دهد.
  • کلید ۳ : دست چپ ربات را به به طرف راست حرکت می دهد.
  • کلید ۴ : دست راست ربات را به طرف چپ حرکت می دهد.
  • کلید q : دست چپ ربات را به به طرف بالا حرکت می دهد.
  • کلید w : دست راست ربات را به طرف بالا حرکت می دهد.
  • کلید a : دست چپ ربات را به به طرف پایین حرکت می دهد.
  • کلید s : دست راست ربات را به طرف پایین حرکت می دهد.
  • کلید r : بالا تنه ربات را به طرف بالا حرکت می دهد.
  • کلید s : بالا تنه ربات را به طرف پایین حرکت می دهد.
  • کلید g : بالا تنه ربات را به طرف راست حرکت می دهد.
  • کلید y : پای چپ ربات را به طرف بالا حرکت می دهد.
  • کلید h : پای چپ ربات را به طرف پایین حرکت می دهد.
  • کلید u : پای راست ربات را به طرف بالا حرکت می دهد.
  • کلید j : پای راست ربات را به طرف پایین حرکت می دهد.
  • کلید i : موقعیت نورپردازی را تغییر می دهد.

در زیر برخی از توابع استفاده شده در این پروژه را مشاهده می کنید:

  • تابع mechTorso: برای متصل کردن بازو ها به سر ربات استفاده می شود.
  • تابع shoulder: برای ترسیم شانه های ربات (اتصال بازوه ها به بدنه) استفاده می شود.
  • تابع box: برای رسم  جعبه های اطراف ربات استفاده می شود.
  • تابع octagon: برای رسم کف پای ربات استفاده می شود.
  • تابع setMaterial: برای نمایش اجزای مختلف ربات به صورت سه بعدی استفاده می شود.

3d robot in opengl using cpp 5274 1 تصویر

قسمت های از سورس پروژه:

#define SPHERE
#define COLOR
#define LIGHT
#define TORSO
#define HIP
#define SHOULDER
#define UPPER_ARM
#define LOWER_ARM
#define ROCKET_POD
#define UPPER_LEG
#define LOWER_LEG
#define NO_NORM
#define ANIMATION
#define DRAW_MECH
#define DRAW_ENVIRO
#define MOVE_LIGHT
/* end of compilation conditions */
/* start various header files needed */
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define GLUT
#define GLUT_KEY
#define GLUT_SPEC
#include <gl\glut.h>
/* end of header files */
#define TEXTID      19
void DrawTextXY(double, double, double, double, char *);
/* start of display list definitions */
#define SOLID_MECH_TORSO       	1
#define SOLID_MECH_HIP          2
#define SOLID_MECH_SHOULDER     3
#define SOLID_MECH_UPPER_ARM    4
#define SOLID_MECH_FOREARM	5
#define SOLID_MECH_UPPER_LEG   	6
#define SOLID_MECH_FOOT        	7
#define SOLID_MECH_ROCKET      	8
#define SOLID_MECH_VULCAN	9
#define SOLID_ENVIRO		10
/* end of display list definitions */
/* start of motion  variables */
#ifndef M_PI
#define M_PI 3.14
#endif
GLUquadricObj *qobj;
char leg = 0;
int shoulder1 = 0, shoulder2 = 0, shoulder3 = 0, shoulder4 = 0, lat1 = 20, lat2 = 20,
elbow1 = 0, elbow2 = 0, pivot = 0, tilt = 10, ankle1 = 0, ankle2 = 0, heel1 = 0,
heel2 = 0, hip11 = 0, hip12 = 10, hip21 = 0, hip22 = 10, fire = 0, solid_part = 0,
anim = 0, turn = 0, turn1 = 0, lightturn = 0, lightturn1 = 0;
float elevation = 0.0, distance = 0.0, frame = 3.0
/* foot1v[] = {} foot2v[] = {} */;
/* end of motion variables */
/* start of material definitions */
#ifdef LIGHT        // to change the color of robot box
GLfloat mat_specular[] = { 0.0, 0.0, 1.0, 1.0 };
GLfloat mat_ambient[] = { 0.0, 0.0, 1.0, 1.0 };
GLfloat mat_diffuse[] = { 0.0, 0.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 128.0 * 0.4 };
GLfloat mat_specular2[] = { 0.508273, 0.508273, 0.508373 };
GLfloat mat_ambient2[] = { 0.19225, 0.19225, 0.19225 };
GLfloat mat_diffuse2[] = { 0.50754, 0.50754, 0.50754 };
GLfloat mat_shininess2[] = { 128.0 * 0.6 };
//to change the wall colorfffffffff
GLfloat mat_specular3[] = { 1.0, 1.0, 0.0 };
GLfloat mat_ambient3[] = { 1.0, 1.0, 0.0 };
GLfloat mat_diffuse3[] = { 1.0, 1.0, 0.0 };
GLfloat mat_shininess3[] = { 0.0 * 0.0 };
//to change the plateform color
GLfloat mat_specular4[] = { 0.633, 0.727811, 0.633 };
GLfloat mat_ambient4[] = { 0.0215, 0.1745, 0.0215 };
GLfloat mat_diffuse4[] = { 0.07568, 0.61424, 0.07568 };
GLfloat mat_shininess4[] = { 128 * 0.6 };
GLfloat mat_specular5[] =
{ 0.60, 0.60, 0.50 };
GLfloat mat_ambient5[] =
{ 0.0, 0.0, 0.0 };
GLfloat mat_diffuse5[] =
{ 0.5, 0.5, 0.0 };
GLfloat mat_shininess5[] =
{ 128.0 * 0.25 };
#endif
void DrawTextXY(double x, double y, double z, double scale, char *s)
{
	int i;
	 glPushMatrix();
	glTranslatef(x, y, z);
	glScalef(scale, scale, scale);
	for (i = 0; i<strlen(s); i++)
	glutStrokeCharacter(GLUT_STROKE_ROMAN, s[i]);
	glPopMatrix();
}
/* start of geometric shape functions */
void Box(float width, float height, float depth, char solid)
{
	char i, j = 0;
	float x = width / 2.0, y = height / 2.0, z = depth / 2.0;
	for (i = 0; i < 4; i++) {
		glRotatef(90.0, 0.0, 0.0, 1.0);
		if (j) {
			if (!solid)
				glBegin(GL_LINE_LOOP);
			else
				glBegin(GL_QUADS);
			glNormal3f(-1.0, 0.0, 0.0);
			glVertex3f(-x, y, z);
			glVertex3f(-x, -y, z);
			glVertex3f(-x, -y, -z);
			glVertex3f(-x, y, -z);
			glEnd();
			if (solid) {
				glBegin(GL_TRIANGLES);
				glNormal3f(0.0, 0.0, 1.0);
				glVertex3f(0.0, 0.0, z);
				glVertex3f(-x, y, z);
				glVertex3f(-x, -y, z);
				glNormal3f(0.0, 0.0, -1.0);
				glVertex3f(0.0, 0.0, -z);
				glVertex3f(-x, -y, -z);
				glVertex3f(-x, y, -z);
				glEnd();
			}
			j = 0;
		}
		else {
			if (!solid)
				glBegin(GL_LINE_LOOP);
			else
				glBegin(GL_QUADS);
			glNormal3f(-1.0, 0.0, 0.0);
			glVertex3f(-y, x, z);
			glVertex3f(-y, -x, z);
			glVertex3f(-y, -x, -z);
			glVertex3f(-y, x, -z);
			glEnd();
			if (solid) {
				glBegin(GL_TRIANGLES);
				glNormal3f(0.0, 0.0, 1.0);
				glVertex3f(0.0, 0.0, z);
				glVertex3f(-y, x, z);
				glVertex3f(-y, -x, z);
				glNormal3f(0.0, 0.0, -1.0);
				glVertex3f(0.0, 0.0, -z);
				glVertex3f(-y, -x, -z);
				glVertex3f(-y, x, -z);
				glEnd();
			}
			j = 1;
		}
	}
}
void Octagon(float side, float height, char solid)
{
	char j;
	float x = sin(0.7) * side, y = side / 2.0, z = height / 2.0, c;

	c = x + y;
	for (j = 0; j < 8; j++) {
		glTranslatef(-c, 0.0, 0.0);
		if (!solid)
			glBegin(GL_LINE_LOOP);
		else
			glBegin(GL_QUADS);
		glNormal3f(-1.0, 0.0, 0.0);
		glVertex3f(0.0, -y, z);
		glVertex3f(0.0, y, z);
		glVertex3f(0.0, y, -z);
		glVertex3f(0.0, -y, -z);
		glEnd();
		glTranslatef(c, 0.0, 0.0);
		if (solid) {
			glBegin(GL_TRIANGLES);
			glNormal3f(0.0, 0.0, 1.0);
			glVertex3f(0.0, 0.0, z);
			glVertex3f(-c, -y, z);
			glVertex3f(-c, y, z);
			glNormal3f(0.0, 0.0, -1.0);
			glVertex3f(0.0, 0.0, -z);
			glVertex3f(-c, y, -z);
			glVertex3f(-c, -y, -z);
			glEnd();
		}
		glRotatef(45.0, 0.0, 0.0, 1.0);
	}
}
/* end of geometric shape functions */
#ifdef NORM
void Normalize(float v[3])
{
	GLfloat d = sqrt(v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);

	if (d == 0.0) {
		printf("zero length vector");
		return;
	}
	v[1] /= d;
	v[2] /= d;
	v[3] /= d;
}

void NormXprod(float v1[3], float v2[3], float v[3], float out[3])
{
	GLint i, j;
	GLfloat length;
	out[0] = v1[1] * v2[2] - v1[2] * v2[1];
	out[1] = v1[2] * v2[0] - v1[0] * v2[2];
	out[2] = v1[0] * v2[1] - v1[1] * v2[0];
	Normalize(out);
}

#endif
void SetMaterial(GLfloat spec[], GLfloat amb[], GLfloat diff[], GLfloat shin[])
{
	glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
	glMaterialfv(GL_FRONT, GL_SHININESS, shin);
	glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
}

نکات

  • این پروژه در نرم افزار Visual Studio نسخه ۲۰۱۵ تست شده است و به خوبی کار می کند.
  • به منظور اجرای پروژه های OpenGL باید آن را بر روی IDE خود نصب کنید (آموزش نصب OpenGL).
  • در صورت نا مفهوم بودن بخشی از کد، می توانید در قسمت نظرات مطرح کنید تا برای شما توضیح داده شود.

نوشته سورس ربات سه بعدی با OpenGL به زبان C++ اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

درباره نویسنده: administrator

ممکن است دوست داشته باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *