2

所以我正在学习openGL,我觉得很奇怪的一件事是相机停留在原点并朝同一个方向看。要实现相机移动和旋转,您必须移动和旋转整个世界而不是相机。

我的问题是,你为什么不能移动相机?directx 是否允许您移动相机?

4

2 回答 2

6

这是个有趣的问题。我认为答案取决于您在谈论固定相机时的实际意思。

事实上,与其说openGL有一个固定的摄像头,我更愿意说openGL中根本没有任何摄像头。

另一方面,我不同意您对 openGL API 移动或旋转世界的解释。

相反,我会说 openGL API 根本不会移动或旋转世界。

我认为 openGL API 中没有任何相机概念的原因是,它并不是一个高级抽象层,而是与显示计算机图形的计算需求相关联。

正如我建议您主要讨论的是显示 3 维场景,这意味着将 3D 顶点数据转换为 2D 光栅图像。

对于渲染的每一帧,这涉及将场景中每个顶点的 3-D 坐标转换为它们在屏幕上对应的 2D 位置的变换。

由于每个顶点都必须放置在屏幕上的正确位置,因此如果您在概念上移动相机之类的东西或只是移动整个世界,则根本不会产生任何计算差异,尽管如此,您仍必须进行相同的转换。

计算屏幕上顶点的“正确”位置所涉及的数学可以通过称为矩阵的数学对象来描述,当应用于 3-D 数据时(用于此应用的数学术语是矩阵乘法)将导致所需的 2D 屏幕坐标。

所以本质上,在渲染 3-D 场景时发生的事情——不管是否有任何相机——每个顶点都由某个变换矩阵处理,而顶点的原始 3-D 数据保持不变。

由于 3-D 顶点数据根本没有改变,我会说 openGL 根本不会移动或旋转世界,但这种“观察”可能取决于观察者的观点。

事实上,保持 3-D 顶点数据完整而不更改它对于防止 3-D 场景由于累积的舍入误差而变形至关重要。

我希望我可以通过在 openGL API 中表达我对谁或什么移动谁或为什么移动谁的意见来提供帮助。

即使我不能说服你在使用 openGL API 时不涉及文字移动,也不要忘记它根本不加权任何东西的事实,所以移动它不应该太痛苦。

顺便提一句。不要费心调查您的问题中提到的专有库并继续依赖开放标准。

于 2013-02-09T07:26:03.430 回答
2

移动世界和移动相机有什么区别?数学上……没有;无论哪种方式,它都是相同的数字。这都是一个观点问题。只要您正确编码相机抽象,如果您不想这样做,您就不必将其视为移动世界。

于 2013-02-09T07:24:18.543 回答