gpt4 book ai didi

c++ - OpenGL 计算法线(四边形)

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:48 25 4
gpt4 key购买 nike

我的问题是关于 OpenGL 和法线,我理解它们背后的数学原理,并且我取得了一些成功。

我在下面附加的函数接受一个交错的顶点数组,并计算每 4 个顶点的法线。这些代表具有相同方向的 QUADS。据我了解,这 4 个顶点应该共享相同的法线。只要他们面向同一方向即可。

我遇到的问题是我的 QUADS 使用对角渐变进行渲染,很像这样:Light Effect - 除了阴影在中间,光在角落。

我以一致的方式绘制四边形。 TopLeft、TopRight、BottomRight、BottomLeft,我用来计算法线的顶点是 TopRight - TopLeft 和 BottomRight - TopLeft。

希望有人能看到我犯的错误,但我已经花了几个小时来解决这个问题。

为了记录,我在我的对象旁边渲染了一个立方体和一个茶壶,以检查我的光照是否正常工作,所以我相当确定光照位置没有问题。

void CalculateNormals(point8 toCalc[], int toCalcLength)
{
GLfloat N[3], U[3], V[3];//N will be our final calculated normal, U and V will be the subjects of cross-product
float length;

for (int i = 0; i < toCalcLength; i+=4) //Starting with every first corner QUAD vertice
{
U[0] = toCalc[i+1][5] - toCalc[i][5]; U[1] = toCalc[i+1][6] - toCalc[i][6]; U[2] = toCalc[i+1][7] - toCalc[i][7]; //Calculate Ux Uy Uz
V[0] = toCalc[i+3][5] - toCalc[i][5]; V[1] = toCalc[i+3][6] - toCalc[i][6]; V[2] = toCalc[i+3][7] - toCalc[i][7]; //Calculate Vx Vy Vz

N[0] = (U[1]*V[2]) - (U[2] * V[1]);
N[1] = (U[2]*V[0]) - (U[0] * V[2]);
N[2] = (U[0]*V[1]) - (U[1] * V[0]);

//Calculate length for normalising
length = (float)sqrt((pow(N[0],2)) + (pow(N[1],2)) + (pow(N[2],2)));

for (int a = 0; a < 3; a++)
{
N[a]/=length;
}

for (int j = 0; i < 4; i++)
{
//Apply normals to QUAD vertices (3,4,5 index position of normals in interleaved array)
toCalc[i+j][3] = N[0]; toCalc[i+j][4] = N[1]; toCalc[i+j][5] = N[2];
}
}
}

最佳答案

您似乎正在从索引 5、6 和 7 获取用于计算的顶点位置值,然后在索引 3、4 和 5 处写出法线。请注意索引 5 是如何在两者上使用的。我想其中一个是不正确的。

关于c++ - OpenGL 计算法线(四边形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898053/

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