Unity在FBX文件的导入设置中有一个关于切线(Tangents)的设置项,通常是使用默认的Calculate Tangent Space,让Unity自动计算切线,而无需美术人员在FBX文件中制作切线。这个切线信息是用于把切线空间的法线贴图中获取到的法线信息转换到世界空间的,大部分情况下,我们不关心这个切线算出来到底是个什么样子。但是在制作各向异性头发时,我们需要知道发丝的走向,通常是通过头发片元的副法线/切线来定义发丝的走向,那么Unity到底是基于什么来计算这个切线的呢?如何告知美术人员应如何制作用于头发各向异性的头发模型?

如上图所示,模型顶点的连线在法线贴图UV(通常是UV0)中的走向决定了是由副法线还是切线决定发丝的走向。

如果发丝从发根到发梢在UV中是从上到下的,那么片元的副法线就代表了发丝的方向。

如果发丝从发根到发梢在UV中是从右到左的,那么片元的切线就代表了发丝的方向。

我没有尝试发丝从下到上走或者从左到右走的时候,副法线/切线是否需要手动取反,亦或是已经由切线的W分量决定了其是否取反,有此需求的读者可以自行尝试一下。

与之相对的,垂直于UV图的向量也就是片元切线空间中法线的方向了,搞明白了这一点,我们再来看看法线贴图。

上图是从网上找的一张平凡无奇的法线贴图,不难发现,法线贴图的颜色通常都是分布在(127.5, 127.5, 255)附近。

把RGB颜色值除以255(映射到 0 ~ 1区间),再乘以2(映射到 0 ~ 2区间),然后再减1(映射到 -1 ~ 1区间),就转换成了一个单位向量(0, 0, 1),这个值的含义就是在切线空间中完全垂直于副法线和切线所夹的平面(也就是垂直于法线贴图的UV坐标系),即片元的法线本身,法线贴图不对其产生任何偏转。如果把这个(0, 0, 1)向量稍作偏转,那么它在法线贴图中的颜色就会发生细微的变换,通常我们不会在法线贴图中出现过于夸张的法线偏转,因为那会导致视觉效果的严重错误(偏转后的法线与表面实际朝向完全不符),这就是为什么法线贴图永远都是这么个色调,因为它永远只会出现在(127.5, 127.5, 255)附近。

明白了这个道理,就不难理解制作头发的时候为什么一定要确保头发丝在UV中的走向必须统一为上下或者左右了,不过在实际制作时,还是会犯一个错误,就是把头发面片的左右关系搞反,如上图所示,头发面片的左右关系必须对应UV中的左右关系,如果在UV中是从右到左排布,则模型的左对应UV的上,模型的右对应UV的下。如果搞反了左右关系,会导致副法线/切线的朝向与发丝的走向相反,渲染结果就是高光错乱不一,不是一个整体(总之看起来很奇怪)。

如上图所示,黄字标注的1号面片的左侧(A点)对应了UV的左侧(A点),右侧(B点)对应了UV的右侧(B点),发丝走向正确(发根至发梢);黄字标注的2号面片的左侧(D点)对应了UV的右侧(D点),右侧(C点)对应了UV的左侧(C点),发丝走向反向(发梢至发根)。1、2两个面片的渲染结果不同,不能统一。

总结一下头发的制作规范就是:

1. 面片的正面(法线一面)规则平铺在UV中从上到下(或从右到左)。

2. 所有面片必须保证完全相同的UV走向,在UV中的平铺不能有正有反(即左对左右对右,或者从右到左走向时左对上右对下)。

3. 上下排布用副法线表示发丝走向,右左排布用切线表示发丝走向。

