Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到对象每个顶点的法线,以便使用OpenGL应用平滑着色?_Opengl - Fatal编程技术网

如何找到对象每个顶点的法线,以便使用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).