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

استفسار حلو حركه عجله مع انسان يقودها,

بدأه PhaNTzy في 18 ديسمبر 2009 · 6 رد · 1,489 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,,

يسعدني الانضمام لاسره من جديد ,

انا مهتم بالبرمجه بشكل عام والجرافيكس خاص ,

استفساري كالاتي , ما احاول عمله بختصار هو شخص ماسك جله وماشي بيها ,اي كالصوره التاليه :

89503498.jpg

الان انا بالمرحله التاليه (العجله تتحرك مع الموجه نحو اليمين او اليسار بالتحكم بالفاره) : -

91074997.jpg

هذه الكود :

#include "GL/glut.h"
#include <math.h>

double const PI = 4*atan(1.0);
double start=0;
double delta=0.1;

void init()
{
	glClearColor(0.0,0.0,0.0,0); // Set background color
	glOrtho(-1,1,-1,1,-0.5,50); //near must negative -0.5
}

void DrawSinMotion()
{
	double x,y;
	glColor3d(0.0,0.9,0.0); // green
	glLineWidth(3);
	glBegin(GL_LINE_STRIP);
	for(x=-10;x<10;x+=0.01) {
				//y=0.7*sin(100*x)*sin(6*x+start);
				y=0.2*sin(2*x+start*0.01);
				glVertex2d(x,y);
	}
	glEnd();

}

void DrawSin()
{
	double x,y;
	glColor3d(0.0,0.9,0.0); // green
	glLineWidth(3);
	glBegin(GL_LINE_STRIP);
	for(x=-10;x<10;x+=0.01) {

			//	y=0.2*sin(3*x);
				y=0.2*sin(2*x+start*0.01); // moveing the sin
				glVertex2d(x,y);
	}
	glEnd();

}

void DrawWheel()
{
	double x,y,alpha;
	glColor3d(0.9,0.7,0.3);
	glBegin(GL_LINE_LOOP );
		for(alpha=0;alpha<=360;alpha+=5)
		{
			x = cos(alpha*PI/180);
			y = sin(alpha*PI/180);
			glVertex2d(x,y);	
		}
		glEnd();

		glLineWidth(1);



//################################### al5t 
		glBegin(GL_LINES);
		for(alpha=0;alpha<=20;alpha+=1)
		{
			x = cos(alpha*PI/180);
		//	y = sin(alpha*PI/180);
			x = x + 2;
			glVertex2d(x,5);
			glVertex2d(0,0); 

		}
	glEnd();
}
//####################################
void display()
{
	double y,x;
	glClear(GL_COLOR_BUFFER_BIT);

	glLoadIdentity(); // Set matrix of painting to Identity

	//	glPushMatrix(); // start local transformations

	////////////Cicle Motion ///////////////////////
		DrawSin();
		x=-1+start*2*PI*0.1/360;
		//y=0.2*sin(3*x);
		y=0.2*sin(2*x+start*0.01); // moving the sin 
		glTranslated(x,0.1+y,0);
	///////////////////////////////////////////////

		glScaled(0.1,0.1,1);
		glRotated(-start,0,0,1);
		DrawWheel();
//	glPopMatrix(); // end local transformations
	glutSwapBuffers();
}

void Idle()
{
//	Sleep(10);
	start+=delta;
	glutPostRedisplay();
}

