这让我很沮丧
(数十小时)在计算机和Google面前,但我仍然
还没有解决。我对openGL很陌生,我开始阅读教程
在过去的2-3个月内上网,并尝试了一些代码。
我的主要问题是,当我从正交投影转移到透视时
我一直在不断地努力管理和在屏幕上绘制简单的形状。我对矩阵知之甚少,但事实是在正交学中
投影我指定对象的x,y,z坐标,这些是
窗口坐标。从角度看我还没有看到坐标
被应用。我看过范围从-1到1,甚至-20到20等。我读到可以在openGL上指定坐标,但是我应该怎么做呢?
在正交中,我这样做:
视窗大小为800x600
我希望盒子成为整个窗户
所以,
glVertex2i( 0, 600 );
glVertex2i( 0, 0 );
glVertex2i( 800, 0 );
glVertex2i( 800, 600 );
但是投影呢?
当我输入1时,它在窗口的末端,而-1处在开始。
opengl如何决定窗口的开始/结束以及为什么它是-1到1 ???
如果有人可以帮助我,这真是令人困惑,我将非常感激。
谢谢。
最佳答案
首先,您要为3D投影设置投影和Modelview矩阵:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, ratio, near_clip, far_clip);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz);
gluLookAt接受3个向量,即相机“眼睛”的位置,观察点和“向上向量”。如果调用gluLookAt(0.0,0.0,-10.0,0,0,0,0,1,0)这意味着相机位于0,0,-10并沿z轴看向原点0,0,0 “ up”沿y的正轴。如果您随后对opengl进行了简单的绘制调用,以获得单个四边形,则它应显示在渲染中:
glColor3f(1.0f,1.0f,1.0f); //set white color (or any contrast to your background)
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
您可以按顺时针或逆时针顺序绘制,但不能混合使用。您可以使用glEnable / Disable(GL_CULL_FACE)和glCullFace控制剔除。
窗口大小为800x600,我希望框为整个窗口,因此
使用2D投影(正交)时,您可以轻松设置坐标系的大小以匹配窗口/视口的大小。这不适用于3D投影,因为边界现在是3D viewing frustrum或从近片段到远片段平面的3D体积。然后,通过模型视图投影矩阵将坐标投影到2D曲面上。您可以轻松输入坐标,例如宽度为800且高度为600的四边形,但是要查看该坐标,您需要将相机移开以捕捉整个四边形。
引用评论:
gluPerspective(45.0f,(double)w /(double)h,1.0f,100.0f)应该设置一个Near = 1和far = 100的透视图。但是由于openGL是右撇子,因此正z不在屏幕如此接近应该是100远1。我怎么会在每个教程中看到远不到远?这是没有道理的。
答案(请参阅上方的3D观看视锥细胞的链接):
视锥台是相对于视口相机定位的场景中的3D体积。体积的形状会影响模型如何从相机空间投影到屏幕上
关于c++ - OpenGL帮助有关透视图中的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8113123/