这是一个家庭作业问题,我很抱歉,但我迷路了。发生的事情是以下我被要求做六边形的平铺。就像许多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。
答案 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();
....