【问题标题】:Is it possible to translate twice in one OpenGL Matrix?是否可以在一个 OpenGL 矩阵中翻译两次?
【发布时间】:2009-10-13 03:20:41
【问题描述】:

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

如果您使用 glPushMatrix 和 glPopMatrix。它的作用是复制当前 CT 矩阵,然后对它进行操作,当你弹出它时,你会返回到没有转换的矩阵。

问题是下面我正在尝试绘制一个六边形,翻译(置换,我更喜欢它),绘制另一个六边形,平移并绘制最后一个六边形。发生的事情是第三个六边形从视口的表面消失,我只抬起了两次。有趣的是,连续的旋转和缩放没有给我带来任何问题。

代码的一小部分。

#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(); 
}

我使用此代码得到了类似的结果,只有两个六边形绘制其他六边形进入银河系漫游指南。我改变了每个六边形的颜色,只出现了前两个。

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

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

【问题讨论】:

    标签: c++ opengl graphics


    【解决方案1】:

    你在镜头后面翻译;每次平移在 y 轴上增加 20,在 z 轴上增加 1。在第二步之后,您的六边形在相机后面,并且在视口中看不到。

    试试

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

    对于每个翻译;这应该会有所帮助。

    【讨论】:

      【解决方案2】:

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

      一些想法:

      您的 initCT 函数看起来是多余的。

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

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

      通常,人们通过将模型视图矩阵重置为标识来开始绘制。 glut 可能会为您执行此操作,但如果没有发生,请尝试以下操作:

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

      【讨论】:

      • 你说他的initCT函数是多余的,那建议他做initCT里的什么?
      • 他切换到模型视图并加载身份两次。我添加了一个到投影的开关和一个 loadIdentity,将一个模型视图 loadIdentity 向下移动,并建议他删除另一个。就是这样。
      • 很公平......这很有道理。
      • 谢谢,谢谢,我会考虑您的意见并相应地修复应用程序。
      猜你喜欢
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多