法线矩阵推导

法线矩阵推导

https://zhuanlan.zhihu.com/p/72734738

https://juejin.cn/post/7113952418613690382

https://blog.csdn.net/wangjianxin97?type=blog

1、为什么需要法线矩阵

js 复制代码
vec3 normalEyeSpace = modelViewMatrix * normal;

如果模型矩阵执行了非等比缩放, 顶点的改变会导致法向量不再保持垂直关系。

缩放后 n n n不在与线段垂直了, 真正垂直的是 n ′ n' n′。

three.js 代码:

js 复制代码
const geometry = new THREE.BufferGeometry()
const position = [];
const normals = [];
position.push(-1, 0, 0)
position.push(1, 0, 0)
position.push(0, 1, 0)

normals.push(0.5, 0.5, 0)
normals.push(0.5, 0.5, 0)
normals.push(0.5, 0.5, 0)

geometry.setAttribute('position', new THREE.Float32BufferAttribute(position, 3))
geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3))

const material = new THREE.ShaderMaterial({
  vertexShader: `
    varying vec3 vNormal;
    void main() {
      vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
      gl_Position = projectionMatrix * mvPosition;
      vNormal = normal;
    }
  `,
  fragmentShader: `
    varying vec3 vNormal;
    uniform mat3 normalMatrix;
    void main() {
      gl_FragColor = vec4( vNormal, 1.0 );
    }
  `,
});

const mesh = new THREE.Mesh(geometry, material);
mesh.scale.set(0.5, 1, 1)

2 法向量矩阵推导

约定:

  • 向量用小写字母的表示
  • 转换矩阵用大写字母表示

假设矩阵 G G G 转换法向量, 矩阵 M M M转换切线。

如果转换到视图空间 ,那么 M M M就是modelViewMatrix, 如果转换到世界空间 , M M M就是modelMatrix

根据假设有:
n ′ = G n t ′ = M t n' = G n \\ t' = M t \\ n′=Gnt′=Mt

根据几何关系有:
n ⋅ t = n ′ ⋅ t ′ = 0 n \cdot t = n' \cdot t' = 0 n⋅t=n′⋅t′=0

带入有:
n ′ ⋅ t ′ = ( G n ) ⋅ ( M t ) = ( G n ) T ( M t ) = n T G T M t \begin{aligned} n' \cdot t' &= (G n) \cdot (M t) \\ &= (G n)^{T} (M t) \\ &= n^{T} G^{T} M t \\ \end{aligned} n′⋅t′=(Gn)⋅(Mt)=(Gn)T(Mt)=nTGTMt

因为(向量点积用矩阵表示):
n ⋅ t = n T t = n ′ ⋅ t ′ n \cdot t = n^{T} t = n' \cdot t' n⋅t=nTt=n′⋅t′

所以,满足上式, 只需:
G T M = I G^{T} M = I GTM=I

因此:
G T = M − 1 ( G T ) T = ( M − 1 ) T G = ( M − 1 ) T \begin{aligned} G^{T} &= M^{-1} \\ (G^{T})^{T} &= (M^{-1})^{T} \\ G &= (M^{-1})^{T} \end{aligned} GT(GT)TG=M−1=(M−1)T=(M−1)T

相关推荐
IT小白杨15 小时前
社媒多账号运营的环境隔离:一张图谱模型,解释清“为什么换IP还是被连坐“
经验分享·笔记·矩阵·指纹浏览器
镜像视界(浙江)科技有限公司2 天前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
wzdark2 天前
稀疏矩阵存储结构及其运算复杂度研究4
线性代数·矩阵
零依赖极客2 天前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
零依赖极客2 天前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
wzdark3 天前
基于矩阵的动态规划路径问题性能优化4
线性代数·矩阵·动态规划
Raas1004 天前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关有哪些功能?一文看懂AI网关能力矩阵
大数据·人工智能·矩阵·gateway·mai gateway·企业级产品
船厂电气自动化ai大模型4 天前
AI大模型与数学 第75课 基、维度、向量空间坐标
数据结构·线性代数·算法·机器学习·推荐算法
hansang_IR5 天前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法
BSD_HY5 天前
薄膜开关矩阵扫描在低功耗MCU上的GPIO扩展实现
单片机·嵌入式硬件·矩阵·人机交互·薄膜开关·源头工厂