【发布时间】:2017-02-05 12:19:03
【问题描述】:
我需要一种方法来传递到这些坐标系,但我在数学上苦苦挣扎。
基本上我有一个“为 OpenGL”创建的网格,所以右手 XYZ 坐标系,我想将它加载到使用左手 XZY 坐标系的不同环境(虚幻引擎 4)中。
如果你仔细看,你会发现它是“镜像的”,蜘蛛的左腿与右腿互换了。此外,在图像中不是很清晰,但深度不够,我可以看到蜘蛛的“内部”(如果你注意到的话,眼睛会因此而丢失)。
现在,如果我用 -Y 交换每个顶点的 Y 坐标,我基本上会得到与原来相同的结果:
现在,我使用的网格格式具有对象层次结构,这意味着网格的一个子集可能有另一个子集作为父子集,如果是这样,它具有相对于与其关联的父级的位置和旋转矩阵。这意味着加载网格时会出现更多问题,因为旋转矩阵和位置也在错误的坐标系中定义。 为了应用这些更改,我创建了顶点,然后由这些顶点组成的对象,为其分配其父对象,然后应用旋转矩阵和位置。
以这个网格为例,用这种格式定义;组成它的所有各个部分都按照我描述的方式分层:
如果我按原样加载它,顶点、相对旋转矩阵和位置在错误的坐标系中,我会得到:
哪种看起来一样,只是它是沿轴“镜像”的。请注意图像最右侧的黄色物体(不知道如何称呼它):它位于原始图像中位置的相反侧。 此外,如果您查看文本“BROKK”(这不是纹理,它是由顶点组成的),它也会被反转。
现在,如果我应用与蜘蛛相同的技巧,将 Y 切换为 -Y,我会得到:
现在看起来没有镜像,但是机器的“手臂”全错了,可能是因为我将相对旋转矩阵和位置留在了它们的原始坐标系中?我试着惹他们,但我得到了各种奇怪的事情,没有任何解决办法。
我环顾四周,在坐标系之间切换我发现了不同的想法。我尝试在下面应用这个矩阵来切换轴并反转轴“向前”,但结果是疯狂的错误:
(1 0 0)
(0 0 1)
(0 -1 0)
我很无奈,你有什么想法吗?
编辑:感谢 Ripi2 的建议(仅将符号反转到 Z 坐标),我有点接近理想的解决方案。这是结果:
即使它是颠倒的(我稍后可以简单地旋转它),它也不再镜像了。尽管如此,在那张图片中,我只是反转了网格顶点和孩子位置的 Z 坐标。在图片中,除了手臂之外的所有部分都处于正确的方向,因为它们的旋转矩阵是单位矩阵。在手臂中,虽然旋转矩阵不是恒等式,但由于我将其保留在原始坐标系中,因此看起来完全错误。
我需要某种矩阵来乘以每个旋转矩阵,但我不知道是什么!
【问题讨论】:
-
你试过只改变 Z 符号吗?
-
感谢您的建议,我用结果编辑了原帖
标签: opengl matrix mesh coordinate-systems