2016-06-07 5 views
-1

Я пытаюсь показать 3D-матрицу, состоящую из 7600700 точек, и я хочу получить параллелепипед, который является черным на поверхности и красным внутри. У меня есть параллелепипед, и он черный на поверхности и красный внутри, и я использую три разных окна, чтобы показать три разных плана, которые разделяют параллелепипед и нажимая клавишу, можно двигаться по направлению (в одном окне вдоль х, в другом вдоль y и в третьем вдоль z), наблюдая за одной секцией за раз. Перемещение по z и x не дает мне никаких проблем, я правильно вижу планы секционирования, но когда я пытаюсь показать что-то в третьем окне (тот, который позволяет мне перемещаться вдоль координаты y, разделяя параллелепипед с xz план) я получаю разные вещи. Если я пишуЯ могу видеть только одну точку, когда я меняю gluLookAt

gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f) 

я получить только одну точку, но если я пишу

gluLookAt (340.0f, 85.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f) 

или

gluLookAt (85.0f, 85.0f, 526.0f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f) 

я получить план. Мой параллелепипед состоит из 170 значений для значений x, 170 для значений y и 263 для z, поэтому я обычно устанавливаю три параметра gluLookAt следующим образом: i удваиваю координату, по которой я буду двигаться, и я уменьшаю половину другой две координаты. Вот часть моего кода:

void fill_array_3() { 

g_vertex_buffer_data_3=new GLfloat[3*p_mat_size_tot]; 
int i=0; 
int k=0; 

for(int y=0;y<170;y++) {      
for(int z=0;z<263;z++) { 
    for(int x=0;x<170;x++) { 
g_vertex_buffer_data_3[i]=(GLfloat)x+0.5f; 
g_vertex_buffer_data_3[i+1]=(GLfloat)y+0.5f; 
g_vertex_buffer_data_3[i+2]=(GLfloat)z+0.5f; 
i+=3; 
    } 
} 
} 

void display_3(void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glLoadIdentity(); 

gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f);   
glPushMatrix(); 
glRotatef(step15, 1.0f, 0.0f, 0.0f); 
glRotatef(step16, 0.0f, 1.0f, 0.0f); 
glScalef(step17, step17, step17); 
glTranslatef(0.0f, 0.0f, step18); 
glTranslatef(step19, 0.0f, 0.0f); 
glTranslatef(0.0f, step20, 0.0f); 

glMatrixMode(GL_MODELVIEW); 


glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glVertexPointer(3, GL_FLOAT, sizeof(Point), &points3[0].x); 
glColorPointer(3, GL_FLOAT, sizeof(Point), &points3[0].r); 
glPointSize(3.0); 
glDrawArrays(GL_POINTS, step21*170*263, 170*263); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glFlush(); 
glPopMatrix(); 
glutSwapBuffers(); 
} 

void reshape_3(int w, int h) 
{ 
glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 
glFrustum (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 5000.0f); 
glMatrixMode (GL_MODELVIEW); 
} 

int main(int argc, char** argv) 
{ 

[...] 

fill_array_1(); 
fill_array_2(); 
fill_array_3(); 
fill_array(); 

glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 

glutInitWindowSize(600,600); 
glutInitWindowPosition (1100, 100); 
window_3 = glutCreateWindow(argv[0]); 
glutSetWindowTitle("Vista y"); 
init(); 
glutDisplayFunc(display_3); 
glutReshapeFunc(reshape_3); 
glutKeyboardFunc(keyPressed_3); 

glutMainLoop(); 
return 0; 
} 

Благодарим за помощь!

+0

Я сделал плохой вопрос? –

ответ

1

С

gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f) 

вашего направления наблюдения является (0, 85-340, 0), который коллинеарны вашего up вектора (0,-1,0). gluLookAt будет только сбой, потому что ваши входы не описывают четкую ориентацию камеры.

+0

Прежде всего, спасибо за ваш ответ! Должен ли я изменить вектор вверх? –

+0

Теперь это работает! Если я установил gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, 1.0f, 1.0f), все будет как я бы !!! Большое спасибо!!!!!!!!!!! –

Смежные вопросы