TechWrites

There is no audience.

Lambert光照模型

概念

Lambertian反射定义了一个理想的无光表面或者漫反射表面。无论观察者的视角如何,Lambertian表面对观察者表现的亮度都是相同的。

也就是说, 表面的亮度是各向同性的,并且发光强度遵循Lambert的余弦定律。

在计算机图形学中,Lambertian反射一般被用于漫反射模型。

公式

I_d=L \cdot N C I_L

其中:

  • I_d:表面的漫反射强度
  • L:表面指向光源的向量(归一化)
  • N:表面的法线向量方向(归一化)
  • C:表面颜色
  • I_L:入射光的强度(也即光的RGB)

根据公式可以看出反射的强度跟视角无关,跟法线和光源方向的夹角的余弦值(即L \cdot N)成正比。

NL之间的夹角超过90度也就是在背光的一面,L \cdot N的结果会小于零,这种情况下一般直接取0(即max(0,L \cdot N)),所以看起来会比较平。Valve公司在开发Half Life时,对Lambert模型做了简单的修改,以避免这种问题的发生:

变种:Half Lambert

Half-Life中首先使用的技术,对Lambert模型进行了简单的修改,避免物体的背光面看起来太平。方式是将max(0,L \cdot N)改为0.5(L \cdot N)+0.5,即将点积的结果由[-1,1]变为[0,1]

To soften the diffuse contribution from local lights, the dot product from the Lambertian model is scaled by ½, add ½ and squared.

Value官方对Half Lambert的解释中好像还说了要平方,但网上的各种实现都没有这一步,不知道是不是理解错了squared的意思。如果不平方,Half Lambert要比Lambert亮很多,平方之后就比较接近了:

法线方向和光源方向的夹角从0到π变化时,三种情况的曲线,黑色Lambert,红色Half Lambert,绿色Half Lambert Squared:

Phong光照模型

概念

Phong模型是一种局部光照的经验模型。由犹他大学的美国越南裔学者Bui Tuong Phong在其1975年的博士论文中提出。

Phong模型认为物体表面反射光线由三部分组成:

  • 环境光(Ambient):场景中的其他间接光照
  • 漫反射(Diffuse):散射部分(大但不光亮)
  • 高光反射(Specular):镜面反射部分(小而亮)

img

(在上图中,光线是白色的,环境光和漫反射部分是蓝色的,高光部分是白色的。)

可以看到,高光部分反射的光区域比较小,但强度很大;漫反射部分的强度根据物体表面方向的不同而不同;而环境光部分是跟方向无关的。

Humanoid动作使用Root Motion要注意的问题

我们游戏内的动作都是Generic类型的,并且技能动作使用了{% post_link Unity-Root-Motion Root Motion %}来处理技能位移。

所有模型都有一跟B_Root骨骼(没有蒙皮信息),用作模型导入设置里的Root node。

如果将动作类型改为Humanoid,则由于B_Root的存在,会导致Root Motion无法正常使用,不管Bake Inot Pos与否,动作本身都会有位移,看表现应该是B_Root影响到了Body Transform和Body Orientation的计算:

FBX从3ds Max到Unity

3ds Max导出FBX

导出模型

  1. 选择模型、所有具有蒙皮信息的骨骼、B_Root,如下:

简单实用的双开Unity技巧

工欲善其事,必先利其器

在使用Unity开发游戏的过程中经常需要同时启动两个甚至多个Unity客户端来进行测试或调试,最简单的做法自然是checkout两份工程。

但会遇到一些问题:

  • 每次开第二个工程Unity就会先报错,然后让你选择工程,虽说无关痛痒,但次数多了也容易让人烦躁:

  • 任务栏上的Unity图标很容易忘记哪个对应哪个工程
  • 用VS进行debug的时候不知道应该挂到哪个进程上,这是最烦的

当然这些令人不爽的问题都是可以解决的,下面是我的做法:

Page 6 of 7

Powered by WordPress & Theme by Anders Norén

粤ICP备2021073162号-1