【发布时间】:2014-12-20 21:53:32
【问题描述】:
我想在我的 3D 应用程序中为相机对象创建一个单独的类/原型。
据我了解,有一个 Model-View 矩阵,开发人员使用它来平移/旋转/使用其他任何 3D 对象的仿射变换,添加到场景中。
但是,我的相机不是什么网状的东西。 Camera 不需要有颜色,所以不需要片段着色器(当然,如果你不想将相机可视化为LINES,并在不同的相机之间切换,只是举例),那又如何我真的需要相机吗?
- 在 3 维向量 ( x, y, z ) 中的位置
- mat4 矩阵,它描述了位置和一些额外的向量分量,我将在顶点着色器中使用它们,并将用于相机的位置平移
- 一些用于移动相机的控件(我不想描述它的详细信息,但只是举例来说,假设我们将只使用键盘键来移动和旋转它)
所以,我的问题是……如果我们的 3D 场景的视口由 Model-View 矩阵表示,在该矩阵上任何对象都正在通过一些仿射变换进行处理。为相机对象创建一个特定的着色器程序是正确的,还是为场景对象定义这样一个着色器程序更正确,只是在一些draw方法/函数中将相机位置转换为Model-View矩阵,该矩阵保留在Scene 对象的属性?
我正在为我的项目使用 WebGL 库,但我认为一些 OpenGL 开发人员也可能会回答这样的问题,因为这两个库中的这些东西是相似的。
【问题讨论】:
-
这听起来不像是你不能用内置的 glTranslate 和 glRotate 做的事情。是否有一些特殊的原因你想在你的着色器中而不是在你的程序中做你的相机(不熟悉 webgl,它是 java 还是 javascript?)
-
@newObjekt 它是 JavaScript
-
@newObjekt WebGL 中没有任何仿射数学函数,如旋转或翻译,对于这样的目标,使用 WebGL/JavaScript 的人使用 mat4 库或手动实现这些数学函数。但这与问题无关。例如,我可以使用 C++ 和 OpenGL 而不是 WebGL 和 JavaScript。我记得OpenGL也不提供没有额外库的相机对象(如果你使用没有任何额外东西的普通API),所以如果你使用这种方式,你必须像我想的那样在C++中为Camera对象定义一个类。我说的对吗?
-
哦,不知道。那么一个好方法就是在你的顶点着色器中放置 2 个统一的 vec4。一个用于您的外观矢量,另一个用于您的世界空间坐标,并将它们应用于您的模型视图投影。这与 glRotate/glTranslate 的结果基本相同。
-
单个 GLSL 程序,没有。您通常在您使用的每个 GLSL 程序中应用您的相机转换。所以你的顶点着色器看起来对所有东西都相似。通常,我强烈建议您使用统一缓冲区对象来简化那些顶点着色器的设计(例如,绑定一次相机矩阵并在每个着色器中使用它们),但您使用的是 WebGL,所以这是不可能的。
标签: opengl opengl-es 3d webgl model-view