我创建了一个Flash应用程序,其中有一个圆圈,沿着圆周绘制圆圈,当鼠标向上或向下移动时,它会旋转。直接从鼠标指针的y位置绘制旋转。我想做的是对运动进行评分,以便鼠标指针越向下移动对旋转的影响越小。
我目前的代码是这样的:
myCircle.rotationZ = e.localY;
我可以使用哪种形式的数学公式,这会减少旋转量,鼠标位置的y位置越大?
谢谢,
eb_dev
答案 0 :(得分:1)
嗯,这取决于你想要多快地衰减旋转角度。您可以简单地使用线性衰减。
rot = ((Rmax - Rmin) / (Ymax - Ymin)) * y + ((Rmin * Ymax) - (Rmax * Ymin)) / (Ymax - Ymin)
上面的表达式将根据从Ymax到Ymin的'y'值将旋转角度'rot'从Rmax线性地改变为Rmin。使用指数衰减可以做同样的事情。rot = a * y + b //(where a,b are constants)
first boundary condition
Rmax = a * Ymax + b
second boundary condition
Rmin = a * Ymin + b
Solve above 2 equations to find out a and b.
a = (Rmax - Rmin) / (Ymax - Ymin)
b = ((Rmin * Ymax) - (Rmax * Ymin)) / (Ymax - Ymin)
答案 1 :(得分:0)
有很多方法可以做你想要的。基本上听起来你正试图采用线性Y坐标并将其变成曲线。
像这样的东西可能会做你想要的(我在AS3有点生疏所以它需要一些调整,但它应该给你的想法 - YMMV):
var distance:Number = (Stage.Height - e.localY) / Stage.Height;
distance = distance * distance;
myCircle.rotationZ = distance * 2 * 3.1415927;
它将距离转换为0到1之间的数字,其中0位于底部,1位于顶部。
然后将距离从线性曲线调整为抛物线曲线。
最后,我们将值从范围0 - 1转换为0到2PI(旋转角度)。
答案 2 :(得分:0)
bhups是对的。这是指数版本 请不要害怕名称,阅读评论并访问维基百科以获得直观表示:)
var scale:int = 360;
var val:Number;
//从指数图中我选择了区间[-5,0]
//咨询http://en.wikipedia.org/wiki/Exponential_function,右上角的图片
//视角
/ *如果值为0,Math.exp将返回1;当降至-5时,它将返回
值越来越接近0
* /
var intervalMaxValue:Number = 0;
/ *警告!如果将intervalMaxValue更改为不同于0的值,则必须修改公式 * /
var intervalLength:Number = 5;
stage.addEventListener(Event.ENTER_FRAME,handlerEnterFrame);
function handlerEnterFrame(e:Event):void {
/ * intervalMaxValue-intervalLength - >我们从-5
开始1-(stage.mouseY / stage.stageHeight))* intervalLength - >并在鼠标停止时逐渐添加5到0之间的数字
Math.exp - >对于此间隔以0
结束,将其转换为介于0和1之间的值比例 - >将其乘以比例以获得完整的0-360间隔* /
val = Math.exp(intervalMaxValue-intervalLength +((1-(stage.mouseY / stage.stageHeight))* intervalLength))* scale;
myCircle.rotation = VAL;
}
答案 3 :(得分:0)
(来源:mathnstuff.com)
上图在x轴上从-4到4,很容易找出x = -5的y值 - 它几乎为0 - 所以请在阅读以下内容时考虑这一点。
请看上面的图表,它是指数函数的图表。看看x值从-5到0的增长情况如何?这不是一个线性增长,而是一个更大,更大的增长,而它达到0.这正是你动画所需要的。
val=Math.exp(intervalMaxValue-intervalLength+((1-(stage.mouseY/stage.stageHeight)) * intervalLength))*scale;
intervalMaxValue-intervalLength实际上是0-5,即-5
所以我们从-5开始!
下一步
stage.mouseY / stage.stageHeight = 0当你的鼠标位于舞台顶部时(因为stage.MouseY将为0)和1当鼠标位于舞台的底部时(stage.mouseY则相等)到stage.stageHeight所以你将stage.stageHeight除以stage.stageHeight,它将是1)
为了你的效果,你希望它被反转,当你在顶部时为1,当你在底部时为0,这就是你必须使用的原因(1-(stage.mouseY / stage.stageHeight))
现在,当鼠标位于顶部时,上面的公式返回1,当它位于底部时返回0(就像你希望它表现的那样,当它在顶部时是一个很大的旋转,当它到达底部时是一个小的旋转)
现在让我们只选择Math.exp部分,看看它的行为方式
val=Math.exp(intervalMaxValue-intervalLength+((1-(stage.mouseY/stage.stageHeight)) * intervalLength);
当你的鼠标位于TOP时,上面的公式将是-5 +((1-(0))* 5(< - 5这里是intervalLength);这将返回0.看看现在,对于x轴上的0,你在y轴上得到1。
现在让我们看看当鼠标处于BOTTOM -5+(1-(1))* 5时会发生什么。这将返回-5。对于x轴上的-5,y轴上的距离非常接近0,如上图所示。
让我们看看当鼠标处于MIDDLE -5+(1-(0.5))* 5时会发生什么。这将返回-5 + 2.5,这将是-2.5。对于x轴上的-2.5,你在y轴上更接近0而不是1.这是指数函数的作用。
正如您所看到的,在此区间[-5,0]上,指数函数会生成一个从0到1的y值,并且当该值接近x值0时,此值的增长会更大。
考虑到它生成一个从0到1的值,当它转到-5时会下降很多,你现在将这个值乘以360,这样你就可以得到一个角度值。
在TOP处,角度值为1 * 360;
MIDDLE:-2.5的Math.exp返回一个接近0.1的值,将其乘以360得到36.如果你将它与舞台TOP的360相比较你观察到它在鼠标时急剧下降到了中间。
BOTTOM:Math.exp为-5会返回一个非常接近0的值。与360相乘0并且没有角度移动。因此,当鼠标位于舞台底部时,旋转值非常接近0。
希望这很清楚,它是在一个晚上出去后的早上6:53写的
干杯。