游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9757|回复: 2

怎么计算三角形三个顶点的法线?

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-10 16:26:00 | 显示全部楼层 |阅读模式
已知三角形v0 v1 v2,怎么计算各个顶点的法线? 我需要通过这3个法线来实现Gouraud着色
我是这样算的:
v0的顶点法线 = (v1-v0) × (v2-v0)
v1的顶点法线 = (v0-v1) × (v2-v1)
v2的顶点法线 = (v0-v2) × (v1-v2)

但渲染结果不对。
书上给出的代码,我又看不懂(他是先计算面法线,再让每个顶点的法线加上这个面法线,最后归一化)

其中有个疑惑:
3个顶点法向量在归一化后不就相同了么? 既然相同,为什么还要拿这3个顶点法向量计算光照? 而不是用一个法线向量?

附书上的代码:

  1. VECTOR4D u, v, n;
  2. VECTOR4D_Build(&obj->vlist_local[ vindex_0 ].v, &obj->vlist_local[ vindex_1 ].v, &u);
  3. VECTOR4D_Build(&obj->vlist_local[ vindex_0 ].v, &obj->vlist_local[ vindex_2 ].v, &v);
  4. VECTOR4D_Cross(&u, &v, &n);  // n就是三角形面法线


  5. VECTOR4D_Add(&obj->vlist_local[vindex_0].n, &n, &obj->vlist_local[vindex_0].n); // v0的法线 = v0的法线 + n
  6. VECTOR4D_Add(&obj->vlist_local[vindex_1].n, &n, &obj->vlist_local[vindex_1].n); // v1的法线 = v1的法线 + n
  7. VECTOR4D_Add(&obj->vlist_local[vindex_2].n, &n, &obj->vlist_local[vindex_2].n); // v2的法线 = v2的法线 + n
复制代码

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-11-10 18:06:00 | 显示全部楼层

Re:怎么计算三角形三个顶点的法线?

找到这其中的问题了:
http://blog.csdn.net/wangpingfang/article/details/6084267

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-11-10 18:49:00 | 显示全部楼层

Re: 怎么计算三角形三个顶点的法线?

来张效果图[em13]

左面的是flat着色,右面的是Gouraud着色
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-27 10:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表