计算机图形学——射线与三角形相交检测_Möller-Trumbore算法及推导过程(涉及标量三重积、克莱姆法则)

1. 标量三重积

1.1 标量三重积的定义

标量三重积(scalar triple product)是一个结合点积和叉积的运算,定义为:

a ⋅ ( b × c ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) a(b×c)

这里:

  • b × c \mathbf{b} \times \mathbf{c} b×c:是向量 b \mathbf{b} b c \mathbf{c} c 的叉积,结果是一个垂直于 b \mathbf{b} b c \mathbf{c} c 所在平面的向量。
  • a ⋅ ( b × c ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) a(b×c):将 a \mathbf{a} a 投影到 b × c \mathbf{b} \times \mathbf{c} b×c 上后,计算标量乘积,最终结果是一个标量。

 

1.2 标量三重积的几何意义

1.2.1 平行六面体的体积

标量三重积的绝对值表示由三个向量 a , b , c \mathbf{a}, \mathbf{b}, \mathbf{c} a,b,c 作为边所构成的平行六面体的体积:

V = ∣ a ⋅ ( b × c ) ∣ V = |\mathbf{a} \cdot (\mathbf{b} \times \mathbf{c})| V=a(b×c)

几何解释:

在这里插入图片描述

  • b × c \mathbf{b} \times \mathbf{c} b×c 的模长代表 b \mathbf{b} b c \mathbf{c} c 所围成的平行四边形的面积。
  • a ⋅ ( b × c ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) a(b×c) 是平行四边形面积乘以向量 a \mathbf{a} a 在其法向上的投影,即体积。
1.2.2 向量共面的判别

a ⋅ ( b × c ) = 0 \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) = 0 a(b×c)=0,说明向量 a , b , c \mathbf{a}, \mathbf{b}, \mathbf{c} a,b,c 共面。

1.2.3 方向判定

标量三重积的符号可用于判断 a , b , c \mathbf{a}, \mathbf{b}, \mathbf{c} a,b,c 的排列是否符合右手法则:

  • a ⋅ ( b × c ) > 0 \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) > 0 a(b×c)>0,则符合右手法则。
  • a ⋅ ( b × c ) < 0 \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) < 0 a(b×c)<0,则不符合。

 

1.3 标量三重积的计算公式

标量三重积可以通过行列式计算:

a ⋅ ( b × c ) = ∣ a 1 a 2 a 3 b 1 b 2 b 3 c 1 c 2 c 3 ∣ \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) = \begin{vmatrix} a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ c_1 & c_2 & c_3 \end{vmatrix} a(b×c)= a1b1c1a2b2c2a3b3c3

推导过程

  • 叉积 b × c \mathbf{b} \times \mathbf{c} b×c 的结果为:

b × c = [ i j k b 1 b 2 b 3 c 1 c 2 c 3 ] = ( b 2 c 3 − b 3 c 2 ) i − ( b 1 c 3 − b 3 c 1 ) j + ( b 1 c 2 − b 2 c 1 ) k \mathbf{b} \times \mathbf{c} = \begin{bmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ b_1 & b_2 & b_3 \\ c_1 & c_2 & c_3 \end{bmatrix} = (b_2c_3 - b_3c_2)\mathbf{i} - (b_1c_3 - b_3c_1)\mathbf{j} + (b_1c_2 - b_2c_1)\mathbf{k} b×c= ib1c1jb2c2kb3c3 =(b2c3b3c2)i(b1c3b3c1)j+(b1c2b2c1)k

  • 点积 a ⋅ ( b × c ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) a(b×c)

a ⋅ ( b × c ) = a 1 ( b 2 c 3 − b 3 c 2 ) + a 2 ( b 3 c 1 − b 1 c 3 ) + a 3 ( b 1 c 2 − b 2 c 1 ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) = a_1(b_2c_3 - b_3c_2) + a_2(b_3c_1 - b_1c_3) + a_3(b_1c_2 - b_2c_1) a(b×c)=a1(b2c3b3c2)+a2(b3c1b1c3)+a3(b1c2b2c1)

这正是对应的 3 × 3 3 \times 3 3×3 行列式展开式。
 

1.4 标量三重积的性质

1.4.1 交换性

标量三重积具有循环交换的性质:

a ⋅ ( b × c ) = b ⋅ ( c × a ) = c ⋅ ( a × b ) \mathbf{a} \cdot (\mathbf{b} \times \mathbf{c}) = \mathbf{b} \cdot (\mathbf{c} \times \mathbf{a}) = \mathbf{c} \cdot (\mathbf{a} \times \mathbf{b}) a(b×c)=b(c×a)=c(a×b)

但改变叉积的顺序会改变符号:

a ⋅ ( b × c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值