Actionscript 3 箭的轨迹

Actionscript 3 箭的轨迹,actionscript-3,flash-cs5,Actionscript 3,Flash Cs5,我正在做一个飞箭的模拟,但它看起来不太自然 以下是一个屏幕截图: 正如你所看到的,arrow movieclip的锚在箭头的前面,但是如果我把它换到中间,它看起来仍然不完美,有人有过类似的经验吗 这也是我的代码: //... //'math' isn't the default 'Math' class, it calculates some physics stuff. private function updateArrow() { var y0:

我正在做一个飞箭的模拟,但它看起来不太自然

以下是一个屏幕截图:

正如你所看到的,arrow movieclip的锚在箭头的前面,但是如果我把它换到中间,它看起来仍然不完美,有人有过类似的经验吗

这也是我的代码:

//...
//'math' isn't the default 'Math' class, it calculates some physics stuff.

private function updateArrow()
        {
            var y0:Number = 50;
            var v:Number = 100;
            var angle:Number = math.getRadians(45);

            if(!arrowstartposition)
            {
                arrowstartposition = activearrow.x;
                arrowdistance = math.calcDistance(y0,v,angle);
            }

            var currentdistance:Number = Math.abs(activearrow.x - arrowstart);

            if(currentdistance <= arrowdistance)
            {
                var currentvelocity:Number = math.calcVelocity(currentdistance, v, angle);
                var addvalue:int = 1; //Math.round(currentvelocity / 4);

                activearrow.x += addvalue;
                currentdistance += addvalue;

                var arrowheight:Number = math.calcHeight(currentdistance,y0,v,angle);
                var vx:Number = v * Math.cos(angle);
                var vy:Number = - (v * Math.sin(angle) - 9.81 * (currentdistance / arrowdistance) * math.calcTimeOfFlight(y0, v, angle));
                var currentangle:Number = Math.atan2(vy,vx);

                activearrow.y = y0 - arrowheight;
                activearrow.rotation = math.getDegrees(currentangle);
            }
            else
            {
                arrowstart = undefined;
                arrowdistance = undefined;
                activearrow = null;
            }
        }
/。。。
//“math”不是默认的“math”类,它计算一些物理内容。
私有函数updateArrow()
{
变量y0:数值=50;
变量v:数值=100;
变量角度:数字=数学。获取弧度(45);
如果(!箭头起始位置)
{
arrowstartposition=activearrow.x;
箭头距离=数学计算距离(y0,v,角度);
}
var currentdistance:Number=Math.abs(activearrow.x-arrowstart);

如果(currentdistance我认为你的重心不在。箭头不会在箭头重心所在的位置。否则它不会飞得很好。箭头的重心将与飞行抛物线相切。因此它将围绕重心旋转。尝试将其向中心移动更多箭头的r将开始看起来更自然。如果你仍然有问题。试着扔一块石头,让它看起来自然。然后再加上箭头。如果它看起来像石头一样好,那么看起来像箭头一样坏。你知道运动是正确的,但箭头关闭了。

一个问题是你的轨迹太抛物线了。正确的轨迹是对箭头的每一部分使用矢量可以更好地建模。头部和硬木将经历重力和较小的风阻,轴的影响在很大程度上可以忽略,而Fletch将经历一定的升力。因此,基于9.81的简单抛物线无法正确建模。此外,阻力是一个连续体“速度是一个非常复杂的函数。@哈里斯博士,但如果曲线是一个完美的抛物线,即使它不是物理上最精确的曲线,它的形状看起来也是最自然的。当然是这样,但他声称正在进行模拟。模拟通常把精确性置于效果之上。我把它改成了一块“石头”,似乎它有问题e速度。您是在每帧添加一个常量值,以便水平轴表示时间单位,还是基于当前速度添加一个值。(如
currentvelocity/4
)为了获得更自然的运动,你需要加速和减速。而不是使用恒定的速度,你需要随时间改变它。当箭头向上移动时,它受到重力的影响越来越大,直到它到达抛物线的高度,在那里它改变方向并落回地球。因此,走出大门,你需要一个很薄的Vy0g非常快,在每一帧上,你将添加-9.81 m/s^2/帧速率,因为帧速率单位是帧/秒。横轴是X方向,纵轴是Y方向。-9.81将影响Y方向,当它击中一个实心物体时停止;//初始速度Vx=Vx0;//这些也将通过一些幂*sin计算得出/cosθ,其中θ是起始角,而(静止空气){Vy=Vy-9.8/帧速率;Vx=Vx+风速;}