我正在使用最新的蓝皮书学习OpenGL,我希望得到一点澄清。书中说你可以对坐标系使用任何测量系统,但是在进行三维透视编程时,世界坐标为+ 1 / -1。
我想我有点困惑的地方就是说我想用英尺和英寸为我的世界,我想建立我家的内部。我会使用翻译(x(英尺),y(英尺),z(英尺)),额外,还是有一些功能来改变你的x,y世界坐标(即将默认值从-1 / + 1改为让说(-20/20)。我知道openGl可以转换所有单位。
所以我猜我最大的知识差距是如何在OPENGL中模拟现实世界的物体(长度)?
答案 0 :(得分:3)
我认为作者指的是在透视分割后出现的标准化坐标(设备坐标)。
通常,当您在OpenGL中实际操作对象时,您使用的标准世界坐标不限于-1 / + 1。这些世界坐标可以是您喜欢的任何东西,并通过乘以模型视图和投影矩阵然后除以齐次坐标“w”来转换为规范化坐标。
OpenGL将为您完成所有这些(直到您进入着色器),所以不要担心标准化坐标。
答案 1 :(得分:2)
那么它的亲戚。如果你将1个OpenGL单位设置为1米,然后在此基础上完美地构建所有内容,那么你就拥有了你想要的比例(即10米是10个openGL单位,1毫米是0.001个OpenGL单位。
但是,如果您要引入一个设计为1 OpenGL单位= 1英尺的模型,那么该对象最终会变成大约3倍。
当然,您可以在各种方法之间进行更改,但到目前为止,最好的方法是在将模型加载到引擎之前重新调整模型。
答案 2 :(得分:1)
...但是在进行3D透视编程时,世界坐标为+ 1 / -1。
说谁?也许你指的是剪辑空间,但这只是一个特殊空间,其中所有坐标都在投影之后。
你世界单位可能是任何东西。相关部分是如何预测的。假设您的透视投影为90°FOV,近剪裁平面为0.01,远剪裁平面为10.0,二次方面(为简单起见)。然后你的世界视图体积将解析一个边长为0.01和0.01的矩形,靠近观察者,并且在0.02边长的距离内伸展到10.0。减少FOV,横向长度相应缩小。
然而,大约0.01到10范围内的坐标被投射到+/- 1剪辑空间。
因此,您需要选择投影限制以匹配您的场景和所选单位。
答案 3 :(得分:0)
标准化窗口坐标范围始终为-1到+1。但它可以按照您的意愿使用。 假设我们想要一个范围-100到+100然后将实际坐标除以100.在这种情况下使用 函数glVertex2f或glVertex3f only。 例如glVertex2f(10 / 100,10 / 100)。