3D中带光照的骨骼动画原理

常见的模型动画分为关键帧动画与骨骼动画,这里我只关注与骨骼动画,骨骼动画又叫顶点混合动画。

顶点混合维护了一个单独缺省姿势和许多用来正确旋转、平移缺省姿势的多边形网格的各个部分矩阵,这些不同的矩阵变换通常被称为骨骼。一个或多个这样的矩阵控制了再这个缺省姿势的多边形网格中的每个顶点。每个矩阵被赋予了一个权重因子,指明了这个矩阵对每个顶点的影响多少。(3D软件里常用人工交互来刷权重信息)

当渲染这种类型的模型的时候,首先用在顶点的骨头集中的每个矩阵变换每个顶点,然后根据矩阵对应的权重因子对每个矩阵变换的结果进行加权求和。这个新的位置是被混合的顶点位置。

主要步骤分为:从矩阵构造姿势;考虑变换后的光照信息。

这里值得注意的是光照信息的计算,为了正确的光照,需要为每个点计算相同的被变换的和加权平均的法向量,除了需要用每个矩阵的转置的逆来变换法向量而不是用矩阵本身(原因见分割线以下)。假设骨骼矩阵只是旋转和平移将简化为光照进行的法向量变换,因为没有缩放和投影的矩阵的转置的逆就是这个矩阵本身。

 

------------------------我是分割线---------------------------------

法向量的变换矩阵为“顶点变换矩阵的逆矩阵的转置”

http://hi.baidu.com/game_developer/blog/item/2ef0025e679a4648faf2c0ee.html


这篇文章的思想源于潘李亮的《3D变换中法向量变换矩阵的推导》一文。

其实也就是看了篇文章后才知道,原来法向量的变换矩阵与定点的变换矩阵是不一样的。而《DirectX 9.0 3D游戏开发编程基础》这本书的作者视乎也忽略了这点(此书的p306贴出的代码部分,是将顶点的变换矩阵直接用作法向量的变换矩阵)。正如《3D变换中法向量变换矩阵的推导》一文最后所说的,“即使你看到了所谓的正确的结果,那也是近似正确的,至少在理论上,它就是不正确的^_^。”

为什么法向量不能利用顶点变换矩阵来进行变换呢?可以从一个例子中看出来:

三维平面: x + y = k 法线n =[1 1 0]
x方向放大 2倍,相应的变换矩阵:

         |2 0 0 0 |
  = |0 1 0 0 |
         |0 0 1 0 |
         |0 0 0 1 |
n*A=[2 1 0]

其中*表示矩阵相乘。

可以看出,变换后的法线不再与面垂直了。

那法向量的变换矩阵是什么呢?这个推导过程很简单。

下面的式子本是源自于《3D 变换中法向量变换矩阵的推导 》一文,为了方便表示,进行了一些改动:


P1,P2:世界坐标系中的点

Q1,Q2:P1、P2变换到视图坐标系中的点

N:是P1、P2所在平面的法向量

M:是视图空间中,N所对应的法向量

Mv:变换矩阵

世界坐标系中,P1、P2点组成的向量与法向量N垂直:       (1) N*(P1-P2)'=0
同样,视图空间中,Q1,Q2点组成的向量与法向量M垂直:   (2)M*(Q1-Q2)'=0
将世界坐标系中P1、P2变换到视图空间中Q1、Q2点:        (3)Mv*P1'-Mv*P2'=Mv*(P1-P2)'=(Q1-Q2)'

其中,'表示转置,*表示矩阵乘。将向量相乘写成矩阵相乘的形式,而且这里是利用的矩阵左乘来进行坐标变换,要注意DirectX中是利用的矩阵右乘来进行坐标变换的,请注意区别。

式子(3)中:(Q1-Q2)'=Mv(P1-P2)'带入(2)式后:(4)M*Mv*(P1-P2)'=0。

比较(1)、(4)后得到:(5)N=M*Mv

注:这里我只能说比较(1)、(4)得到,因为从线性代数角度这两个式子推不出式子(5),我也希望大家能够给出更合理的说法和推导过程。

(5)N=M*Mv =>(6)M=N*IN(Mv)。其中IN(Mv)表示Mv的逆矩阵。

所以

(6)M=N*IN(Mv)=>(7)M'=( IN(Mv) )'*N'。

由式子(7)得到:法向量的变换矩阵为“顶点变换矩阵的逆矩阵的转置”

从线性代数角度,“矩阵的逆矩阵的转置”与“矩阵的转置再求逆”是相等的,因此也可以说成:“顶点变换矩阵转置后的逆矩阵”。

恭喜你,读到这里,你已经掌握了法向量的变换矩阵的推导。也许你有点担心,DirectX中是利用矩阵右乘进行变换的,那么,到底法向量的变换矩阵是不是也一样呢?其实,你可以自己推导了。而且我刚刚用上面的方法粗略的推了下,结果应该是一样的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值