الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تدوير المكعب عن طريق نقر وتحريك الفأرة

بدأه Armin في 17 سبتمبر 2010 · 1 رد · 737 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد قمت برسم مكعب في opengl والان أريد تدوير المكعب حوال المحاور الأساسية X, Y and Z بالاستخدام الفأرة

أريد القيام بذلك بحيث عند الضغط على الزر الأيسر للفـأرة (بإستمرار الضغط) وتحريك الفأرة إلى اتجاه اليمين، فإن المكعب يدور حول المحور الصادي بزاوية معينه تعتمد على حركة الفأرة.

أرجو المساعدة،،،

تحياتي

#2

وعليكم السلام ،

استقبل الحدث الخاص " بالنقر " + " الحركة " ، حسب المكتبة التي تستخدم مثل GLFW أو GLUT ، أعتقد تسمّى أحياناً بالـ Drag ، أي السحب ،

ستسقبل قيمة Mouse.x الجديدة ، وعليك بالقيام بعملية حسابية لتصبح قيمة الاحداثي السيني للفأرة مفيدة ، وبالتالي يمكن أن تدور بالشكل المناسب ،

فمثلاً : للدوران حول محور الصادات ، استقبل قيمة x الجديدة التي جاءت من حركة الفأرة ، وبما أن قيمة x ستمثّل موقع الفأرة ، فسيصبح الرقم ضخم مثل 400 ، وبالتالي عليك بالتفكير بطريقة لاستخلاص الاتجاه الذي يريده المستخدم ( تحريك المكعب باتجاه عقارب الساعو أو عكسها ) ،

هذا مثال بسيط جداً كتبته قبل قليل ، لتوضيح الفكرة والأدوات ، ولكن أنصحك أن تبحث عن كود أفضل إن كان لديك الوقت ، وستجد عشرات الدروس التي تشرح الفكرة ، مثل :

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=48

وغيرها ، لكن هذا المثال قد يفيدك لو كنت تريد مجرد نقطة بداية :

#include <windows.h>
#include <GL/glut.h>

int oldX = 0,oldY = 0;
float xAngle = 0;
float yAngle = 0;
void display() {
	glClearColor(0.0, 0.0, 0.0, 1.0);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0,0,-10);
	glRotatef(xAngle,0,1,0); // rotate around the y-axis
	glutWireCube(2.0f);
	glutSwapBuffers();
}

void mouseMove(int x,int y )
{

	xAngle += (x - oldX);
	//yAngle += (x - oldX);
	oldX = x;
	glutPostRedisplay();
}

void reshape(int w,int h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective(65.0f,1.0f,1,1000);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();


}
int main(int argc, char **argv) {
	glutInit(&argc, argv);
	glutInitWindowSize(512,512);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutCreateWindow("The glut hello world program");
	glutReshapeFunc(reshape);
	glutMotionFunc(mouseMove);
	glutDisplayFunc(display);
	glutMainLoop(); // Infinite event loop
	return 0;	
}

انقر أثناء التحريك يمين ويسار ليدور المكعب حول محور الصادات ، لكن قيمة زاوية الدوران في كل مرة ليست دقيقة ،

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…