【发布时间】:2011-11-09 22:15:25
【问题描述】:
在设计要放置在 OpenGL 世界空间中的对象时,世界空间坐标如何与其对应的对象/模型一起存储?
为了简单起见,我一直在使用 Wavefront Object 文件,我听说过 Collada,但还没有找到任何标准的方法来保存世界空间,就像设计游戏关卡时那样。
我对 OpenGL 很陌生。
【问题讨论】:
标签: opengl
在设计要放置在 OpenGL 世界空间中的对象时,世界空间坐标如何与其对应的对象/模型一起存储?
为了简单起见,我一直在使用 Wavefront Object 文件,我听说过 Collada,但还没有找到任何标准的方法来保存世界空间,就像设计游戏关卡时那样。
我对 OpenGL 很陌生。
【问题讨论】:
标签: opengl
世界位置、旋转和缩放始终可以定义为 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 不是一个引擎,它没有一些您可以使用的基本游戏对象,因此您必须自己创建该类(假设此处为 OOP)。将世界数据存储在这些对象中,并以适当的顺序绘制它们。您不应该将世界数据保存到 3D 模型中,因为您可以实例化同一模型的多个对象(多个看起来相同的敌人)。
这是一个tutorial,向您展示如何创建一个基本引擎。
【讨论】:
世界空间坐标如何与其对应的对象/模型一起存储?
随你喜欢。
OpenGL 不处理数据管理。这完全取决于您。
【讨论】:
通常他们不是。对象大多是在自己的空间中设计的。它们在“世界”中的位置是通常表示为矩阵的变换(平移、旋转)的结果。
例如,如果您查看 Collada 规范,您会发现场景是节点的层次结构(DAG)以及可能的平移、旋转、缩放或倾斜。我不认为这样的层次结构(或场景描述)可以用 OBJ 格式表达。
总而言之,它与 OpenGL 没有太大关系。
【讨论】: