如何找到对象每个顶点的法线,以便使用OpenGL应用平滑着色?
我正在从一台计算机加载一个对象。此文件格式不定义对象的面或顶点的法线。我使用向量积找到了面部法线。但是我不知道如何找到每个顶点的法线,有什么想法吗 平均共享顶点的所有面的法线 也就是说,只需添加所有相邻面法线并对结果进行规格化。参见示例(方法计算垂直法线):如何找到对象每个顶点的法线,以便使用OpenGL应用平滑着色?,opengl,Opengl,我正在从一台计算机加载一个对象。此文件格式不定义对象的面或顶点的法线。我使用向量积找到了面部法线。但是我不知道如何找到每个顶点的法线,有什么想法吗 平均共享顶点的所有面的法线 也就是说,只需添加所有相邻面法线并对结果进行规格化。参见示例(方法计算垂直法线): //平均所有相邻面法线以获得顶点法线 GLP点pn; pn.x=pn.y=pn.z=0; 对于(int jx=0;jx
//平均所有相邻面法线以获得顶点法线
GLP点pn;
pn.x=pn.y=pn.z=0;
对于(int jx=0;jx
一些.obj文件根本没有法线。首先应计算每面法线:
给定由3个顶点v1、v2、v3组成的面,可以计算法线:
法线是v1-v2和v1-v3之间的归一化叉积
N = Normalize( (v1 - v2) x (v1 - v3) )
Normalize(V) = V / length(V)
length(V) = SQRT (V.x * V.x + V.y * V.y + V.z * V.z)
交叉积:
v × u = (v.y * u.z − v.z * u.y, v.z * u.x − v.x * u.z, v.x * u.y − v.y * u.x).
之后,您可以通过平均相邻面的所有法线来计算“平滑”法线。“平均共享顶点的所有面的法线
也就是说,只需添加所有相邻面法线并对结果进行规格化。”
我已经试过了,有时候你会得到奇怪的结果,当至少两条法线有180度角时
我认为最好使用平分线:
有3个法向量:找到向量2和3的平分线,然后找到向量1的平分线和另一个平分线。然后对结果进行规格化。它不是等价的,您需要规格化而不是除法。([0,1]+[1,0])/2=[0.5,0.5],未规范化。
v × u = (v.y * u.z − v.z * u.y, v.z * u.x − v.x * u.z, v.x * u.y − v.y * u.x).