如何找到适合 LibGDX 六边形镶嵌球体的五边形的适当旋转?

How to find the appropriate rotation of a pentagon for fitting into a LibGDX hex-tessellated sphere?

我今天有一个棘手的问题,涉及很多向量。我正在努力让他们保持正直。我有的是这个形状(主要是六边形和 12 个五边形):http://i.imgur.com/WDSWEcF.jpg

我想将 12 个五边形网格放置到它们的 12 个位置中。我首先在原点(该形状的中心)创建 12 个网格,然后使用以下代码旋转并将它们移动到位。

        for (int i = 0; i < 12; ++i) {
          Vector3 pentPoint = pentPoints.get(i); // The center of each pentagon.
          ModelInstance pent = pents.get(i);

          Vector3 direction = (pentPoint).cpy().sub(new Vector3(0, 0, 0))
                .nor();
          direction.set(direction.x, direction.y, direction.z);
          pent.transform.setToRotation(Vector3.Y, direction);
          pent.transform.setTranslation(pentPoint);}

现在,这几乎就是我所需要的。结果是:http://i.imgur.com/Ch5Jhb8.jpg。现在忘记缩放,您可以看到五边形旋转不正确。它不符合其插槽。我知道我可以根据每个五边形的一些 使用 pent.transform.rotate(Vector3.Y, *value*); 来修复此旋转。问题是,我不知道如何计算这个值应该是多少。

任何人都可以帮助我或指出一些资源吗?或者,我可以利用我知道形状中每个顶点的坐标这一事实,通过使用 LibGDX 的 ModelBuilder 绘制三角形来填充这些五边形。我认为这比定位 .objs 的性能要差。想法?

我对您使用的库一无所知,但也许我可以在几何方面提供帮助。一种方法是为其中一个五边形的 1/5 绘制网格。我建议你就地而不是原地这样做。您需要知道五边形的两个相邻顶点。由此,您可以轻松计算出五边形的中心(如果您愿意,我可以提供公式)。您现在拥有的三个点确定了一个三角形,该三角形是十二面体旋转组的 "fundamental domain"。如果您在基本域上有一个网格,它可以传播到您选择的五边形的其他 4/5,方法是围绕通过由五边形中心确定的原点的轴重复 72 度旋转。将该旋转称为 A。您可以用轴角、四元数等来表示它。

要将网格传播到图中的其他五边形,您只需要再旋转一次:180 度旋转,将您选择的五边形带到附近的另一个五边形。同样,如果您愿意,我可以给出轴的公式,但是如果您可以根据已有的信息找到第二个五边形的中心,则轴由连接两个中心的线段的中点确定。 (您可能必须归一化确定轴的点,具体取决于您表示旋转的方式。)调用关于该轴旋转 B 的 180 度旋转。

旋转 A 和 B 一起生成二十面体的整个 60 元素旋转组,这将允许您将基本域上的网格传播到图中的每个其他五边形。但是,如果您不小心,您可能会击中某些部分两次而其他部分则根本不会。我认为您可以按以下顺序进行:从基础领域开始。 4 A 填入第一个五边形面(我们称它为北极)。然后 B 将该五边形映射到相邻的五边形。 4 个以上的 A 将填满五边形的子午线。另一个B将子午线上的五边形带到另一条子午线上。 4 个以上的 A 将填充第二个子午线。最后另一个B会在第二条经线上绘制一个五边形到南极。

在此过程中所有五边形的方向都是正确的。

有帮助吗?