6

我正在撕扯我的头发,试图弄清楚什么似乎是一个非常简单的问题。我知道很多这些东西都被切题地讨论过,所以如果这涉及到覆盖良好的地面,我深表歉意,但我找不到任何特定于我的解决方案的东西(相信我,我已经看过了)。

基本上我想沿着预定义的弯曲路径拖动对象/精灵(不仅仅是移动它,而是拖动它)。想想 iPhone 的“滑动解锁”功能,但不要只是从左到右拖动滑块,而是将路径设为弧线或波浪线。

我的基本想法是:

  • 定义贝塞尔路径,将对象设置在起点。
  • 如果对象被触摸,请在 touchesMoved(或一些类似函数)中检查贝塞尔路径上的命中检测。如果触摸停留在路径上,则沿着路径前进精灵直到路径结束(在这种情况下,任务完成)或用户的手指离开路径(在这种情况下,对象应该回到起点)。

这一切都不是微不足道的(至少,看起来是这样)。例如:

  • 在 Bezier 路径上进行命中检测是一件非常痛苦的事情,因为您实际上需要在描边部分而不是填充部分上进行检测。即便如此,我似乎也无法在任何宽度的路径上找到一种方法——只能在贝塞尔曲线的 1 点宽路径上。
  • 沿着路径部分移动对象似乎是不可能的:所有动画方法都沿着整个路径移动精灵。此外,这样做需要您找到最接近用户触摸的路径上的点,如果您曾经查找过,这涉及到极其复杂的数学运算。
  • 我想过使用刚体来占据除了路径之外的所有空间,所以物体只能在路径中移动。然而,这需要定义弯曲刚体,其中一些必须是凹的。死路。

我做这太难了吗?好像没那么复杂。我不需要一个完整的解决方案,只需要一种新的方式来思考这个问题并朝着正确的方向前进。任何帮助将非常感激。

4

2 回答 2

2

这个怎么样?

  • 考虑贝塞尔路径的 X 轴。
  • 每次用户点击或与屏幕交互时,只需查看触摸的 x 部分
  • 将该 X 坐标映射到您的路径并将对象移动到正确的位置。
于 2011-05-24T17:53:34.350 回答
0

是的,你让这太难了。

如果它适用于上面建议的简化(或沿着圆、线等),或者如果你真的想针对贝塞尔曲线进行简化,请考虑以下几点:

  1. 看看贝塞尔曲线的定义
  2. 您正在寻找的是从当前位置 P 和触摸位置 D 的变化定义一个新的对象位置 P'。
  3. 如果您根据 t 重新表述原始 P(x,y)(贝塞尔曲线是参数化的),那么问题就变成了根据 D 找出要添加的 t 偏移量。
  4. 涉及 P 处贝塞尔函数 fn 的微分可能是一个很好的方法。即,如果曲线只是一条从 P 点沿曲线而来的直线,则将增加多少 t。

编辑:段之间的转换:如果每个段在 [0,1) 中有 t,那么您可以检测到 t >= 1 并移动到下一段,将 P 设置为前一段的末尾,然后再次评估移动与那一点的关系。如果您有很多小点等,可能必须涉及一些启发式方法。

于 2011-05-24T18:30:46.873 回答