目前,为了将苍蝇从一个位置移动到另一个位置,我正在使用它:
DirectionNormalized = (positionTarget - position).Normalize;
和
position += DirectionNormalized *
vitesseP2P *
(float)gameTime.ElapsedGameTime.TotalMilliseconds;
所以,苍蝇飞行(笑话:完成)从A点到B点到C点到D点等等。
但我想弯曲它的轨迹。 这太不可思议了,我觉得这很容易,但我被困了几个小时。
希望你能提供帮助。答案 0 :(得分:3)
实现这一目标的最常见方法是使用贝塞尔曲线。 Bezier算法采用一组点 - 两个终点和一些控制点 - 并在沿着由这些点定义的曲线的不同位置处产生一系列点。
Bezier算法的广义形式是迭代缩减,但我们可以针对特定的4点情况展开它并生成BezierInterpolate
函数,如下所示:
public static Vector2 BezierInterpolate(Vector2 p0, Vector2 p1, Vector2 c0, Vector2 c1, float fraction)
{
// first stage, linear interpolate point pairs: [p0, c0], [c0, c1], [c1, p1]
Vector2 p0c0 = Vector2.Lerp(p0, c0, fraction);
Vector2 c0c1 = Vector2.Lerp(c0, c1, fraction);
Vector2 c1p1 = Vector2.Lerp(c1, p1, fraction);
// second stage, reduce to two points
Vector2 l = Vector2.Lerp(p0c0, c0c1, fraction);
Vector2 r = Vector2.Lerp(c0c1, c1p1, fraction);
// final stage, reduce to result point and return
return Vector2.Lerp(l, r, fraction);
}
这将为您提供沿曲线的某个分数的点的位置。例如,如果您有动画的开始和结束时间,则可以使用上面的内容生成飞行的当前位置。
首先,您需要定义控制点。我会用这样的东西:
static System.Random prng = new System.Random();
public static Vector2 genControlPoint(Vector2 l, Vector2 r)
{
// get a random angle between +/-(15..90) degrees off line
float angle = (float)((((prng.NextDouble() * 5) + 1) / 12) * Math.PI * (prng.Next(0, 2) * 2 - 1));
// create rotation matrix
Matrix rot = Matrix.CreateRotationZ(angle);
// get point offset half-way between two points
Vector2 ofs = Vector2.op_Multiply(Vector2.op_Subtract(l, r), 0.5);
// apply rotation
ofs = Vector2.Transform(ofs, rot);
// return point as control
return Vector2.op_Add(l, ofs);
}
....
Vector2 p0 = FlyStartPoint();
Vector2 p1 = FlyEndPoint();
// generate randomized control points for flight path
Vector2 c0 = genControlPoint(p0, p1);
Vector2 c1 = genControlPoint(p1, p0);
此时你有一组四个点适合作为前4个参数传递给BezierInterpolate方法,从中可以确定特定时间“飞行”的位置。
Bezier曲线开始可怕,但一旦你了解它们,它们就是有用的工具。当我在这里手动完成时,您可以在致电Vector2.Hermite
或Vector2.CatmullRom
时更加了解后台实际发生的情况。
答案 1 :(得分:0)
您可以沿该样条曲线计算样条曲线和位置(随时间变化)。
请参阅http://www.c-sharpcorner.com/UploadFile/apundit/DrawingCurves11182005012515AM/DrawingCurves.aspx
另一种方法是使用物理引擎。你可以给你的苍蝇一个质量和速度,并通过改变它的速度来应用运动的变化。
答案 2 :(得分:0)
Xna框架有一个内置的Curve类来做这件事。
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve.aspx
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.curve(v=XNAGameStudio.35).aspx
可在此处找到带代码的示例:
http://msdn.microsoft.com/en-us/library/bb203908.aspx
他们甚至创建了一个特殊的曲线编辑器,可以轻松地将曲线插入代码中: http://xbox.create.msdn.com/en-US/education/catalog/utility/curve_editor