Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > [OpenGL] Объект исчезает с экрана gltranslatef z


Автор: linuxoid 29.3.2013, 19:57
Здравствуйте, коллеги. Хотел попробовать простой пример с отображением трехмерных объектов, но не могу разобраться, почему объект исчезает, если я к примеру задаю 

Код

Gl.glTranslatef(0f, 0.0f, -5.0f);


Если используем 

Код

Gl.glTranslatef(0f, 0.0f, 0f);


то всё в порядке, объект видно. 

Как я понимаю, мы отдаляем объект по z координате и он должен стать меньше, но вместо этого на экране появляется пустота. Подскажите, пожалуйста, что у меня не так в коде или чего я не понимаю. Спасибо.

Код

        private void Form1_Load(object sender, EventArgs e)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glClearColor(255, 255, 255, 1);
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();

            display();

            Gl.glFlush();
            winOG.Invalidate();
        }

        void display()
        {
            Gl.glTranslatef(0f, 0.0f, -5.0f);  // Проблема

            Gl.glBegin(Gl.GL_TRIANGLES);           // Begin drawing the pyramid with 4 triangles
            // Front
            Gl.glColor3f(1.0f, 0.0f, 0.0f);     // Red
            Gl.glVertex3f(0.0f, 1.0f, 0.0f);
            Gl.glColor3f(0.0f, 1.0f, 0.0f);     // Green
            Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
            Gl.glColor3f(0.0f, 0.0f, 1.0f);     // Blue
            Gl.glVertex3f(1.0f, -1.0f, 1.0f);

            // Right
            Gl.glColor3f(1.0f, 0.0f, 0.0f);     // Red
            Gl.glVertex3f(0.0f, 1.0f, 0.0f);
            Gl.glColor3f(0.0f, 0.0f, 1.0f);     // Blue
            Gl.glVertex3f(1.0f, -1.0f, 1.0f);
            Gl.glColor3f(0.0f, 1.0f, 0.0f);     // Green
            Gl.glVertex3f(1.0f, -1.0f, -1.0f);

            // Back
            Gl.glColor3f(1.0f, 0.0f, 0.0f);     // Red
            Gl.glVertex3f(0.0f, 1.0f, 0.0f);
            Gl.glColor3f(0.0f, 1.0f, 0.0f);     // Green
            Gl.glVertex3f(1.0f, -1.0f, -1.0f);
            Gl.glColor3f(0.0f, 0.0f, 1.0f);     // Blue
            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);

            // Left
            Gl.glColor3f(1.0f, 0.0f, 0.0f);       // Red
            Gl.glVertex3f(0.0f, 1.0f, 0.0f);
            Gl.glColor3f(0.0f, 0.0f, 1.0f);       // Blue
            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
            Gl.glColor3f(0.0f, 1.0f, 0.0f);       // Green
            Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
            Gl.glEnd();   // Done drawing the pyramid
        }




Автор: baldina 29.3.2013, 21:25
Цитата(linuxoid @  29.3.2013,  19:57 Найти цитируемый пост)
Если используем 
Gl.glTranslatef(0f, 0.0f, 0f);

то, считай, ничего и не делаем
Цитата(linuxoid @  29.3.2013,  19:57 Найти цитируемый пост)
мы отдаляем объект по z координате и он должен стать меньше

объект, конечно, не меняется. его проекция может иметь другой размер, если проецирование перспективное. если ортогональное, то объекты проецируются независимо от удаленности.

тут проблема в другом: opengl обрабатывает куб вида единичного размера, все что за пределами просто отсекается.
так что двигая объект на 5, вы просто выводите его за пределы отсечения.

нужно правильно настроить матрицу проецирования, например при помощи http://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml
http://www.songho.ca/opengl/gl_projectionmatrix.html

Автор: linuxoid 31.3.2013, 15:14
baldina, Благодарствую! Помогло smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)