【问题标题】:How to find the appropriate rotation of a pentagon for fitting into a LibGDX hex-tessellated sphere?如何找到合适的五边形旋转以适合 LibGDX 六角镶嵌球体?
【发布时间】:2015-07-02 13:48:11
【问题描述】:

我今天有一个棘手的问题,涉及很多向量。我试图让他们保持直截了当。我有的是这个形状(主要是 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 的模型构建器绘制三角形来填充这些五边形。我认为这比定位.objs 的性能要差。想法?

【问题讨论】:

    标签: vector libgdx geometry transform


    【解决方案1】:

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

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

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

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

    这有帮助吗?

    【讨论】:

    • 感谢您,这确实有帮助!这绝对是对如何获得我所追求的结果的超级清晰的描述。今晚我得试一试。我只是想知道,因为这有效地为每个五边形使用了 5 个三角形网格,所以我可能会在没有任何旋转数学的情况下获得完全相同的结果,只需让代码从我知道属于五边形的顶点渲染三角形。我需要对 LibGDX 性能进行更多挖掘,以确定使用网格是否真的很重要。
    • 哦,我刚刚想到了另一个小细节。可以找到十二面体面的哈密顿循环:参见mathworld.wolfram.com/HamiltonianCycle.html 中最右边的图(十二面体的面对应于二十面体的顶点)。该图上的每条边都对应于 A 和 B 旋转的某种组合;假设第一条边是 B,第二条边是 A,第三条边是 AAB,依此类推,这给出了一个旋转序列,将在 12 次移动中覆盖十二面体(一旦你计算了旋转)。不是很重要,但它很整洁。
    • 这很好!我决定现在尝试实施此解决方案。关于“轴由连接两个中心的线段的中点确定”,我遇到了一些困惑。我有我的中点,但我如何用它做一个轴?这条轴线通过这个点的方向是什么?
    • 在数学意义上,轴是由原点和中点决定的。但是,我认为大多数指定旋转的方法都需要轴的归一化点,而不是任何旧点。所以你应该通过除以它的范数(长度)来“标准化”这个点。即,如果中点为(m.x,m.y,m.z),则归一化点为(m.x/N,m.y/N,m.z/N),其中N=sqrt(m.x^2+m.y^2+m.z^2)。一旦你有了归一化点,你就可以将旋转表示为四元数、轴/角度或其他。围绕五边形中心的旋转也是如此。
    • 谢谢,我想我明白了。问题是,看起来我以错误的方式围绕该点旋转。例如,五边形围绕该点摆动 180 度,就好像它是旋转木马的中心一样,但看起来我需要将五边形向上摆动 180 度并越过该点,就好像它是弹射器一样。有什么想法可以解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多