Я пытаюсь показать 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;
}
Благодарим за помощь!
Я сделал плохой вопрос? –