是否可以在一个 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学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)
翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)