Calculate Tangent Space是怎么计算切线的相关推荐

  1. 切线空间(Tangent Space)

    1. 线性变换 2. 切线空间(坐标系) 2.1 切线空间的构成 2.2 切线空间中光照计算及其弊端 Reference 1. 线性变换 在掌握切线空间之前我们先来简单了解线性变换与向量空间.矩阵的关 ...

  2. [图形学]切向空间(Tangent Space)

    2009年3月17日 阅读评论 发表评论     这个应该算是补遗漏,去年在MSN Space上写过一篇关于凹凸贴图的,当时写了半天其实写的一点也不明白,呵呵,因为有很多细节其实我也没搞太清楚,现在这 ...

  3. HDU 1012 u Calculate e(简单阶乘计算)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1012 u Calculate e Time Limit: 2000/1000 MS (Java/Oth ...

  4. unity导入的模型设置详谈(后面动作)

    此次咱们以2018版本为例,其他版本也差不多,有需要可以下方评论,我告诉大家对应的设置在哪,怎么设置. 咱们先讲Model这一栏 Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子 ...

  5. shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成

    shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is e ...

  6. Unity3D 动画控制器 Animator Component

    文章目录 Animator 组件 Animator Controller 动画控制器 自建状态 1.右键菜单 2.在状态上右键 3.Animator Layers 4.Animator Pameter ...

  7. Numpy数组常用函数汇总(数学运算、三角函数、位运算、比较运算及其它)

    一.数学运算 函数名 description 说明 add(x1, x2, [, out, where, casting, order, -]) Add arguments element-wise. ...

  8. GraphicsLab Project之基于物理的着色系统(Physical based shading) - 基于图像的光照(Image Based Lighting)(Diffuse篇)

    作者:i_dovelemon 日期:2018-01-21 来源:CSDN 主题:PBR, Equrectangular Map, Cube Map, Irradiance Map, HDR Image ...

  9. 【Substance】Substance Painter基本制作流程

    目录 准备工作 使用fill layer完成70% 手绘材质完成剩余30% Iray渲染和导出贴图 这篇东西主要来自于官网Substance Painter入门视频教程的要点总结,记录sp中基本概念和 ...

  10. UE4Material_材质属性(1)

    材质中的属性: 物理材质 Phys Material(物理材质) 与该材质关联的物理材质 .物理材质(Physical Material)提供了物理属性的定义,例如碰撞(弹力)以及其他基于物理的方面会 ...

最新文章

  1. html购物车内部处理样式,第4期学习班-1.23作业-【JQuery-attr方法】-【JQuery-切换CSS效果】-【JQuery-插入元素】-【JQuery-加入购物车】...
  2. matlab神经模糊推理系统
  3. Cochrane系统综述注册的具体流程
  4. 【图像超分辨率】Understanding Deformable Alignment in Video Super-Resolution
  5. angular的html引入js,在AngularJS中的文件夹中加载JavaScript和CSS文件
  6. resnet,inception,densenet,senet
  7. Ubuntu 环境变量文件介绍
  8. Java基础,双色球系统实现,完整版本,没有BUG,完整代码版
  9. 如何快速构建一个企业revit族库(含插件)
  10. jxls设置隐藏列隐藏行
  11. Microsoft OLE DB Provider for ODBC Drivers 错误 ‘80004005‘ 兼容
  12. ThinkPad T410i 2516A21 升級手札(換SSD固態硬碟、I7 CPU、開機20秒)
  13. Android PPP协议
  14. 完美卸载SQL Server 2008 R2 的方法,适合所有问题
  15. Python pandas库|任凭弱水三千,我只取一瓢饮(2)
  16. 支付宝常用接口统一封装,可直接支付参数使用(适用于H5、PC、APP)
  17. DY-SV17F语音播放模块应用篇一 【IO独立模式】
  18. [蓝桥杯][2018年第九届真题]日志统计(尺取法)
  19. 调度算法的介绍及优缺点
  20. Ad Click Prediction: a View from the Trenches 阅读

热门文章

  1. Taro 如何开始微信小程序的开发
  2. 关于安卓开发的一些你必须要掌握的网络知识(一):网络基础与网络框架OkHttp
  3. 智能生活管家项目之一-系统简介
  4. 怎么样开启移动热点?看我操作,简单开启
  5. python笔记之json报错
  6. 面试题 丑数(10)
  7. 学习笔记-God-Linux
  8. 浅述Docker的容器编排
  9. 蓝牙通知栏图标不显示的问题解决
  10. 函数对称性常见公式_函数的对称性的常用结论