وأخيرا تحركت الكميرا ,,,, مابقى الا نسوي لعبة 3d

الناقل : elmasry | الكاتب الأصلى : الشمري | المصدر : www.arabteam2000-forum.com

السلام عليكم :

ملاحظة :
هذه الطريقة ناقصة وتحتاج لتعديلات معيّنة .

بعد ان خصصت اسبوعا كامل لابحاث الكميرا ... طلعت هالتخصيصات فالصو ..

المسألة سهلة ..

قايلكم .. والله قايلكم .. هالاجانب دايما ما يعقدون الكود .. و يحولون الصعب سهل .
بلا Vector بلا وجع راس ..:P

فقط باللعب بالدالة :

gluLookAt( eyex, eyey, eyez, centx, centy, centz, upx, upy, upz );

ستحرك الكميرا . .

سبق أن سألت الاخوان عن حساب المتجه في البارمتر الاخير .. ووضحوا لي ذلك .
جئت البارحة .. اريد التطبيق لكن قلت خلونا .. نجرب بدون UP V ..
وطلعت النتيجة التي اريد ,,,

البارمتر الاول .. والثاني والثالث احداثيات الكاميرا نفسها .

البارمتر الرابع والخامس والسادس احداثيات الجسم الذي ننظر اليه .
الثلاث بارمترات الأخيرة تمثل متجه يسمّى Up Vector في الغالب قيمته هي : 0,1,0


وهذا تطبيق صغير :

#include<glut.h>
 
/* exclusive :)  alshammari  - aboshammar@gmail.com */
  int i=0,j=0;
 
float eyex=0, eyey=1,eyez=0;
float centx=0 ,centy=0,centz=-100;
float upx=0 ,upy=1,upz=0;

void pressKey(int key, int x, int y) {
glutPostRedisplay();
        switch (key) {

  case GLUT_KEY_LEFT :
        eyex-=0.3;
  ;break;
  case GLUT_KEY_RIGHT :
        eyex+=0.3;
  ;break;
  case GLUT_KEY_UP :
    eyey+=0.3;
        break;
  case GLUT_KEY_DOWN :
    eyey-=0.3;
        break;
  case GLUT_KEY_HOME :
        eyez-=0.3;
    break;
  case GLUT_KEY_END :
        eyez+=0.3;
 
        break;


  case GLUT_KEY_F2 :
    centx+=0.3;
        break;
  case GLUT_KEY_F3 :
    centx-=0.3;
        break;
  case GLUT_KEY_F4 :
    centy+=0.3;
        break;
  case GLUT_KEY_F5 :
    centy-=0.3;
        break;
  case GLUT_KEY_F6 :
    centz+=0.3;
        break;
  case GLUT_KEY_F7 :
    centz-=0.3;
        break;

        }
}


void reshape(int w, int h)
{
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
  gluPerspective(45.0, (float)w/(float)h, 1.0, 800.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}


 

void Init()
{
        glClearColor(0.0, 0.0, 0.0, 0.0);  
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHT0);
        glEnable(GL_LIGHTING);
}    
   
void render(void)
{
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
 gluLookAt( eyex, eyey, eyez, centx, centy, centz, upx, upy, upz );

       
        glPushMatrix();
      glColor3f(1.0, 0.0, 0.0);
  glTranslatef(1.5,3.0,-22.0);
        glutSolidTeapot(2);
     glPopMatrix();

        /*----------------FLOOR--------------*/
   glEnable(GL_BLEND);
        glDisable(GL_DEPTH_TEST);
   glBlendFunc(GL_SRC_ALPHA,GL_SRC_ALPHA);
    glColor4f( 0.0 , 0.8 , 0.6 , 0.2);
        glPushMatrix();
  glTranslatef(0,0,-11.0);
    glRotatef(90,1,0,0);
  glScalef(4,4,4);
   glBegin(GL_QUADS);
    glVertex2f(-4 ,4 );
    glVertex2f(4 ,4 );
     glVertex2f( 4 ,-4 );
    glVertex2f(-4,-4 );
     glEnd();
    glPopMatrix();

    glDisable(GL_BLEND);
        glEnable(GL_DEPTH_TEST);

/*----------------FLOOR--------------*/

    glutSwapBuffers();
       
}

void main(int argc, char **argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(320,320);
        glutCreateWindow("arab team - glut  ");
       
        Init();
        glutDisplayFunc(render);
/***********************/
        glutIdleFunc(render);
//      glutIgnoreKeyRepeat(1);
        glutSpecialFunc(pressKey);
        /***********************/
        glutReshapeFunc(reshape);

  glutMainLoop();
}


التحكم :
الاسهم .
F2 -----F7
END - HOME


طيب كيف نجعل الكميرا تدور B) ,,, . اذكر رأيت كود مشابه اذا لقيته .. وضعته هنا :.
 
ملف مرفق(ملفات)
 
ملف مرفق  camera.zip (36.87كيلو )