هيثم بيادسه

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

7 ردود في هذا الموضوع

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

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

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

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

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:

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

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

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

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

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

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

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

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

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

post-42837-12611696154522_thumb.jpg

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ما شاء لله ,

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

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

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

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

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

لك الامتنان ,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

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

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

تحياتي ,

تم تعديل بواسطه PhaNTzy
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هاي مرحبا

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

تقبل تحياتي ,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .