模型空间到顶点切线空间变换矩阵推导

Blur:Think Tank

在计算光照时,大部分情况下我们在世界坐标下使用光照方向和光线方向:

// 光线方向
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

// 视线方向
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

在使用法线贴图(法线纹理)时,通常需要将光线方向和视线方向变换到顶点切线空间下进行光照计算。那么,如何将光线方向和视线方向变换到顶点切线空间呢?

  1. 首先,我们将光线和视线方向变换到顶点模型空间,可以使用 Unity 内置方法ObjSpaceLightDirObjSpaceViewDir
// 模型空间的光线方向
float3 lightDir = ObjSpaceLightDir(v.vertex);

// 模型空间的视线方向
float3 viewDir = ObjSpaceViewDir(v.vertex);

这里的 v.vertex由顶点的 POSITION 语义指定,是顶点在模型空间下的坐标。

  1. 将上面计算出的 lightDirviewDir模型空间 变换到顶点切线空间,我们知道变换无非就是右乘一个矩阵。那么如何确定这个变换矩阵呢?
  • 顶点切线空间 的定义是:以顶点切线方向为 x 轴,顶点法线方向为 z 轴,顶点副法线方向为 y 轴得到的坐标空间,也就是说顶点切线空间下的顶点切线为 (1,0,0), 副法线为 (0,1,0),法线为(0,0,1);

  • 假定在模型空间下,顶点切线、副法线和法线的坐标分别为 t=(t_1,t_2,t_3), b=(b_1,b_2,b_3), n=(n_1,n_2,n_3),变换矩阵 M 应该满足 M \times t = (1,0,0),M \times b = (0,1,0),M \times n = (0,0,1);
    \begin{bmatrix} a&b&c\\d&e&f\\g&h&i\\ \end{bmatrix} \times \begin{bmatrix} t_1\\t_2\\t_3\\ \end{bmatrix} = \begin{bmatrix} 1\\0\\0\\ \end{bmatrix},\begin{bmatrix} a&b&c\\d&e&f\\g&h&i\\ \end{bmatrix} \times \begin{bmatrix} b_1\\b_2\\b_3\\ \end{bmatrix} = \begin{bmatrix} 0\\1\\0\\ \end{bmatrix} ,\begin{bmatrix} a&b&c\\d&e&f\\g&h&i\\ \end{bmatrix} \times \begin{bmatrix} n_1\\n_2\\n_3\\ \end{bmatrix} = \begin{bmatrix} 0\\0\\1\\ \end{bmatrix}看起来不是很好计算 M 的各行各列的值。

  • 考虑另外一个变换矩阵 M^{-1} 为从顶点切线空间到模型空间的变换矩阵,那么很明显 M^{-1}M的逆矩阵,我们可以先计算 M^{-1},再对其求逆就可以得到M,设
    M^{-1}=\begin{bmatrix} a_0&b_0&c_0\\d_0&e_0&f_0\\g_0&h_0&i_0\\ \end{bmatrix}
    顶点切线空间的切线、副法线、法线变换到模型空间(右乘M^{-1})后的值分别为t=(t_1,t_2,t_3), b=(b_1,b_2,b_3), n=(n_1,n_2,n_3),也就是有
    \begin{bmatrix} a_0&b_0&c_0\\d_0&e_0&f_0\\g_0&h_0&i_0\\ \end{bmatrix} \times \begin{bmatrix} 1\\0\\0\\ \end{bmatrix} = \begin{bmatrix} t_1\\t_2\\t_3\\ \end{bmatrix},\begin{bmatrix} a_0&b_0&c_0\\d_0&e_0&f_0\\g_0&h_0&i_0\\ \end{bmatrix} \times \begin{bmatrix} 0\\1\\0\\ \end{bmatrix} = \begin{bmatrix} b_1\\b_2\\b_3\\ \end{bmatrix} ,\begin{bmatrix} a_0&b_0&c_0\\d_0&e_0&f_0\\g_0&h_0&i_0\\ \end{bmatrix} \times \begin{bmatrix} 0\\0\\1\\ \end{bmatrix} = \begin{bmatrix} n_1\\n_2\\n_3\\ \end{bmatrix}
    展开计算,有\begin{bmatrix}a_0\\d_0\\g_0\end{bmatrix} = \begin{bmatrix}t_1\\t_2\\t_3\end{bmatrix},\begin{bmatrix}b_0\\e_0\\h_0\end{bmatrix} = \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix},\begin{bmatrix}c_0\\f_0\\i_0\end{bmatrix} = \begin{bmatrix}n_1\\n_2\\n_3\end{bmatrix}
    这样,就得到了模型空间到顶点切线空间的变换矩阵为
    M^{-1}=\begin{bmatrix} t_1&b_1&n_1\\t_2&b_2&n_2\\t_3&b_3&n_3\\\end{bmatrix}
    那么如何求 M^{-1}的逆矩阵M呢?考虑到 t=(t_1,t_2,t_3), b=(b_1,b_2,b_3), n=(n_1,n_2,n_3)都是单位向量,以t为例,有t_1^2 + t_2^2 + t_3^2 = 1
    且 因 tb,n互相垂直,也就是任意两者的 点积 为0,也就是如下的3个结果成立:
    t \cdot n=t_1n_1 + t_2n_2 + t_3n_3 = 0 b \cdot t = b_1t_1 + b_2t_2 + b_3t_3 = 0 n \cdot b = n_1b_1 + n_2b_2 + n_3b_3 = 0
    很容易可以推导出
    M^{-1}\times(M^{-1})^T=\begin{bmatrix} 1&0&0\\0&1&0\\0&0&1\\\end{bmatrix}可知 M^{-1}是正交矩阵,则它的逆M也是正交矩阵,所以M=M^{-1}=(M^{-1})^T,很容易得到
    M=(M^{-1})^T=\begin{bmatrix} t_1&t_2&t_3\\b_1&b_2&b_3\\n_1&n_2&n_3\\ \end{bmatrix}
    也就是将模型坐标下的切线、副法线、法线按照行排列得到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容