void MyMouse(int button, int state,int x, int y)
{
	if(button == GLUT_LEFT_BUTTON && state==GLUT_DOWN)
		if(delta == 0) 
				delta=0.1;
		else delta=-delta;
	if(button == GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
			delta=0;

}

void main(int argc, char** argv)
{
	// All this is from first.cpp
	// Lookup in google for glutInit*
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
	glutInitWindowSize(600,600);
	glutInitWindowPosition(200,100);
	glutCreateWindow("First example");
	glutDisplayFunc(display);
	glutIdleFunc(Idle);
	glutMouseFunc(MyMouse);
	init();
	glutMainLoop();
}

اي ما احتاجه الان رسم باقي الخطوط بالطريقه المناسبه وجعل الشخص يتحرك مع العجله (طبعا ليس هوناك حاجه بتقليد مشي الانسان مجرد حركه او زحف)

لقد حاولت استخدام ال :

 
	glBegin(GL_LINES)

مثلما واضح بالكود بفرع "###" لكن الخط يدور مع العجله ...

ارجو مساعدتي بتصميم الحل .. الكود ركبتو من عده برامج وانا مبتدأ :happy:

تقبلو تحياتي ,

IMPOSSUIBLE IS NOTHING

#2

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

البرنامج يحتاج مخمخة قليلاً .. وهي التي لا أملكها الان ،لكن يبدو رسمك متقن ، وتسير في الطريق السليم ، ممكن تحاكي مشي - الشخصية - بشكل سطحي قليلاً ، ولو مؤقتاً .. ثم تنتقل إلى تحريك أكثر تفاعلية .

المهم ، سأتكلم بشكل فلسفي قليلاً :

تلاحظ أن ساقي الرجل ( سيقانه يعني :D ) ، يجب أن تقع على نقاط دالة الجيب .. sin ..

وكما تعلم ، هذه السيقان تحمل جسد الشخصية - مجرد خط - .

وهذا الخط - وسط الشخصية - يحمل الرأس .

والأيدي أيضاً مرتبطة موقعها بموقع جسم الشخصية .

الخلاصة ، من خلال هذه الشجرة ( أكيد درست في الحاسب شيء اسمه Tree في Data Structure ) ، تستطيع أن تبني حركة بسيطة ومرنة في نفس الوقت .

وذلك بأن تمثل كل قطعة من جسده على هيئة node ، يقوم بتحريك أبناءه اذا تحرك من مكانه .

إلى هنا أنتهي من الفلسفة ، الان ، هل تحتاج أنت لعمل شجرة .. ومعادلات معينة ؟

لا أعتقد أنك تريد بناء حركة معقدة ، ولذلك لا أرى ضرورة لوجود Tree لتمثيل ماتريد . لذلك يمكن أن تحرك المجسمات في لعبتك بشكل مبسط ودون تعقيدات .

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

بحيث تظهر بهذا الشكل تقريباً :

post-42837-12611696154522_thumb.jpg

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

هذه مجرد فكرة بسيطة ، ولا تقدم لك تحكم كامل ، كما قد تتخيله ،

بانتظار المحاولة ,

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

ما شاء لله ,

ردك رسيع والك الف شكر , لكن ..استفساري كان حلو طريقه رسم الخطوط (اي الخطوط التي تكون جسم الانسان وجسم المركبه) . فعلا مخمختي بال Tree لان :P فكره عجبتني لكن اعتقد انها زياده عن المطلوب .. غير لازم حركه تفاعليه مثلما ذكرت ..

[اسمحلي اكلم نفسي قليلا]

لنفرض اني استطعت رسم خط والتحكم به ,وثم كونت بعض الخطوط ولينتج جسم كامل , هل استطيع تحريكهم دون شجره ؟ اظن انني استطيع

:huh: وذالك بالتحريك بشكل متطابق لكن هل هذا الحل ينتج صوره متلائمه... :excl:

اوك الان سؤالي لك , كيف استطيع فعلا رسم خط لاكون الجسم ؟

لك الامتنان ,

IMPOSSUIBLE IS NOTHING

#4

السلام عليكم

انا بعرف انه اذا اردت تحريك جسم مكون من اكتر من اوبجت (وهي رسمة الشخص هنا ) تحتاج الى تعلم ما يسمى ب list

طبعا تأكد من كلامي فانا مبتدئه مثلك

بالتوفيق

#5

مشكوره لمرورك الكريم :happy:

اذا قصدك بال list اي ما قصده الاخ الشمري بال Node فنعم اعرف ما القصد ,لكن التطبيق طبعا شي ثاني ...اقصد انو غير سهل

اول شيء يجب معرفه كيف الرسم والتحكم بالمكان لتكوين الصوره ... وثم سوف احلل تركيب الحركه

ابقى معنا بالموضوع ^ ^

تحياتي ,

تم تعديل هذه المشاركة بواسطة PhaNTzy في 19 ديسمبر 2009 في 01:17

IMPOSSUIBLE IS NOTHING

#6

هاي مرحبا

المتطلبات و هي معرفة جيدة بعمليات:

- التعامل بالمكدس glPushMatrix و glPopMatrix, من أجل عمل ربط ديناميكي.إنه من المعلوم في عالم الأوبن جي أل أن كل خاصية تحافظ على حالتها و لا تتغير هذا فيما يخص دوال التحريك, فهتان الدالتان glPushMatrix و glPopMatrix تقوم بحجز المصفوفة ما كمصفوفات التحريك glTranslate مثلا ك عمل قيصري , أي أنها لن تأثر على باقي الخواص .

- evaluators و nurbs في هذه الحالة أنت غير مقيد بإستعمال nurbs يكفيك evaluators فقط , عن طريق الدالة glEvalCoord , هذا يفيد في عمل خطوط و سطوح ناعمة مما يخلق نقاط إضافية بين كل نقطتين (كل ذلك عن طريق محددين للنقطة الأولى و محددين أخرين للنقطة الثانية و هكذا دواليك إلى أخر نقطة)(المحددين هما أيظا عبارة عن نقطتين لكن لا يتعامل معهم السيد أوبن جي أل كنقاط رسم) .

- عمليات buffer object كائن الذاكرة, إن كنت في حاجة لعمل مشروع ضخم يستدعي عدد هائل من معرفات النقاط عندها ستلجئ لإستعمال ذاكرة معالج الرسوميات لإختزال زمن نقل البيانات.

- إستعمال دوال vetex buffer object لكي تتخلى عن الطريقة البدائية في الرسم (الطرق البدائية هي glBegin وglEnd) حيث تقوم يتكرار بعض العمليات مما تسبب إنزعاجا للسيد أوبن جي أل.

أتمنى لك التوفيق.

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#7

ممم مشكور لشرحك اخي ,سوف امر عبعض المصطلحات الي ذكرتها واحاول فهم الاستخدام ,لانو جوابك مركب لي :P

سوف احاول استخدام الدوال المتقدمه لكن ايضا ممكن اكتفي باستخدام الاسلوب البدائي مثلما ذكرت ...

سوف ترى التفاصيل ,

تقبل تحياتي ,

IMPOSSUIBLE IS NOTHING

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