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

Posted

技术标签:

【中文标题】是否可以在一个 OpenGL 矩阵中翻译两次?【英文标题】:Is it possible to translate twice in one OpenGL Matrix? 【发布时间】: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。

【问题讨论】:

【参考方案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 向下移动,并建议他删除另一个。就是这样。 很公平......这很有道理。 谢谢,谢谢,我会考虑您的意见并相应地修复应用程序。

以上是关于是否可以在一个 OpenGL 矩阵中翻译两次?的主要内容,如果未能解决你的问题,请参考以下文章

[OpenGL](翻译+补充)投影矩阵的推导

翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)

翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)

OpenGL投影矩阵(Projection Matrix)构造方法

OpenGL 3.2 设置矩阵的麻烦

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