我无法在openGL中找到正确的坐标。
例如: - 如果h和w是窗口的高度和宽度,那么我想在距离底部h / 4的距离处绘制一条长度为w / 2的线。我如何在openGL中执行此操作?
我找不到任何有关坐标最大值和最小值的参考文献。 我的电脑屏幕是1024 * 768,所以技术上限制应该是: - x坐标:-512到512 y坐标:-384到384 z坐标:-inf为0
但这不起作用。为什么?我需要知道坐标系是如何为openGL工作的。
答案 0 :(得分:2)
在OpenGL中,您可以将坐标系重新定义为您需要的任何内容。默认坐标系由从模型空间到变换到NDC空间的剪辑空间标识的标识变换定义。这意味着,xy坐标范围[-1,1]²映射到您使用glViewport
设置的视口。但是,通过应用正确的转换,您可以将映射更改为您想要或需要的任何内容。
所以我强烈建议你阅读一些关于OpenGL转换管道的教程以及如何使用它。
固定功能管道方法http://www.opengl.org/wiki/Vertex_Transformation
现代方法http://arcsynthesis.org/gltut/Positioning/Tut03%20A%20Better%20Way.html
答案 1 :(得分:1)
我最初也很难使用通用坐标系。
我做的事情对我来说更有意义的是使用OpenGL坐标系,好像我正在使用真实世界坐标系中的真实对象。
我做的是:我拍了一张TARDIS的蓝图(来自电视节目神秘博士),其尺寸以英寸和英尺为单位构建蓝盒子。
从那里,我采用了GL坐标系,并为每一个" 1" GL单位,我相当于" 1"脚,或12英寸。
并且 - 基于0,0,0作为我的TARDIS的中心点,我只是通过代码手工绘制了TARDIS,正如我在蓝图上看到的那样,从我在蓝图上看到的精确尺寸进行翻译。
这是我所做的一个小例子:
glBegin( GL_QUADS );
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f));
glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f));
glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f));
glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f));
glEnd();
我在本练习中学到的第一件事是 - GL单位是通用单位。所以应用一个我更熟悉的系统 - 英尺和英寸 - 使得更容易专注于GL而不是这个单位意味着什么?
一旦我开始绘图,我就能够更有效地使用gluPerspective,这有助于我理解视口分辨率(不要与屏幕分辨率混淆),只需要处理一次,而且这样做了。当利用gluPerspective命令时(如下)
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,250.0f);
所以回答你的问题:浮点值没有最大值,只有你正在处理的浮点数的准确度。
例如,在我上面的透视示例中,我将视口非常接近(0.1 GL单位,即1.2英寸),并将距离设置为250 GL或距离250英尺。
我认为这部分是开始使用OpenGL的部分内容。它是通用单位,因为如果你有一个真实的世界单位系统来再次测量它,那么三维设计会更有意义。
我的建议是:不要将GL单位视为除了与小规模和大规模浮点不准确性相关的误差程度之外的界限或限制。
事实上,我建议将它与现实世界单位进行比较。我在Feet and Inches工作。公制和仪表非常普遍。如果那些人不适合你,那就做一个。
这是我建立的TARDIS: https://universalbri.wordpress.com/2015/05/24/creators-journal-holodeck-management-system-progress-10/
我正在制作一款包含所有这一切的游戏,一款没有战斗的Star Trek Online,现在正在进行数据库工作(SQL Server),OpenGL是问题的一部分:我可以自己动手引擎而不是利用其他人吗# 39; S。
答案是肯定的,我可以,事实上它更可取。
祝你好运