-->

给定的角度,并且在闪光灯的速度时计算的对象,轨迹(Calculate a trajectory fo

2019-09-22 12:04发布

我试图从大炮发射炮弹,并跟随它一个现实的路径。 取决于大炮的取向火的角度发生变化(自动进行定向到鼠标指针)。 那么,我想弄清楚,是如何沿着抛物线轨迹,移动炮弹给定的角度,并设定速度时。

我读过,这可以无需复杂的三角来完成(从来不听它的高中),并可以通过增加重力的yVelocity每滴答简单地计算。 然而,在这一刻,我不知道如何计算初始yVelocity(再次,取决于大炮方向)。

:你可以在这里看到当前动画http://kate.ict.op.ac.nz/~welfajw1/portfolio/videos/task3-assignment2.swf

这是在AS3全部完成,和我的代码如下:

主时间轴代码:

import flash.display.*;
import flash.events.*;
import flash.geom.*;

var cannonball:ball_mc;
var angleDegree;

myCannon.addEventListener(Event.ENTER_FRAME, cannonEnterFrame);

function cannonEnterFrame(pEvt)
{
    var mc = myCannon;
    var mg = myCannon.myGun;

    //find angle for orientation
    var angleRadian = Math.atan2(mouseY - mc.y, mouseX - mc.x);

    //convert to degrees
    angleDegree = angleRadian * 180 / Math.PI;

    //limit rotation
    if(angleDegree > -63 && angleDegree < 20)
        mg.rotation = angleDegree;
}

stage.addEventListener(Event.ENTER_FRAME, stageRefresh);

function stageRefresh(pEvt)
{
    if (cannonball)
    {
        //move every "tick"
        cannonball.move();
    }
}

stage.addEventListener(MouseEvent.CLICK, mouseClicked);

function mouseClicked(pEvt)
{
    //starting position of the ball
    cannonball = new ball_mc(100, 475);

    //SEND IN INITIAL x, y VELOCITIES
    cannonball.fire(20, angleDegree);

    //add to stage
    stage.addChild(cannonball);
}

ball_mc代码:

package 
{

    import flash.display.MovieClip;
    import flash.sensors.Accelerometer;
    import flashx.textLayout.formats.Float;


    public class ball_mc extends MovieClip
    {
        //constant gravity
        public static const g:Number = 2;

        //starting velocities
        private var ux:Number;
        private var uy:Number;

        public function ball_mc(startX:int, startY:int)
        {
            x = startX;
            y = startY;
        }

        public function fire(vx:Number, vy:Number):void
        {
            ux = vx;
            uy = vy;
        }

        public function move():void
        {
            //distance moved in x dir
            var sx:Number = ux; 
            //new velocity in y dir
            var vy:Number = uy + g;
            //distance moved in y dir
            var sy:Number = uy + g/2;

            //apply movement
            x += sx;
            y += sy;

            //save new y velocity
            uy = vy;
        }
    }
}

Answer 1:

你需要物理一点点。

初速度必须用一些你在你自己添加的标准来计算。 一个例子是通过使用鼠标和大炮之间的距离,在按下鼠标的时间来计算初始速度。 如果距离大于弹丸将有更大的速度,而如果距离较小抛射将有较小的速度。

在您添加事件侦听器型ENTER_FRAME。

我想这是2维动画,所以你必须找到在任何时间点的当前x和y。

这里的代码一点点:

var TimeperFrame:Number = 1/fps //fps is not a constant, here you should add a number, a value that you previously added in fla. document properties. I usualy use 60 fps
var Time:Number = 0;

addEventListener(ENTER_FRAME, movingCannonBall);
function movingCannonBall(e:Event):void
{
   Time += TimeperFrame;
}

现在,这里是为炮弹的轨迹马术。

X = XO + VXO·吨

Y = I + vyo·吨 - 0.5·G·T ^ 2

哟=你的炮弹的初始高度

为y =初始速度; 为Vo·罪θ=

T =时间的流逝,我们conrol由上部代码

G =加速度(9,81米/秒^ 2)在地球表面

XO =用于启动初始距离

VXO =初始x速度; VXO = VO·COSθ

现在在上的代码,我们添加这些equitations,它应该是这样的:

var TimeperFrame:Number = 1/fps
var Time:Number = 0;
var initx: Number = cannonball.x;
var inity: Number = cannonball.y;
var initVelocity: Number = (you define initial Velocity by your criteria)
var G: Number = 9.81;

addEventListener(ENTER_FRAME, movingCannonBall);
function movingCannonBall(e:Event):void
{
   Time += TimeperFrame;
   cannonball.x = initx + Math.cos(angle) * initVelocity * Time;
   cannonball.y = inity + Math.sin(angle) * initVelocity * Time - G * Time * Time * 0.5
}

这应该工作。 我使用此代码很多次,这是effiecient,也很简单。



文章来源: Calculate a trajectory for an object, when given an angle and a velocity in flash