gpt4 book ai didi

c# - XNA 顶点法线计算不适用于立方体

转载 作者:行者123 更新时间:2023-11-30 17:04:33 26 4
gpt4 key购买 nike

我有一个函数可以恰到好处地计算大多数基元的顶点法线。但它似乎不能处理立方体。

当我尝试漫反射光着色器时,它给出了这个结果(右侧相同)

Cube Diffuse Light Shader

这是我计算法线的代码:

public virtual void GenerateNormals()
{
for (int i = 0; i < vertices.Length; i++)
vertices[i].Normal = new Vector3(0, 0, 0);

for (int i = 0; i < indices.Length / 3; i++)
{
Vector3 firstvec = vertices[indices[i * 3 + 1]].Position - vertices[indices[i * 3]].Position;
Vector3 secondvec = vertices[indices[i * 3]].Position - vertices[indices[i * 3 + 2]].Position;
Vector3 normal = Vector3.Cross(firstvec, secondvec);
normal.Normalize();
vertices[indices[i * 3]].Normal += normal;
vertices[indices[i * 3 + 1]].Normal += normal;
vertices[indices[i * 3 + 2]].Normal += normal;
}

for (int i = 0; i < vertices.Length; i++)
if (vertices[i].Normal != Vector3.Zero) vertices[i].Normal.Normalize();
}

立方体的顶点是这样生成的:

Vector3[] vectors = new Vector3[8];

vectors[0] = new Vector3(-1, 1, -1);
vectors[1] = new Vector3(1, 1, -1);
vectors[2] = new Vector3(-1, 1, 1);
vectors[3] = new Vector3(1, 1, 1);
vectors[4] = new Vector3(-1, -1, -1);
vectors[5] = new Vector3(1, -1, -1);
vectors[6] = new Vector3(-1, -1, 1);
vectors[7] = new Vector3(1, -1, 1);


vertices = new VertexPositionNormalColored[24];

//Top
vertices[0].Position = vectors[0];
vertices[0].Color = TopColor;
vertices[1].Position = vectors[1];
vertices[1].Color = TopColor;
vertices[2].Position = vectors[2];
vertices[2].Color = TopColor;
vertices[3].Position = vectors[3];
vertices[3].Color = TopColor;

//Bottom
vertices[4].Position = vectors[4];
vertices[4].Color = BottomColor;
vertices[5].Position = vectors[5];
vertices[5].Color = BottomColor;
vertices[6].Position = vectors[6];
vertices[6].Color = BottomColor;
vertices[7].Position = vectors[7];
vertices[7].Color = BottomColor;

//Left
vertices[8].Position = vectors[2];
vertices[8].Color = LeftColor;
vertices[9].Position = vectors[0];
vertices[9].Color = LeftColor;
vertices[10].Position = vectors[6];
vertices[10].Color = LeftColor;
vertices[11].Position = vectors[4];
vertices[11].Color = LeftColor;

//Right
vertices[12].Position = vectors[3];
vertices[12].Color = RightColor;
vertices[13].Position = vectors[1];
vertices[13].Color = RightColor;
vertices[14].Position = vectors[7];
vertices[14].Color = RightColor;
vertices[15].Position = vectors[5];
vertices[15].Color = RightColor;

//Back
vertices[16].Position = vectors[0];
vertices[16].Color = BackColor;
vertices[17].Position = vectors[1];
vertices[17].Color = BackColor;
vertices[18].Position = vectors[4];
vertices[18].Color = BackColor;
vertices[19].Position = vectors[5];
vertices[19].Color = BackColor;

//Front
vertices[20].Position = vectors[2];
vertices[20].Color = FrontColor;
vertices[21].Position = vectors[3];
vertices[21].Color = FrontColor;
vertices[22].Position = vectors[6];
vertices[22].Color = FrontColor;
vertices[23].Position = vectors[7];
vertices[23].Color = FrontColor;

还有这样的索引:

indices = new int[36];

//Top
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 2;
indices[4] = 3;
indices[5] = 1;

//Back
indices[6] = 16;
indices[7] = 17;
indices[8] = 18;
indices[9] = 18;
indices[10] = 19;
indices[11] = 17;
//Left
indices[12] = 8;
indices[13] = 9;
indices[14] = 10;
indices[15] = 10;
indices[16] = 11;
indices[17] = 9;
//Front
indices[18] = 20;
indices[19] = 21;
indices[20] = 22;
indices[21] = 22;
indices[22] = 23;
indices[23] = 21;
//Right
indices[24] = 12;
indices[25] = 13;
indices[26] = 14;
indices[27] = 14;
indices[28] = 15;
indices[29] = 13;
//Bottom
indices[30] = 4;
indices[31] = 5;
indices[32] = 6;
indices[33] = 6;
indices[34] = 7;
indices[35] = 5;

希望高手帮我解决。提前致谢!

最佳答案

你得到这个结果是因为两个不同三角形的顶点顺序不同。

在右手系统中,您的第一个三角形 {(-1,1,-1), (1,1,-1) , (-1,1,1)} 在顺时针顺序,而第二个 {(-1,1,1), (1,1,1) , (1,1,-1)} 是逆时针。

这些三角形的法线将有不同的方向。

关于c# - XNA 顶点法线计算不适用于立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17383614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com