从3dsmax导出normalmap的时候tangent向量的“正确”算法

    目前有很多工具可以直接生成normalmap,不同的工具生成的算法也有点不同,而不同的算法导致tangent和binormal的计算也有点差别。现在大多数的美工最常用的基本上还是3dsmax,用max生成normalmap也是比较常用和方便的方法。不过目前似乎很少有资料提到从max里导出normalmap的时候如何计算tangent向量,max的文档和例子说这个东西的时候也是遮遮掩掩的,相信很多人都在计算这个东西的时候遇到点点麻烦,导致显示只能“近似正确”。正确的计算方法应该按照下面这个步骤:
    首先根据每个面的三个顶点坐标和uv坐标正常计算出每个面的tangent,binormal和normal。
然后max生成normalmap的时候是根据如果一个点在某些面上“平滑”过渡,这个点的切线才能由这些面叠加。对normalmap来说一个点在两个面之间“平滑”过渡有3个必要条件:
    第一两个面的smoothgroup必须相等,也就是说共用这个点的两个邻面的smoothgroup必须相等(如果模型在max里没有给定smoothgroup,则认为是单独的一组smoothgroup,如果有多组,则每组都应该考虑,但叠加向量的时候每个面只能计算一次)。
    二是两个面在这一点的UV必须连续,也就是说这两个面在这一点的UV相等,因为max的数据结构是按面来索引不同的顶点和UV,所以同一个点UV有时候不相同,如果UV不同,normalmap在这里并不连续。
    三是UV的方向必须一致,两个面之间的UV必须同为正向或同为反向。因为tangent,binormal各表示贴图的u方向和v方向,而normal只决定于smoothgroup,所以我们可以用两个面的tangent,binormal和normal三个向量组成的行列式的值是否同号来判断方向是否一致。
    如果一个点所被包含的某些面相邻,并且满足以上三个条件,那么这个点的tangent向量就必须由这些面的tangent向量叠加(normal只需要满足smoothgroup相等),否则不能叠加。
  
  很显然,由于normal与tangent和binormal的条件不一样,大多数情况下计算之后会多生成一些顶点。

转载于:https://www.cnblogs.com/linyizsh/archive/2006/10/29/543749.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值