Opengl 如何计算圆柱体的顶点法线?

Opengl 如何计算圆柱体的顶点法线?,opengl,vertex,normals,Opengl,Vertex,Normals,我有下面的圆柱体,我正在opengl中绘制一个蠕虫,我想计算顶点法线 计算每个面(三角形)的法线并将其保存在某个位置。现在,对于每个顶点,都有几个面共享该顶点(图片上通常为6)。最终顶点法线是面法线的平均值。对于6个面,可以计算: int faceCount = 6; float sum = 0.0f; for(int face = 0; face < faceCount; ++face) sum += faceNormals[face].x; normal.x = sum / f

我有下面的圆柱体,我正在opengl中绘制一个蠕虫,我想计算顶点法线


计算每个面(三角形)的法线并将其保存在某个位置。现在,对于每个顶点,都有几个面共享该顶点(图片上通常为6)。最终顶点法线是面法线的平均值。对于6个面,可以计算:

int faceCount = 6;
float sum = 0.0f;
for(int face = 0; face < faceCount; ++face)
    sum += faceNormals[face].x;
normal.x = sum / faceCount;
// and so on for y and z
int faceCount=6;
浮动总和=0.0f;
用于(整数面=0;面<面计数;+面)
总和+=面法线[面].x;
正常。x=总和/面数;
//y和z也是如此
不要忘记对结果向量进行规格化,使其长度为1


注意:不要将
faceNormals
放入这样的数组中。在实际代码中,您可能希望有一个包含所有法线的类似于
向量的容器和一些逻辑,说明哪些法线与哪个顶点相关。

计算每个面(三角形)的法线,并将其保存在某处。现在,对于每个顶点,都有几个面共享该顶点(图片上通常为6)。最终顶点法线是面法线的平均值。对于6个面,可以计算:

int faceCount = 6;
float sum = 0.0f;
for(int face = 0; face < faceCount; ++face)
    sum += faceNormals[face].x;
normal.x = sum / faceCount;
// and so on for y and z
int faceCount=6;
浮动总和=0.0f;
用于(整数面=0;面<面计数;+面)
总和+=面法线[面].x;
正常。x=总和/面数;
//y和z也是如此
不要忘记对结果向量进行规格化,使其长度为1


注意:不要将
faceNormals
放入这样的数组中。在实际代码中,您可能希望有一个包含所有法线的类似于
向量的容器和一些逻辑,说明哪些法线与哪个顶点相关。

对于柱面环上的每个点,
vertexNormal=normalize(vertex-ringCenter)


或者您可以正常计算它们,其中法线是包含该顶点的每个面的所有面法线的归一化总和。

对于圆柱环上的每个点,
vertexNormal=normalize(vertex-ringCenter)


或者您可以正常计算它们,其中法线是包含该顶点的每个面的所有面法线的归一化总和。

这是否实际可行?对于我的测试,它似乎不起作用。。。这就是我所做的:
normal.x=(V1.x+V2.x+V3.x)/3.0f
(对于三角形),然后我最终进行了规范化。我做错了什么?@Rookie这不是计算三角形顶点法线的公式。为此,您需要一个新的解决方案。我的答案是对几个法向量求平均值。对不起,我误解了你的意思,因为我理解了运算,它问的是如何计算法线,而不是如何计算平滑法线…@Fiktik:在一般情况下,你就是这样计算法线的。在圆柱体上,你可以得到精确的法线,因为它是一个数学定义的构造。这真的有效吗?对于我的测试,它似乎不起作用。。。这就是我所做的:
normal.x=(V1.x+V2.x+V3.x)/3.0f
(对于三角形),然后我最终进行了规范化。我做错了什么?@Rookie这不是计算三角形顶点法线的公式。为此,您需要一个新的解决方案。我的答案是对几个法向量求平均值。对不起,我误解了你的意思,因为我理解了运算,它问的是如何计算法线,而不是如何计算平滑法线…@Fiktik:在一般情况下,你就是这样计算法线的。在圆柱体上,可以得到精确的法线,因为它是一个数学定义的构造。在使用上述公式创建顶点的同时,为每个顶点创建一条法线。这将适用于所述的圆柱体。在使用上述公式创建顶点的同时,为每个顶点创建一条法线。这将适用于所述的气缸。