gpt4 book ai didi

actionscript-3 - 当给定角度和速度时,计算物体的轨迹

转载 作者:行者123 更新时间:2023-12-03 22:42:16 24 4
gpt4 key购买 nike

我正在尝试从大炮中发射一颗炮弹,并让它沿着现实的路径前进。开火角度根据大炮的方向而变化(自动定位到鼠标指针)。所以我想弄清楚的是,在给定角度和设定速度的情况下,如何沿着抛物线路径移动炮弹。

我读到这可以在没有复杂的三角函数的情况下完成(在高中时从未听过),并且可以通过在每个刻度上将重力添加到 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;
}
}
}

最佳答案

你需要一点物理知识。

初始速度必须使用您自己添加的一些标准来计算。一个示例是在按下鼠标时使用鼠标和大炮之间的距离来计算初始速度。距离越大,弹丸速度越大,距离越小,弹丸速度越小。

您添加一个类型为 ENTER_FRAME 的事件监听器。

我猜这是二维动画,所以你必须在任何时间点找到当前的 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·t

y = yo + vyo·t - 0.5·g·t^2

yo = 炮弹的初始高度

vyo = 初始 y 速度; vyo = vo·sin θ

t = 时间过去了,我们通过上层代码控制它

g = 地球表面的加速度 (9,81 m/s^2)

xo = 开始的初始距离

vxo = 初始 x 速度; vxo = vo·cos θ

现在在上面的代码中我们添加了这些等式,它应该看起来像这样:

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
}

这应该有效。我已经多次使用此代码,它既高效又简单。

关于actionscript-3 - 当给定角度和速度时,计算物体的轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com