白泽图

  • 文章
    • Unity渲染
    • Unity项目开发
    • 工具
    • 数学
    • 算法
    • 网站搭建
    • 网络&操作系统
蒋程个人博客
互联网技术经验总结&分享
  1. 首页
  2. Unity渲染
  3. 正文

施密特正交化

2020-12-03 1200点热度 1人点赞 0条评论

研究施密特正交化起因是图形学中构建BTN切线空间(当模型顶点不包含切线信息的情况)变换切线空间法线贴图中的法线到世界空间的需求的最后一步需要将BTN进行正交化,得到真正意义的BTN空间

从数学角度看

设两个n维的向量 x=(x1,x2,...,xn) , y=(y1,y2,...,yn)

则有: \(\vec{x}\cdot \vec{y}=[x,y]=x_{1}y_{1}+x_{2}y_{2}+,...,+x_{n}y_{n}\)   ([x,y]是内积的写法,其实和点乘是一回事)

\(\left \|\vec{x}\right \|=\sqrt{[x,x]}=\sqrt{x_{1}y_{1}+x_{2}y_{2}+...+x_{n}y_{n}}\)

简单推导一下\(\left \|\vec{x}\right \|=\sqrt{[x,x]}\)

\([x,x]=\left \|\vec{x}\right \|\left \|\vec{x}\right \|cos0\)   因为 cos0 = 1(两个相同的向量点乘夹角为0),所以\([x,x]=\left \|\vec{x}\right \|\left \|\vec{x}\right \|\)


如图,这个是一个简单的向量投影,结果(红色的向量)是

\(=\left \|\vec{x}\right \|cos\Theta \cdot \hat{y}=\left \|\vec{x}\right \|cos\Theta\frac{\vec{y}}{\left \|\vec{y}\right \|}=\frac{\left \|\vec{x}\right \|cos\Theta}{\left \| \vec{y} \right \|}\cdot \vec{y}=\frac{\left \|\vec{x}\right \|\left \| \vec{y} \right \|cos\Theta}{\left \| \vec{y} \right \|\left \| \vec{y} \right \|}\cdot \vec{y}\)

\(=\frac{[x,y]}{[y,y]}\cdot \vec{y}\)


二维空间正交化

如图我们需要将向量\(\vec{\alpha _{1}}\)与\(\vec{\alpha _{2}}\)  正交化得 \(\vec{\beta_{1}}\)与\(\vec{\beta_{2}}\)

第一步:要正交化另一个轴我们首先需要将其中一个轴作为底交(参考标准),这里我们取\(\vec{\alpha _{1}}\),那么

\(\vec{\beta_{1}}=\vec{\alpha_{1}}\)

第二步: 观察上图,要正交化\(\vec{\alpha _{2}}\),其实就是求上图红色的向量\(\vec{\beta_{2}}\)

\(\vec{\beta_{2}}=\vec{\alpha_{2}}-\)(\(\vec{\alpha _{2}}\)在\(\vec{\beta _{1}}\) 上的投影向量)

\(\vec{\beta_{2}}=\vec{\alpha_{2}}-\frac{[\alpha_{2},\beta_{1}]}{[\beta_{1},\beta_{1}]}\cdot \vec{\beta_{1}}\)


三维空间正交化

如图我们需要将向量\(\vec{\alpha _{1}}\)、\(\vec{\alpha _{2}}\)、\(\vec{\alpha _{3}}\)  正交化得 \(\vec{\beta_{1}}\)、\(\vec{\beta_{2}}\)、\(\vec{\beta_{3}}\)

通过二维空间的正交化,我们可以很容易得出

\(\vec{\beta_{1}}=\vec{\alpha_{1}}\)

\(\vec{\beta_{2}}=\vec{\alpha_{2}}-\frac{[\alpha_{2},\beta_{1}]}{[\beta_{1},\beta_{1}]}\cdot \vec{\beta_{1}}\)

此时最简单的方式就是

\(\vec{\beta_{3}}=\vec{\beta_{1}}\times \vec{\beta_{2}}\)

然后再将这三个向量归一化,就能得到我们想要的三个正交基向量

下面我们从施密特正交化的思路进行\(\vec{\beta_{3}}\)的推导

从上图,可以看出

\(\vec{\beta_{3}}=\vec{\alpha_{3}}-\vec{n_{3}}\)
\(\vec{n_{3}}=\vec{n_{1}}+\vec{n_{2}}\)
而\(\vec{n_{1}}\)与\(\vec{n_{2}}\)就是\(\vec{\alpha_{3}}\)在\(\vec{\beta_{1}}\)与\(\vec{\beta_{2}}\)上的投影,所以

\(\vec{\beta_{3}}=\vec{\alpha_{3}}-\vec{n_{3}}=\vec{\alpha_{3}}-(\vec{n_{1}}+\vec{n_{2}})=\vec{\alpha_{3}}-\vec{n_{1}}-\vec{n_{2}}\)

\(\vec{\beta_{3}}=\vec{\alpha_{3}}-\frac{[\alpha_{3},\beta_{1}]}{[\beta_{1},\beta_{1}]}\cdot \vec{\beta_{1}}-\frac{[\alpha_{3},\beta_{2}]}{[\beta_{2},\beta_{2}]}\cdot \vec{\beta_{2}}\)


简化

明白了其原理,我们进行简化(我们可以将每一步进行归一化)

\(\vec{\beta_{1}}=Normalize(\vec{\alpha_{1}})\)

\(\vec{\beta_{2}}=Normalize(\vec{\alpha_{2}}-(\vec{\alpha_{2}}\cdot\vec{\beta_{1}})\cdot\vec{\beta_{1}}))\)

\(\vec{\beta_{3}}=Normalize(\vec{\alpha_{3}}-(\vec{\alpha_{3}}\cdot\vec{\beta_{1}})\cdot\vec{\beta_{1}})-(\vec{\alpha_{3}}\cdot\vec{\beta_{2}})\cdot\vec{\beta_{2}}))\)

或直接

\(\vec{\beta_{3}}=\vec{\beta_{1}}\times \vec{\beta_{2}}\)


标签: 暂无
最后更新:2020-12-03

蒋程

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2023 白泽图. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

登录
注册|忘记密码?