从零实现3D图像引擎:(8)参数化直线与3D平面函数库

1. 数学分析

1) 参数化直线

还记得我们在学习向量时介绍的位移向量吗?参数化直线的原理和他相同。其实所谓参数化直线,就是通过一个参数t来表示直线上的一个线段,当t为0时,则取线段的一端的端点,当t取1时,则取到另一端的端点。如图:

位移向量与参数化直线

核心原理就是向量加法的几何意义,Vd是加数,通过t(从0到1)去乘以这个Vd,则可以描述向量p,而p在某个t时的坐标值,就是从点P1到点P2的线段在t时的坐标值。注意这里我们使用的是图中的p = p1 + t * vd,这样t的取值是0到1,如果是p = p1 + t * v',那t的取值就是0到|Vd|,还需要去先算|Vd|,没有必要这么做,而且0和1是特殊的数字,运算方便。

所以参数化方程为:P(x,y,z) = p0 + v*t

 

我们为什么要用参数化的形式表示线段呢,因为在求两个线段的交点时,只要求两个参数方程组成的方程组,并求出t1和t2,只要他们都在0到1之间,那么就可以知道他们是有交点的。比如:

线段1:

x = 1 + 2*t1;

y = 3 + 4*t1;

线段2:

x = 5 + 6*t2;

y = 7 + 8*t2;

四个方程,四个未知数,可求得t1,t2,如果他们都在0和1之间,那他们相交。

具体怎么求?忘记上一章所讲的求逆矩阵的吗?要先算出行列式,然后。。。

 

注意,这里我们有很多的情况还没有考虑,比如:

1. 两条直线平行,没有交点

2. 两条线段在同一直线上,但互不重叠

3. 两条线段在同一直线上,部分重叠

4. 两条线段在同一直线上,只有一点重叠

在我的实现函数中,我把这4种特殊情况都看做是不相交或者说是无意义,当他们平行或共线时都会返回回传码0。因为这时计算出来的t1和t2以及交点都是没有任何意义的。

 

2) 3D平面

我们如何定义一个3D平面呢,看下图:

3D平面

如果你认真看图了,那么无需我多说了,只要有一个点P0,和平面的法线向量n,就可以确定一个平面了。

定义:对于空间中的任意一点P,如果线段P->P0与法线向量n垂直,则点P在平面上。

 

还记得向量点积吗?其最最重要的性质就是其几何意义:可以确定两个向量之间的夹角。当两个向量的点积为0时,这两个向量互相垂直。

所以:n.(P->P0) = 0

展开:<a, b, c> . <x-x0, y-y0, z-z0> = 0

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值