所以我正在学习openGL,我发现很奇怪的一件事就是摄像机停留在原点并向同一方向看。要实现相机移动和旋转,您必须移动和旋转整个世界而不是相机。
我的问题是,为什么你不能移动相机? directx是否允许您移动相机?
答案 0 :(得分:5)
这是一个有趣的问题。我认为当你谈论固定相机时,答案取决于你的意思。
事实上,不是说openGL有一个固定的摄像头,我宁愿说在openGL中根本没有任何摄像头。
另一方面,我不同意你对openGL API移动或旋转世界的解释。
相反,我会说openGL API根本不会移动或旋转世界。
我认为openGL API中没有任何相机概念的原因是因为它不是一个高级抽象层,而是与显示计算机图形的计算必然性有关。
正如我建议您主要谈论显示三维场景,这意味着将3D顶点数据转换为2D光栅图像。
对于渲染的每一帧,这涉及变换将场景中每个顶点的三维坐标转换为屏幕上相应的二维位置。
由于每个顶点必须放置在屏幕上的正确位置,如果你在概念上移动类似于相机的东西或只是移动整个世界,它就不会产生任何计算差异,你必须做同样的事情尽管如此。
计算屏幕顶点“正确”位置所涉及的数学可以通过一个称为矩阵的数学对象来描述,当应用时(用于此应用的数学术语是矩阵乘法)到3-D数据将得到所需的2D屏幕坐标。
基本上在渲染三维场景时会发生什么 - 无论是否存在任何相机 - 是每个顶点都由一些变换矩阵处理,留下顶点的原始三维数据完好。
由于3-D顶点数据根本没有改变,我会说openGL根本不会移动或旋转世界,但这种“观察”可能取决于观察者的观点。
事实上,在不改变三维顶点数据的情况下保持三维顶点数据的完整性对于防止三维场景由于累积的舍入不准确而变形至关重要。
我希望我可以通过表达我对openGL API中何时或为何会移动的人的意见来提供帮助。
即使我无法为你提供服务,使用openGL API也没有涉及任何动词,不要忘记它根本没有任何重量,因此移动它不应该太痛苦。
顺便说一句。不要费心去研究你问题中提到的专有库,并继续依赖开放标准。
答案 1 :(得分:2)
移动世界和移动相机有什么区别?数学上......没有;无论哪种方式都是相同的数字。这都是透视问题。只要你正确编码你的相机抽象,如果你不想,你不必将它想象为移动世界。