2012-03-02 49 views

回答

2

法线计算,每面(三角形),并保存在某个地方吧。现在,对于每个顶点,您都有几个共享顶点的面(典型情况是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 

不要忘了标准化得到的载体,所以它的长度为1

注意:不要把faceNormals在一个这样的数组。在一个真实的代码中,你可能希望有一个类似于所有法线的容器和一些逻辑来说明哪个法线与哪个顶点相关。

+0

这个实际上应该工作吗?对于我的测试它似乎并没有工作......这就是我所做的:'normal.x =(V1.x + V2.x + V3.x)/ 3.0f'(对于三角形),然后我最后归一化。我做错了什么? – Rookie 2012-03-02 15:36:20

+0

@Rookie这不是一个从顶点计算三角法线的公式。为此,您需要[跨产品](http://en.wikipedia.org/wiki/Cross_product)。我的答案是关于平均几个法向量。 – Fiktik 2012-03-02 18:33:06

+0

对不起,我误解了你,因为我理解OP要求如何计算法线,而不是如何计算平滑法线...... – Rookie 2012-03-02 18:55:39

3

对于缸环上的每一个点,vertexNormal = normalize(vertexPosition - ringCenter);

或者你也可以正常计算它们,在正常进行归一化所有的和面法线包含此顶点每个人脸上。

+1

使用上述公式在创建顶点的同时为每个顶点创建一个法线。这将适用于所述的气缸。 – 2014-03-21 16:58:28