我是图形新手。我正在试验 OpenGL / JOGL。
我有一个正在渲染的 .obj 文件。我很难将它准确地放置在世界上我想要的位置。考虑到模型的运行时集大小,我有一架我希望它休息的飞机。仅仅做一个转换是不够的,因为我需要考虑模型的尺寸。
即使那样,我也不确定如何将 .obj 的参考系中的 0 转换为世界坐标系。
处理这个问题的惯用模式是什么?
对于简单的翻译(分步):
获取对象原点在世界坐标中的位置,并通过首先将原点乘以 -1 来创建一个平移矩阵:
1 0 0 -xo
0 1 0 -yo
0 0 1 -zo
0 0 0 1
这将移动对象,使其原点与世界原点重合。因此,取您希望对象停留在平面上的 y 值(假设 y 为“向上”)并将其添加到上面计算的向量中,这样您的矩阵就变为:
1 0 0 -xo
0 1 0 (-yo + yp)
0 0 1 -zo
0 0 0 1
这将意味着平面与对象相交(假设原点在对象内部的某处)。现在找到对象的边界框并从对象的原点获取最小 y 值:
+------+ ymax
| |
| |
| o |
| |
+------+ ymin
其中“o”是原点。
将其包含在矩阵中:
1 0 0 -xo
0 1 0 (-yo + yp + (yo - min))
0 0 1 -zo
0 0 0 1
我认为这应该把你的物体放在飞机上。自从我做这种事情以来已经有一段时间了,所以我可能会有一些错误的迹象 - 所以仔细检查数字并准备好进行实验。
您应该将模型的原点设置在它的脚下,大约。在它的重心之下。这样,当你缩放它时,它的位置(相对于地面)不会改变。
然后,只需将其平移到您想要的位置,然后旋转,然后缩放(按此顺序)-您就完成了。