C# 如何在圆上使用XNA/Monogame VertexPositionTexture正确设置纹理位置
我使用以下方法使用VertexositionTexture创建一个圆: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 } 应用于它的纹理看起来不正确,它从中心向外螺旋。我试过其他一些方法,但都不能满足我的要求。我希望它只是围绕着圆圈扇动,或者从左上角开始,到右下角结束。基本上希望它更容易为它创建纹理 我知道在不使用网格的情况下有更简单的方法来实现这一点,
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)最终发生的是它在圆的中间形成一个正方形,然后从正方形的边缘到圆的边缘使用相同的像素。