是否可以在一个OpenGL矩阵中翻译两次?

时间:2009-10-13 03:20:41

标签: c++ opengl graphics

这是一个家庭作业问题,我很抱歉,但我迷路了。发生的事情是以下我被要求做六边形的平铺。就像许多Risk游戏和Wild Arms XF中的网格地图一样。我理解当前的转换是矩阵,它将我给OpenGL的点转换为屏幕坐标,如果你应用转换,它通常将中心点(0,0)移动到任何地方。

如果你使用glPushMatrix和glPopMatrix。它的作用是制作当前CT矩阵的复制品并对其进行操作,当您弹出它时,您将返回矩阵而不进行转换。

问题是以下我试图绘制六边形,翻译(Displace,我更喜欢它),绘制另一个Hexagon,翻译并绘制最后一个六边形。发生的事情是第三个六边形从视口的表面消失了,我只提升了两次。有趣的是连续旋转和刻度没有问题。

所以代码的一小部分。

#include <windows.h>
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#include <ctime>
using namespace std;

void initCT(void)
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void drawHexagon()
{
    glBegin(GL_LINE_STRIP);
       glVertex2i(0,0);   
       glVertex2i(20, 0);
       glVertex2i(25,10);
       glVertex2i(20,20);
       glVertex2i(0,20);
       glVertex2i(-5,10);
       glVertex2i(0,0);
    glEnd();
}

void myInit(void)
{
    initCT();
    glClearColor(1.0f,1.0f,1.0f,0.0f);
    glColor3f(0.0f, 0.0f, 0.0f);   //set the drawin color
    glPointSize(1.0);   //a 'dot'is 4 by 4 pixel
        glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluOrtho2D(-100.0, 400.0, -400.0, 400.0);
    glViewport(0, 0, 640, 480); 
}

void myDisplay (void) {
    glClear (GL_COLOR_BUFFER_BIT);
    glMatrixMode( GL_MODELVIEW );
    drawHexagon();
    glTranslated(0.0f,20.0f,1.0f);
    drawHexagon();
    glTranslated(0.0f,20.0f,1.0f);
    drawHexagon();
    glTranslated(0.0f,20.0f,1.0f);
    drawHexagon();

    glFlush();    //send all output to display
}

void main (int argc, char **argv) {
    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize (640, 480); 
    glutInitWindowPosition (100, 150); 
    glutCreateWindow ("Hexagon Tiling"); 
    glutDisplayFunc (myDisplay); 
    myInit();

    glutMainLoop(); 
}

我已经使用了类似结果的代码,只有两个六边形绘制其他六边形进入银河系的Hitchhikers指南。我改变了每个六边形的颜色,只显示了前两个。

谢谢,你是男人。如果给一个人的答案让另一个人感到不安,我很抱歉,但你们两个都是对的。

对于使用谷歌的人来说,这是来自使用Open GL的计算机图形学,翻译功能中的错误是作者在翻译中给你的,它应该在Z轴上为0。

2 个答案:

答案 0 :(得分:4)

你正在翻译相机;每个平移在y轴上向上移动20,在z轴上向上移动1.在第二步之后,您的六边形位于相机后面,并且在视口中无法看到。

尝试

glTranslated(0.0f,20.0f,0.0f);

每次翻译;应该有所帮助。

答案 1 :(得分:2)

是的,您可以多次使用glTranslate。这将构造一个新的转换矩阵,并将其乘以当前矩阵。

一些想法:

您的initCT功能看起来多余。

gluOrtho2D通常用于修改投影矩阵。尝试这样的事情:

....
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100.0, 400.0, -400.0, 400.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
....

通常,通过将模型视图矩阵重置为标识来开始绘制。过剩可能会为你做这件事,但如果没有发生,请试试这个:

....
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
drawHexagon();
....