السلام عليكم :
ملاحظة :
هذه الطريقة ناقصة وتحتاج لتعديلات معيّنة .
بعد ان خصصت اسبوعا كامل لابحاث الكميرا ... طلعت هالتخصيصات فالصو ..
المسألة سهلة ..
قايلكم .. والله قايلكم .. هالاجانب دايما ما يعقدون الكود .. و يحولون الصعب سهل .
بلا Vector بلا وجع راس ..
فقط باللعب بالدالة :
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كيلو )