繁体   English   中英

如何在 c++ 中创建 2D 左右移动?

[英]How to create 2D side to side movement in c++?

我正在尝试将 AI 宇宙飞船左右移动。 我想用 sin 可以解决这个问题,但我很挣扎。 到目前为止,这就是我所拥有的。 这只是将宇宙飞船永远向右移动,因为它在更新 function 中被调用,该更新被称为每一帧。 我只想让宇宙飞船向右移动一定量,然后向左移动,然后永远重复。 谢谢

m_velocity = Vector2D(200,0);
Vector2D friction = FRICTION * m_velocity;
m_velocity = m_velocity + friction * frametime;
m_position = m_position + m_velocity * frametime;

正如你所说,你可以使用正弦来做到这一点。

正弦 go 的值从-11

所以如果你想在x₁ x₁ 和x₂之间移动你的宇宙飞船,你必须缩放和翻译它:

x = (x₁+x₂)/2 + (x₂-x₁)/2 *sin(ωt)

第一项将正弦的中点移动到两个值之间的中点。

第二项缩放正弦的幅度,因此它恰好达到x₁x₂

ω是 angular 频率,用于衡量物体移动的快慢。

t是当前时间(从开始累积)。

如果您的m_velocity 2D 向量是您的 object 移动(转动)的方向并且您想要侧步,那么您可以简单地将向量转动 90 度。 在 2D 中它非常简单:

side1.x=+m_velocity.y;
side1.y=-m_velocity.x;
side2.x=-m_velocity.y;
side2.y=+m_velocity.x;

现在你有 2 个指向左右的向量(这取决于你的坐标系),所以只需缩放它以匹配你的侧速。

另一种选择是从您的速度中获取角度并使用 sin,cos:

ang = atan2(m_velocity.y,m_velocity.x) +/- (M_PI*0.5);
side.x=side_speed*cos(ang);
side.y=side_speed*sin(ang);

然而,这不太准确并且慢得多。 它在哪一边取决于+/-我还假设你的角度是弧度。 如果以度数改为将(M_PI*0.5)更改为90.0

但是,您正在使用没有加速的 Newton d'Alembert 集成。 将控制材料(推进器)应用于加速度而不是速度更现实......并且已经存储了ang角度或以变换矩阵或基向量的形式进行渲染。

有关更多信息,请参阅:

[Edit1] 所以你想要曲折的运动而不向前运动

尝试这个:

m_velocity = Vector2D(200*sin(2.0*M_PI*f*t),0);

其中f是以[Hz]为单位的运动频率, t是以[sec]为单位的经过时间

为了使其更容易出现舍入错误,请使用

m_velocity = Vector2D(200*sin(fmod(2.0*M_PI*f*t,2.0*M_PI)),0);

但是,即使在t饱和到无法递增的程度之后,这也不会好...

当与时间放在一起时:

static float ang=0.0;
m_velocity = Vector2D(200*sin(ang),0);
ang=fmod(ang+(2.0*M_PI*f*dt),2.0*M_PI);

其中dt是计时器的[sec]时间间隔或用于调用此代码的任何事件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM