识别立方体表面上的下一个点

时间:2013-12-05 12:12:26

标签: opengl-es 3d geometry vector-graphics

我有一个单位长度的立方体。立方体的每个面分为10 x 10个段。考虑一个大小等于移动通过立方体表面的段的对象。

我需要计算一种方法,在给定对象方向的情况下找到多维数据集中的下一个段。

4 个答案:

答案 0 :(得分:4)

我想简单地使用展平表示法。面部导航很简单。面部之间的导航可以使用“关系”地图轻松编码:

enter image description here

顺便说一句,你可以使用任何合适的网:

enter image description here

答案 1 :(得分:3)

根据您要执行的操作,您可以将位置和方向矢量表示/转换为单位球体上的球面坐标(即半径= 1),然后投影到立方体上。然而,投影可能会导致感知速度不稳定,但在您的情况下它可能会或可能不会令人反感。

例如,将球面位置坐标转换回carthesian,然后找出相关的立方体边和面坐标,如下所示:http://www.nvidia.com/object/cube_map_ogl_tutorial.html(请参阅将纹理坐标映射到立方体贴图面部分),然后可以捕捉到10x10段。

答案 2 :(得分:1)

您正在寻找的是Space filling curve。在它们的离散形式中,它们在(N-1)维中近似N维,因此如果你采用N = 2我们有一种方法来映射一个平面(或形成一个立方体网的6个平面)在1D(在一行中),可以建模为在线上取点的函数,并返回平面中的(x,y)位置。

你可以使用Hilbert CurvePeano Curve,因为它们都接近单位正方形但是前者的近似值在 2 的幂上升后者的权力为 3 ,因此两者都不会接近10个区段中的单位平方(您可以用Hilbert曲线近似8或16,或者用Peano曲线逼近9)。

显然,立方体的网不是一个完美的单位正方形,但这并不重要,因为你可以将每个面都视为一个单位正方形,然后一旦你到达一个近似的末尾,移动到下一个面多维数据集。

作为实现细节,您可以通过以下方式执行此操作:

  • 计算曲线必须走的总距离,对于您选择的特定近似值,近似整个单位平方:D
  • 将每个面((x,y)标记为0)的5偏移量存储在数组中:offsets(即offsets[0]是第一面)。
  • 循环显示间隔i <- [0..6*D)

    • 您当前正在映射的面孔可以显示为f = floor(i/D)
    • 通过该面的距离为d = i % D
    • 获取多维数据集中下一个点的(x,y)位置计算为

      (x,y) = offset[f] + space_filling_curve(d)
      

      其中space_filling_curve()是您选择的任何一条曲线的离散近似值,无论您选择哪种程度的近似值(只​​要它与您的D计算相符)。

我没有添加实现space_filling_curve()本身,因为我之前引用的关于Hilbert Curves的文章有一个很好的,直截了当的用C语言写的。

答案 3 :(得分:0)

立方体两侧的“内部”所有步骤都是微不足道的,物体可以采取8个方向,物体可能有一些惯性或其他算法说明它的前进位置。

使立方体边缘“跳跃”相对无痛的一种方法是将立方体的所有边建模为12x12正方形大(只是在立方体边缘外放置“额外的一行”正方形)并且有一些逻辑移动当对象位于一个正方形的外边缘时,该对象到右立方体边缘(这样,您可以保持移动对象逻辑与边缘检测脱钩)。 “跳到右边的正方形”应该是非常对称的,并且最好用一些方形纸发现。

问题中存在“奇点”,当您的对象想要在角落中移动NW时,它将在两个其他方格之间或反弹。或者选择一个相邻的正方形(随机或按照某种规则)。

有趣的问题!