1

我正在使用以下内容使用 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只是一个包含顶点数组和索引数组的结构。

希望这可以帮助其他可能试图完成类似事情的人。

4

1 回答 1

1

它看起来像一个螺旋,因为您将纹理的左上角设置在Vector2(0,0)“圆圈”的中心,这是错误的。您需要将其设置在圆圈左上角切片的左上角顶点,因为 UV 贴图的 0,0 是纹理的左上角。

我认为您需要为上顶点设置 (0.5, 0),为右顶点设置 (1, 0.5),为下顶点设置 (0.5, 1),为左顶点设置 (0, 0.5),或者类似的东西,以及其他人使用一些三角函数。
你的圆心必须是Vector2(0.5, 0.5)

关于三角函数,我认为你应该做这样的事情。
圆心的 UV 值为Vector2(0.5, 0.5),而对于其他点(假设序列的第二个点正好位于中心,UV 值为Vector2(1, 0.5)),请尝试以下操作:

vertices[i] = new VertexPositionTexture(new Vector3(newX, newY, 0), new Vector2(0.5f + radius * (float)Math.Cos(delta), 0.5f - radius * (float)Math.Sin(delta)));

我刚刚在 for 循环中编辑了你的第三行。这应该为您提供每个点所需的 UV 坐标。但愿如此。

于 2013-08-14T14:36:14.143 回答