设计放置在OpenGL世界空间中的对象时,世界空间坐标如何与相应的对象/模型一起存储?
为了简单起见,我一直在使用Wavefront Object文件,而且我听说过Collada但是我们还没有找到任何标准方法来保存世界空间,就像设计游戏一样水平。
我是OpenGL的新手。
答案 0 :(得分:1)
世界空间坐标如何与相应的对象/模型一起存储?
但是你喜欢。
OpenGL不处理数据管理。这完全取决于你。
答案 1 :(得分:1)
通常他们不是。物体大多是在自己的空间中设计的。它们在“世界”中的位置是通常表示为矩阵的变换(平移,旋转)的结果。
例如,如果查看Collada规范,您将看到场景是节点的层次结构(DAG)以及可能的平移,旋转,缩放或倾斜。我不认为这种层次结构(或场景描述)在OBJ格式中是可表达的。
总而言之,它与OpenGL没什么关系。
答案 2 :(得分:1)
世界位置,旋转和比例始终可以定义为4x4矩阵,但如果您只是将其存储在一个矩阵中,它会丢失一些信息。因此,三个矩阵分开存储,如下所示:
W = Translation * Rotation * Scale
with
[ 1 0 0 x ]
[ 0 1 0 y ]
[ 0 0 1 z ]
T = [ 0 0 0 1 ]
[ r r r 0 ]
[ r r r 0 ]
[ r r r 0 ]
R = [ 0 0 0 1 ]
[ sx 0 0 0 ]
[ 0 sy 0 0 ]
[ 0 0 sz 0 ]
S = [ 0 0 0 1 ]
旋转很难仅存储在单个矩阵中。因此,大多数情况下,我们使用Quaternion来存储旋转,因为它更容易理解它的作用并符合更好的计算。关于gimbal locks (movie),我可以解释很多,但您可能需要reference guide for matrices和包含这些数据类型的好openGL math library。
由于OpenGL不是一个可以使用的基本GameObject引擎,你必须自己创建该类(假设这里是OOP)。将世界数据存储在这些对象中,并以适当的顺序绘制它们。您不应该将世界数据保存到3D模型中,因为您可以实例化同一模型的多个对象(看起来相同的多个敌人)。
这是一个tutorial,向您展示如何创建基本引擎。