C++ OpenGl更改坐标系的测量单位

C++ OpenGl更改坐标系的测量单位,c++,opengl,scaling,coordinate-systems,units-of-measurement,C++,Opengl,Scaling,Coordinate Systems,Units Of Measurement,我正在使用最新的蓝皮书学习OpenGL,我希望得到澄清。这本书说你可以使用任何测量系统作为坐标系,但是当你进行三维透视编程时,世界坐标是+1/-1 我想我有点困惑的地方是我想用英尺和英寸来建造我的世界,我想建造我房子的内部。我会使用translates(x(feet)、y(feet)、z(feet))、extra,还是有一些函数可以更改x、y世界坐标(例如,将默认值从-1/+1更改为(-20/20)。我知道openGl会将所有单位剩余的坐标都转换成 因此,我想我最大的知识差距是如何在OPenGL

我正在使用最新的蓝皮书学习OpenGL,我希望得到澄清。这本书说你可以使用任何测量系统作为坐标系,但是当你进行三维透视编程时,世界坐标是+1/-1

我想我有点困惑的地方是我想用英尺和英寸来建造我的世界,我想建造我房子的内部。我会使用translates(x(feet)、y(feet)、z(feet))、extra,还是有一些函数可以更改x、y世界坐标(例如,将默认值从-1/+1更改为(-20/20)。我知道openGl会将所有单位剩余的坐标都转换成


因此,我想我最大的知识差距是如何在OPenGL中对真实世界的对象(长度)进行建模以使其具有意义?

这是相对的。如果你将1个OPenGL单位设置为1米,然后在此基础上完美地构建所有对象,那么你就拥有了你想要的比例(即10米为10个openGL单位,1毫米为0.001个openGL单位

但是,如果您随后要引入一个设计为1 OpenGL单位=1英尺的模型,那么该对象最终将变得太大~3倍


当然,您可以在各种方法之间进行更改,但到目前为止,最好的方法是在将模型加载到引擎之前重新缩放模型。

好吧,这都是相对的。如果您将1个OpenGL单位设置为1米,然后在此基础上完美地构建所有对象,那么您就拥有了所需的缩放比例(即10米为10个openGL单位,1毫米为0.001个openGL单位

但是,如果您随后要引入一个设计为1 OpenGL单位=1英尺的模型,那么该对象最终将变得太大~3倍


当然,您可以在各种方法之间进行更改,但到目前为止,最好的方法是在将模型加载到引擎之前重新缩放模型。

我认为作者指的是透视图分割后出现的标准化坐标(设备坐标)

通常,在OpenGL中实际操作对象时,使用标准世界坐标,但不限于-1/+1。这些世界坐标可以是您喜欢的任何坐标,并通过与modelview和投影矩阵相乘,然后除以齐次坐标“w”,转换为标准化坐标


OpenGL将为您完成所有这一切(直到您进入着色器),因此不必真正担心规范化坐标。

我认为作者指的是在透视分割之后出现的规范化坐标(设备坐标)

通常,在OpenGL中实际操作对象时,使用标准世界坐标,但不限于-1/+1。这些世界坐标可以是您喜欢的任何坐标,并通过与modelview和投影矩阵相乘,然后除以齐次坐标“w”,转换为标准化坐标

OpenGL将为您完成所有这一切(直到您进入着色器),因此不必真正担心规范化坐标

…但是,在进行三维透视编程时,世界坐标为+1/-1

谁说的?也许你指的是剪辑空间,但这只是一个特殊的空间,所有坐标都在投影后

你的世界单位可以是任何东西。相关部分是如何投影的。假设你有一个90°FOV的透视投影,近剪裁平面为0.01,远剪裁平面为10.0,二次相位(为了简单起见)。然后,您进入世界的视图体积将解析一个边长为0.01和0.01的矩形,并以0.02边长延伸到距离为10.0的矩形。减小FOV,横向长度相应收缩

然而,大约在0.01到10范围内的坐标投影到+/-1剪辑空间

因此,由您选择投影限制,以匹配您的场景和选择的单位

…但是,在进行三维透视编程时,世界坐标为+1/-1

谁说的?也许你指的是剪辑空间,但这只是一个特殊的空间,所有坐标都在投影后

你的世界单位可以是任何东西。相关部分是如何投影的。假设你有一个90°FOV的透视投影,近剪裁平面为0.01,远剪裁平面为10.0,二次相位(为了简单起见)。然后,您进入世界的视图体积将解析一个边长为0.01和0.01的矩形,并以0.02边长延伸到距离为10.0的矩形。减小FOV,横向长度相应收缩

然而,在0.01至10.范围内的坐标投影到+/-1夹空间中


因此,您可以选择投影限制以匹配场景和选择的单位。

标准化窗口坐标范围始终为-1到+1。但可以根据需要使用。 假设我们想要一个从-100到+100的范围,然后将实际坐标除以100 仅限glVertex2f或glVertex3f功能。
e、 g.glVertex2f(10/100,10/100)。

标准化窗口坐标范围始终为-1到+1。但可以根据需要使用它。 假设我们想要一个从-100到+100的范围,然后将实际坐标除以100 仅限glVertex2f或glVertex3f功能。
e、 g.glVertex2f(10/100,10/100).

我会像这样缩放,说20/20=1 opengl单位,说我有5英尺长的东西,是5/20还是.25,然后手动这样缩放?我会像这样缩放,说20/20=1 opengl单位,说我有5英尺长的东西,是5/20还是.25,然后手动这样缩放?好吗,因此,如果我想建造一个20x20英尺的房间,我会把我的正方形设置成类似于grayFloorBatch.Begin(GL_TRIANGLE_STRIP,4);grayFloorBatch.Vertex3f(-10.0f,-.56f,-10.0f);grayFlo吗