|
已知三角形v0 v1 v2,怎么计算各个顶点的法线? 我需要通过这3个法线来实现Gouraud着色
我是这样算的:
v0的顶点法线 = (v1-v0) × (v2-v0)
v1的顶点法线 = (v0-v1) × (v2-v1)
v2的顶点法线 = (v0-v2) × (v1-v2)
但渲染结果不对。
书上给出的代码,我又看不懂(他是先计算面法线,再让每个顶点的法线加上这个面法线,最后归一化)
其中有个疑惑:
3个顶点法向量在归一化后不就相同了么? 既然相同,为什么还要拿这3个顶点法向量计算光照? 而不是用一个法线向量?
附书上的代码:
- VECTOR4D u, v, n;
- VECTOR4D_Build(&obj->vlist_local[ vindex_0 ].v, &obj->vlist_local[ vindex_1 ].v, &u);
- VECTOR4D_Build(&obj->vlist_local[ vindex_0 ].v, &obj->vlist_local[ vindex_2 ].v, &v);
- VECTOR4D_Cross(&u, &v, &n); // n就是三角形面法线
- VECTOR4D_Add(&obj->vlist_local[vindex_0].n, &n, &obj->vlist_local[vindex_0].n); // v0的法线 = v0的法线 + n
- VECTOR4D_Add(&obj->vlist_local[vindex_1].n, &n, &obj->vlist_local[vindex_1].n); // v1的法线 = v1的法线 + n
- VECTOR4D_Add(&obj->vlist_local[vindex_2].n, &n, &obj->vlist_local[vindex_2].n); // v2的法线 = v2的法线 + n
复制代码 |
|