我面临的问题如上图所示。基本上我想要的是在两个轨道之间创建一个流畅的弯道。位置B(下一个轨道的起点)是可变的,并确定应该绘制圆形轨道的哪个部分。我想要最终得到的是两条轨道,通过发射圆形部分,它们之间有一个流畅的弯曲。
注意:圆圈是一个单独的精灵,两条曲目也是如此。我只是想省略圆形精灵的一部分
我之前问了一个类似的问题,但我觉得如果没有照片就有点不清楚。 XNA: How can I draw only a "pizza slice" of my sprite?
有没有人知道如何实现这种效果?
答案 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
);