我對Windows Phone 7非常陌生。我正在編寫一個示例遊戲,我希望隨機移動圖像。在XNA中爲Windows Phone 7繪製貝塞爾路徑
在與我的一位朋友討論時,他告訴我使用Bezier路徑。我在網上搜索瞭解貝塞爾路徑概念。它看起來會適合我的解決方案。但我沒有找到任何可以做到這一點的示例代碼。
請幫我找到樣品。
我對Windows Phone 7非常陌生。我正在編寫一個示例遊戲,我希望隨機移動圖像。在XNA中爲Windows Phone 7繪製貝塞爾路徑
在與我的一位朋友討論時,他告訴我使用Bezier路徑。我在網上搜索瞭解貝塞爾路徑概念。它看起來會適合我的解決方案。但我沒有找到任何可以做到這一點的示例代碼。
請幫我找到樣品。
Bezier路徑是解決您的問題的有效方法,但我可能會建議使用Catmull-Rom樣條代替。實施起來非常方便,尤其是因爲XNA 已經包含了一個用於生成這樣的樣條函數的函數。它也更容易使用(每個控制點也是樣條曲線上的一個點)。
有問題的功能是Vector2.CatmullRom
(Vector3
也有版本,MathHelper
也有浮動版本)。你指定四點。其中的中間兩個對您的樣條有效。如果您需要兩點以上的點數,只需在移動時循環輸入(第二點變爲第一點,第三點變爲第二點,依此類推)。沿着路徑,amount
論點描述了你想要的位置。
貝塞爾曲線的簡單的抽籤,你可以使用這個(爲cubic Bezier curve):那麼,在更新
private Vector2 Bezier(int t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
var x = OrdinateX((float)t/100, p0, p1, p2, p3);
var y = OrdinateY((float)t/100, p0, p1, p2, p3);
return new Vector2(x, y);
}
private float OrdinateX(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
return (float)((Math.Pow((double)(1 - t), 3) * p0.Y) + (3 * Math.Pow((double)(1 - t), 2) * t * p1.X) + (3 * (1 - t) * (t * t) * p2.X) + ((t * t * t) * p3.X));
}
private float OrdinateY(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
return (float)((Math.Pow((double)(1 - t), 3) * p0.Y) + (3 * Math.Pow((double)(1 - t), 2) * t * p1.Y) + (3 * (1 - t) * (t * t) * p2.Y) + ((t * t * t) * p3.Y));
}
你必須把這個:
for (int t = 0; t <= 100; t++)
object.position = Bezier(t, new Vector(0, 0), new Vector(100, 100), new Vector(300,300), new Vector(0, 300));
但我認爲,更容易獲得曲線的方法是使用Catmull-Rom樣條,Andrew Russell如何寫。