iOS - 沿弯曲路径拖动对象

时间:2011-05-24 17:49:30

标签: iphone ios path bezier curve

我正在撕扯我的头发试图弄清楚什么似乎是一个非常容易的问题。我知道很多这些东西都被切向讨论过,所以如果这个问题出现在我的解决方案上,我会道歉,但我找不到任何具体的解决方案(相信我,我看过了)。

基本上我想沿预定义的弯曲路径拖动一个对象/精灵(不只是移动它,而是拖动它)。想想iPhone的“滑动解锁”的东西,但不要只是从左向右拖动滑块,而是使路径成为圆弧或波浪线。

我的基本想法是:

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

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

  • 在Bezier路径上进行命中检测是一种巨大的痛苦,因为您实际上需要在抚摸部分而不是填充部分进行。即便如此,我似乎无法在任何宽度的路径上找到方法 - 仅在Bezier的1点宽路径上。
  • 沿路径部分移动对象似乎不可能:所有动画方法都沿着ENTIRE路径移动精灵。此外,这样做需要你找到最接近用户触摸的路径上的点,如果你曾经看过这个点,那么数学就会非常复杂。
  • 我曾想过使用刚体占据除路径之外的所有空间,因此对象只能在路径中移动。然而,这需要定义弯曲的刚体,其中一些必须是凹的。死路一条。

我这太难了吗?它似乎并不复杂。我不需要一个完整的解决方案,只需要一种新的思考方式并朝着正确的方向前进。任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

这个怎么样?

  • 考虑你的bezier的X轴 路径。
  • 每次用户点击或与屏幕交互时,只需查看触摸的x部分
  • 映射X与您的路径坐标并将对象移动到正确的位置。

答案 1 :(得分:0)

是的,你这太难了。

如果适用,请采用上面建议的简化(或沿着圆圈,直线等),或者如果你真的想对贝塞尔曲线进行简化,请考虑以下内容:

  1. 查看贝塞尔曲线的定义
  2. 您正在寻找的是从当前位置P定义新的物体位置P'和触摸位置D的变化。
  3. 如果用t表示原始P(x,y)(贝塞尔曲线是参数),那么问题就是根据D找出要添加的偏移量。
  4. 涉及P的bezier fn差异的东西可能是一个很好的方法。也就是说,如果曲线只是从曲线上的P点开始的直线,那么会增加多少t。
  5. 编辑: 细分之间的转换: 如果每个段在[0,1)中具有t,那么您可以检测到t> = 1并继续前进到下一个段,将P设置为前一个段的末尾,并再次评估与该点相关的移动。如果你有很多小点等,可能需要一些启发式方法。