所以我试图让玩家以波浪形图射出朝向鼠标的子弹。我可以让子弹以波浪形式移动(尽管不是我预测的那样),但不是朝向鼠标。
Vector2 BulletFun::sine(Vector2 vec) {
float w = (2 * PI) / 1000; // Where 1000 is the period
float waveNum = (2 * PI) / 5; // Where 5 is the wavelength
Vector2 k(0.0F, waveNum);
float t = k.dot(vec) - (w * _time);
float x = 5 * cos(t); // Where 5 is the amplitude
float y = 5 * sin(t);
Vector2 result(x, y);
return result;
}
现在速度并不是一个值得关注的问题,一旦我弄明白这一点,这不应该是一个太大的问题。我确实得到了一些角度变化,但它似乎是相反的,只有1/8圈。
我可能在某处错误地计算了某些东西。我只是了解波矢量。
我尝试了一些其他的东西,比如一维行波和另一件涉及通过vec
调整正常正弦波的事情。这或多或少有相同的结果。
谢谢!
编辑:
vec
是从玩家位置到鼠标点击位置的位移。返回是一个新的向量,经过调整以遵循波形模式,每次子弹接收和更新时都会调用BulletFun::sine
。
设置是这样的:
void Bullet::update() {
_velocity = BulletFun::sine(_displacement);
_location.add(_velocity); // add is a property of Tuple
// which Vector2 and Point2 inherit
}
答案 0 :(得分:3)
在伪代码中,您需要做的是:
waveVector = Vector2(travelDistance,amplitude*cos(2*PI*frequency*travelDistance/unitDistance);
cosTheta = directionVector.norm().dot(waveVector.norm());
theta = acos(cosTheta);
waveVector.rotate(theta);
waveVector.translate(originPosition);
那应该计算传统坐标系中的波矢,然后将其旋转到方向矢量的局部坐标系(方向矢量是局部x轴),然后相对于你的波矢量转换波波的所需原点位置或其他......
这将产生与
非常相似的功能Vector2
BulletFun::sine(Bullet _bullet, float _amplitude, float _frequency, float _unitDistance)
{
float displacement = _bullet.getDisplacement();
float omega = 2.0f * PI * _frequency * _displacement / _unitDistance;
// Compute the wave coordinate on the traditional, untransformed
// Cartesian coordinate frame.
Vector2 wave(_displacement, _amplitude * cos(omega));
// The dot product of two unit vectors is the cosine of the
// angle between them.
float cosTheta = _bullet.getDirection().normalize().dot(wave.normalize());
float theta = acos(cosTheta);
// Translate and rotate the wave coordinate onto
// the direction vector.
wave.translate(_bullet.origin());
wave.rotate(theta);
}