C# 如何在圆上使用XNA/Monogame VertexPositionTexture正确设置纹理位置

C# 如何在圆上使用XNA/Monogame VertexPositionTexture正确设置纹理位置,c#,textures,xna-4.0,geometry,trigonometry,C#,Textures,Xna 4.0,Geometry,Trigonometry,我使用以下方法使用VertexositionTexture创建一个圆: public static ObjectData Circle(Vector2 origin, float radius, int slices) { /// See below } 应用于它的纹理看起来不正确,它从中心向外螺旋。我试过其他一些方法,但都不能满足我的要求。我希望它只是围绕着圆圈扇动,或者从左上角开始,到右下角结束。基本上希望它更容易为它创建纹理 我知道在不使用网格的情况下有更简单的方法来实现这一点,

我使用以下方法使用VertexositionTexture创建一个圆:

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圆(矢量2原点、浮点半径、整数切片)
{
VertexositionTexture[]顶点=新的VertexositionTexture[切片+2];
int[]索引=新的int[slices*3];
浮动x=原点x;
浮动y=原点y;
float deltaRad=MathHelper.ToRadians(360)/切片;
浮动增量=0;
float thetaInc=((float)Math.PI*2)/顶点.Length);
顶点[0]=新顶点曝光纹理(新向量3(x,y,0),新向量2(.5f,.5f));
浮动切片大小=1f/切片;
对于(int i=1;i
ObjectData
只是一个包含顶点数组和索引数组的结构


希望这能帮助其他可能尝试完成类似任务的人。

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

我认为您需要为上顶点设置(0.5,0),为右顶点设置(1,0.5),为下顶点设置(0.5,1),为左顶点设置(0,0.5),或者类似的设置,对于其他顶点,使用一些三角函数。
圆的中心必须是向量2(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坐标。我希望如此。

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

我认为您需要为上顶点设置(0.5,0),为右顶点设置(1,0.5),为下顶点设置(0.5,1),为左顶点设置(0,0.5),或者类似的设置,对于其他顶点,使用一些三角函数。
圆的中心必须是向量2(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坐标。我希望如此。

谢谢,我已经尝试了各种方法来解决问题。我想我实际上是在问三角学。你需要三角学方面的帮助吗?或者你自己能做吗?这就是我被困的地方,三角部分。我想我的问题应该更清楚一些。我在上面的答案中添加了一些信息。这有点帮助;事实上,;这是我最近的一次,我可能再也走不动了。我必须将其调整为:
float textX=0.5f+(radius*(float)Math.Cos(delta)/100f);浮点文本Y=0.5f+(半径*(浮点)数学Sin(δ)/100f)最后发生的是它在圆的中间形成一个正方形,然后使用从方块边缘到圆圈边缘的相同像素。谢谢,我已经尝试了各种各样的东西来让它正确。我想我实际上是在问三角学。你需要三角学方面的帮助吗?或者你自己能做吗?这就是我被困的地方,三角部分。我想我的问题应该更清楚一些。我在上面的答案中添加了一些信息。这有点帮助;事实上,;这是我最近的一次,我可能再也走不动了。我必须将其调整为:
float textX=0.5f+(radius*(float)Math.Cos(delta)/100f);浮点文本Y=0.5f+(半径*(浮点)数学Sin(δ)/100f)