我正在使用以下内容使用 VertexPositionTexture 创建一个圆:
public static ObjectData Circle(Vector2 origin, float radius, int slices)
{
/// See below
}
应用到它的纹理看起来不正确,它从中心盘旋而出。我尝试了其他一些事情,但没有按照我的意愿去做。我希望它只是绕着圆圈扇动,或者从左上角开始,到右下角结束。基本上希望它更容易为它创建纹理。
我知道这是在不使用网格的情况下更简单的方法,但这不是我现在想要完成的。
由于 Pinckerman,这是最终工作的代码:
public static ObjectData Circle(Vector2 origin, float radius, int slices)
{
VertexPositionTexture[] vertices = new VertexPositionTexture[slices + 2];
int[] indices = new int[slices * 3];
float x = origin.X;
float y = origin.Y;
float deltaRad = MathHelper.ToRadians(360) / slices;
float delta = 0;
float thetaInc = (((float)Math.PI * 2) / vertices.Length);
vertices[0] = new VertexPositionTexture(new Vector3(x, y, 0), new Vector2(.5f, .5f));
float sliceSize = 1f / slices;
for (int i = 1; i < slices + 2; i++)
{
float newX = (float)Math.Cos(delta) * radius + x;
float newY = (float)Math.Sin(delta) * radius + y;
float textX = 0.5f + ((radius * (float)Math.Cos(delta)) / (radius * 2));
float textY = 0.5f + ((radius * (float)Math.Sin(delta)) /(radius * 2));
vertices[i] = new VertexPositionTexture(new Vector3(newX, newY, 0), new Vector2(textX, textY));
delta += deltaRad;
}
indices[0] = 0;
indices[1] = 1;
for (int i = 0; i < slices; i++)
{
indices[3 * i] = 0;
indices[(3 * i) + 1] = i + 1;
indices[(3 * i) + 2] = i + 2;
}
ObjectData thisData = new ObjectData()
{
Vertices = vertices,
Indices = indices
};
return thisData;
}
public static ObjectData Ellipse()
{
ObjectData thisData = new ObjectData()
{
};
return thisData;
}
ObjectData
只是一个包含顶点数组和索引数组的结构。
希望这可以帮助其他可能试图完成类似事情的人。