在XNA中绘制一个圆片

时间:2014-07-16 21:33:49

标签: c# xna

Explanation of the problem

我面临的问题如上图所示。基本上我想要的是在两个轨道之间创建一个流畅的弯道。位置B(下一个轨道的起点)是可变的,并确定应该绘制圆形轨道的哪个部分。我想要最终得到的是两条轨道,通过发射圆形部分,它们之间有一个流畅的弯曲。

注意:圆圈是一个单独的精灵,两条曲目也是如此。我只是想省略圆形精灵的一部分

我之前问了一个类似的问题,但我觉得如果没有照片就有点不清楚。 XNA: How can I draw only a "pizza slice" of my sprite?

有没有人知道如何实现这种效果?

1 个答案:

答案 0 :(得分:2)

构建一个如下所示的三角形条。

o-o-o-       -o-o
|\|\|\ . . . \|\|
o-o-o-       -o-o

给定内半径r1,外半径r2,起始角度a,结束角度b,您可以按如下方式生成顶点。

r * [cos(t); sin(t)],    for r in {r1, r2}, t in [a, b]

按如下方式对顶点进行编号。

1-3-5-7-
|\|\|\|\ . . .
0-2-4-6-

然后给定顶点0, 1, ..., 2*N-1,三角形条带中的三角形对应于以下3元组的顶点索引。

  0     1     2
        1     2     3
              2     3     4
                    3     4     5
                          4     5     6
                                      .
                                            .
                                                  .
                                                2*N-3 2*N-2 2*N-1

由于此处有明显的重复和模式,XNA和图形通常将三角形条带的顶点索引编码为更紧凑的数组[0, 1, . . ., 2*N-1]

我会让你从那里找出问题的XNA特定部分。 Microsoft's example非常简单:

var N = 4;
var points = 2 * N;
var vertices = new VertexPositionColor[points];

for (int x = 0; x < points / 2; x++)
{
    for (int y = 0; y < 2; y++)
    {
        vertices[(x * 2) + y] = new VertexPositionColor(
            new Vector3(x * 100, y * 100, 0), Color.White);
    }
}

var indices = new short[points];

for (int i = 0; i < points; i++)
{
    indices[i] = i;
}

GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
    PrimitiveType.TriangleStrip,
    vertices,
    0,          // vertex buffer offset to add to each element of the index buffer
    points,     // number of vertices to draw
    indices,
    0,          // first index element to read
    points - 2  // number of primitives to draw
);