【问题标题】:AS3: Find distance of rotationAS3:查找旋转距离
【发布时间】:2011-09-20 13:34:38
【问题描述】:

我正在使用 TweenLite 旋转一个对象,但是我希望该持续时间基于旋转距离,而不是设置的持续时间,其中 180 度 = 3 秒 90 = 1.5 等等。

这是我寻找旋转距离的尝试:

var time:Number = Math.abs(Math.atan2(Math.sin(angle-wheelObj.rotation),Math.cos(angle-wheelObj.rotation)); 
TweenLite.to(wheelObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut, onComplete:rotateWheel, onCompleteParams:[target]});
TweenLite.to(carObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut});

这只是行不通,当旋转很小时时间有时很长,而当旋转很大时有时时间很短,所以有人知道更好的方法吗?

注意事项:

angle = 目标旋转

wheelObj.rotation = 当前旋转。

【问题讨论】:

  • 我真的不明白你的第一行 - 但你为什么不做一个var time = (angle-wheelObj.rotation)*timePerDegree
  • @pkyeck 因为角度可以大于或小于旋转(它也使用负角度和其他东西......非常奇怪)。

标签: flash actionscript-3 actionscript


【解决方案1】:
var speed:Number = 60; // 3 sec for 180 deg
var time:Number = Math.abs(angle - wheelObj.rotation) / speed;

您可以通过更改速度参数来设置持续时间。

注意:您可能需要将角度用作 (angle%360)

【讨论】:

  • 根据当前旋转的位置,这给了我 7 秒 + 10 - 20 度的旋转。如果我从另一侧补间,则大约需要 0.3 秒。
  • 应该是相反的,20 / 60 ~= 0.33 是对的。和 340 / 60 ~= 5.66。追踪您的目标角度和当前旋转。您可能对弧度和度数有疑问。
  • 我的角度以度为单位,旋转也是如此。很多角度都是正确的,但是在测试时大约有三分之一是错误的,这与以下事实有关那个公式
  • 如果它仍然无法正常工作,那是另一回事。影片剪辑旋转在 [-180,180] 之间。
  • 你的补间找到了最短的旋转边,你也必须找到它。像tagetAngle = 340 和currentAngle = 20,你的差异必须是40。时间是40/60=0.66
【解决方案2】:

如果有人感兴趣的解决方案:

var rotationSpeed:Number = 60;
var startAngle:Number = (angle < 0) ? (angle + 360) % 360:angle % 360;
var endAngle:Number = (wheelObj.rotation < 0) ? (wheelObj.rotation + 360) % 360:wheelObj.rotation % 360;
var distance:Number = (Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle) > (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle)) ? (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle) : Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle);
var time:Number = distance / rotationSpeed;
TweenLite.to(wheelObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut, onComplete:rotateWheel, onCompleteParams:[target]});
TweenLite.to(carObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut});

以下算法:

var distance:Number = (Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle) > (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle)) ? (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle) : Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle);

比较最大的角度 - 最小的角度与最小的角度 + 360 减去最大的角度,看看哪个更大,并将自己设置为答案。例如,

20 和 320

320 - 20 = 300 (20 + 360) - 320 = 40

这适用于任何两个角度(0 到 360 度之间)并且总是找到最短的路线。

【讨论】:

    【解决方案3】:

    我可能错了(我没有使用过这个库),但您似乎过于复杂了。你应该这样做:

    θ=W*t
    

    你 W 在哪里:

    W=2*pi/6
    

    所以你有:

    θ=pi*t/3 (rads) or
    θ=60*t (degrees)
    

    修正:对于最短角度,

    t= |θ| / 60 for θ < 180
    t= ( 180 - |θ| ) / 60 for θ > 180
    

    或者在你的情况下:

    var speed:Number = 60;
    var angle:Number = Math.abs(angle - wheelObj.rotation) % 360;
    if (angle > 180 ) {
         angle = 180 - angle;
    }
    var time:Number = Math.abs(angle)/speed;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2011-08-13
    相关资源
    最近更新 更多