基础-几何
1.1.矢量
1.1.1.定义
以三维空间为例,定义三维空间坐标系x,y,z对应三个单位矢量i,j,k。
上述i,j,k另一个数值表示形式为(1,0,0),(0,1,0),(0,0,1)。
1.1.2.运算
矢量立足于其数值表现形式支持一下运算:
1.矢量相加
2.矢量相减
3.矢量乘以数值
4.矢量的点积
设矢量a(x1,y1,z1),矢量b(x2,y2,z2),ang为a,b间的夹角。
则:a****b=|a||b|cos(ang) = x1x2+y1y2+z1z2;
其中ang采用弧度单位。其取值范围为[0, PI]。矢量方向相同时角度为0,方向相反时角度为PI,垂直时角度为PI/2。值得注意的是点积的结果是数值。
5.矢量的叉积
设矢量a(x1,y1,z1),矢量b(x2,y2,z2),ang为a,b间的夹角。
首先矢量a,b的叉积结果是一个矢量。该矢量可表示为c(y1z2-z1y2, z1x2-x1z2, x1y2-y1x2)。
然后,c的模符合:|c|=|a||b|sin(ang)。
其中ang采用弧度单位。其取值范围为[0, PI]。矢量方向相同时角度为0,方向相反时角度为PI,垂直时角度为PI/2。
值得注意的是叉积的结果是矢量。且矢量的方向可通过右手定则确定。在a,b夹角不为0的情况下,其叉积必然垂直于a,b所在的平面。也必然分别垂直于a,b。
1.2.平面,曲线,曲面基础表达式
1.2.1.空间平面方程
三维空间平面方程形式为:ax + by + cz + d = 0
给定上述形式的平面方程,n(a,b,c)必然是平面的方向矢量。
平面的法向矢量垂直于平面内任何一条直线。
给定平面内不共线p0,p1,p2三个点可以唯一确定平面方程:
1.求取矢量p0p1,p1p2的叉积。用叉积的x,y,z作为a,b,c。
2.带入p0(x0, y0, z0),易于得到d。
1.2.2.曲线与曲面表示方式
1.2.2.1.显示表示
通用形式为:
y
=
f
(
x
)
;
y = f(x);
y=f(x);
以直线为例:y = kx+b。此表达的缺陷是对形如x = 1这样平行y轴直线无法表示。
1.2.2.2.隐式表示
1.对二维曲线
通用形式为:
F
(
x
,
y
)
=
0
;
F(x, y) = 0;
F(x,y)=0;
对直线,其隐式表示为:
a
x
+
b
y
+
c
=
0
;
ax + by + c = 0;
ax+by+c=0;
对圆锥曲线,其隐式表示为:
x
x
+
y
y
+
2
x
y
+
d
x
+
e
y
+
f
=
0
;
xx+yy+2xy+dx+ey+f=0;
xx+yy+2xy+dx+ey+f=0;
2.对三维曲面
通用形式为:
F
(
x
,
y
,
z
)
=
0
;
F(x,y,z) = 0;
F(x,y,z)=0;
对平面:
a
x
+
b
y
+
c
z
+
d
=
0
;
ax+by+cz+d=0;
ax+by+cz+d=0;
对圆心位于原点,半径为r的球面:
x
x
+
y
y
+
z
z
−
r
r
=
0
;
xx+yy+zz-rr = 0;
xx+yy+zz−rr=0;
隐式表示更通用(相对于显式表示下单一方程无法描述某些场景而言),但难以求解曲线,曲面上的点。
1.2.2.3.参数表示
1.对曲线
二维曲线通用形式为:
x
=
f
1
(
t
)
;
y
=
f
2
(
t
)
;
0
<
=
t
<
=
1
;
x = f1(t); y = f2(t);0<=t<=1;
x=f1(t);y=f2(t);0<=t<=1;
三维曲线通用形式为:
x
=
f
1
(
t
)
;
y
=
f
2
(
t
)
;
z
=
f
3
(
t
)
;
0
<
=
t
<
=
1
;
x=f1(t);y=f2(t);z=f3(t);0<=t<=1;
x=f1(t);y=f2(t);z=f3(t);0<=t<=1;
以启点p0(x0, y0, z0),终点p1(x1, y1, z1)的直线的参数表示为例:
x
=
(
1
−
t
)
x
0
+
t
x
1
;
y
=
(
1
−
t
)
y
0
+
t
y
1
;
z
=
(
1
−
t
)
z
0
+
t
z
1
;
0
<
=
t
<
=
1
;
x=(1-t)x0+tx1;y=(1-t)y0+ty1;z=(1-t)z0+tz1;0<=t<=1;
x=(1−t)x0+tx1;y=(1−t)y0+ty1;z=(1−t)z0+tz1;0<=t<=1;
在曲线的参数表示下,给定曲线上任意一点p(x, y, z),将其看成矢量p。这时可以为曲线规定方向。曲线方向对应于曲线上参数增加的方向。
给定曲线参数方程,对其x,y,z的每个维度分别对t求导,
x
′
=
f
1
′
(
t
)
;
y
′
=
f
2
′
(
t
)
;
z
′
=
f
3
′
(
t
)
;
0
<
=
t
<
=
1
;
x'=f1'(t);y'=f2'(t);z'=f3'(t);0<=t<=1;
x′=f1′(t);y′=f2′(t);z′=f3′(t);0<=t<=1;
给定t值,p’(x’, y’, z’)可认为曲线在t值时候的切线方向矢量。
在曲线的参数表示形式下有个值得关注的特例:曲线的基表示形式。
三维曲线基表示形式为:
x
=
a
0
,
0
f
0
,
0
(
t
)
+
a
0
,
1
f
0
,
1
(
t
)
+
.
.
.
+
a
0
,
n
f
0
,
n
(
t
)
;
x=a_{0,0}f_{0,0}(t)+a_{0,1}f_{0,1}(t)+...+a_{0,n}f_{0,n}(t);
x=a0,0f0,0(t)+a0,1f0,1(t)+...+a0,nf0,n(t);
y = a 1 , 0 f 1 , 0 ( t ) + a 1 , 1 f 1 , 1 ( t ) + . . . + a 1 , n f 1 , n ( t ) ; y=a_{1,0}f_{1,0}(t)+a_{1,1}f_{1,1}(t)+...+a_{1,n}f_{1,n}(t); y=a1,0f1,0(t)+a1,1f1,1(t)+...+a1,nf1,n(t);
z = a 2 , 0 f 2 , 0 ( t ) + a 2 , 1 f 2 , 1 ( t ) + . . . + a 2 , n f 2 , n ( t ) ; z=a_{2,0}f_{2,0}(t)+a_{2,1}f_{2,1}(t)+...+a_{2,n}f_{2,n}(t); z=a2,0f2,0(t)+a2,1f2,1(t)+...+a2,nf2,n(t);
其中每个f_{i, j}(t)均为一个独立的关于t的函数。a_{i,j}为系数。
2.对曲面
曲面的参数表示
三维曲面通用表示形式为:
x
=
f
1
(
u
,
v
)
;
y
=
f
2
(
u
,
v
)
;
z
=
f
3
(
u
,
v
)
;
x=f1(u,v); y=f2(u,v); z=f3(u,v);
x=f1(u,v);y=f2(u,v);z=f3(u,v);
即每个分量均通过一个由u,v构成的独立函数来决定。
通过确定u,v数值,可以唯一确定三维曲面上一个点。
分别对每个分量上方程对u求取导数,可以获得给定u值下,曲面上点的切线方向矢量。
分别对每个分量上方程对v求取导数,可以获得给定v值下,曲面上点的切线方向矢量。
在上述两个方向矢量不平行或反向下,求取两个矢量的叉积,即可得到曲面上(u,v)所确定点上的法线方向矢量。
在曲面的参数表示形式下有个值得关注的特例:曲面的基表示形式。
p
(
u
,
v
)
=
∑
i
=
0
m
∑
j
=
0
n
f
1
i
(
u
)
f
2
j
(
v
)
a
i
,
j
p(u, v) = \sum_{i=0}^{m} \sum_{j=0}^{n} f1_{i}(u) f2_{j}(v) a_{i,j}
p(u,v)=i=0∑mj=0∑nf1i(u)f2j(v)ai,j
值得注意的是:上述p(u, v)是矢量形式,即其由三个分量(x, y, z)组成。f1_{i}(u),f2_{j}(v)分别是关于u与v的独立函数,也是矢量形式,即由三个分量组成。每个分量均是一个独立的关于因变量的函数。a_{i}{j}是系数,也是矢量形式,即由三个分量组成。
后续的贝塞尔曲面,样条曲面,Nurbs曲面均会采用此形式,到时再具体分析。
1.3.连续性
1.3.1.参数连续性
零阶连续性:相邻两段曲线在邻接点处坐标一致。
一阶连续性:相邻两段曲线在邻接点处一阶导数相同。此时坐标也必然一致。
二阶连续性:相邻两段曲线在邻接点处二阶导数相同。此时一阶导数也必然 。
1.3.2.几何连续性
零阶连续性:相邻两段曲线在邻接点处坐标一致。
一阶连续性:相邻两段曲线在邻接点处一阶导数成比例。
二阶连续性:相邻两段曲线在邻接点处一阶导数,二阶导数均成比例。
成比例的意思以三维曲线参数表示为例,某点处一阶导数,针对x,y,z分量分别有一个值。假设曲线1在邻接点一阶导数为p1’(x1’, y1’, z1’),假设曲线2在邻接点一阶导数为p2’(x2’, y2’, z2’),有:
x
1
′
=
a
∗
x
2
′
;
y
1
′
=
a
∗
y
2
′
;
z
1
′
=
a
∗
z
2
′
;
x1' = a*x2';y1' = a*y2';z1' = a*z2';
x1′=a∗x2′;y1′=a∗y2′;z1′=a∗z2′;
上述a为系数。
1.4.曲线的自然参数方程
应用弧长积分公式,可计算该曲线上任意点p(x, y, z)到p0之间的弧长。这样曲线上点p的位置与该点处的弧长s是一一对应的。以弧长s作为曲线方程参数。
x
=
f
1
(
s
)
;
y
=
f
2
(
s
)
;
z
=
f
3
(
s
)
;
x=f1(s);y=f2(s);z=f3(s);
x=f1(s);y=f2(s);z=f3(s);
值得注意的是可以证明:
∣
p
′
(
s
)
∣
=
s
q
r
t
(
f
1
′
(
s
)
2
+
f
2
′
(
s
)
2
+
f
3
′
(
s
)
2
)
=
1
。
|p'(s)|=sqrt(f1'(s)^2+f2'(s)^2+f3'(s)^2)=1。
∣p′(s)∣=sqrt(f1′(s)2+f2′(s)2+f3′(s)2)=1。
求取弧长:
L
=
∫
a
b
(
x
′
(
t
)
)
2
+
(
y
′
(
t
)
)
2
+
(
z
′
(
t
)
)
2
d
t
L = \int_{a}^{b} \sqrt{(x'(t))^2 + (y'(t))^2 + (z'(t))^2} dt
L=∫ab(x′(t))2+(y′(t))2+(z′(t))2
dt
其中a,b是参数t的变化区间。
推导过程为:
d
x
=
d
x
d
t
d
t
=
x
′
(
t
)
d
t
dx = \frac{dx}{dt} dt = x'(t) dt
dx=dtdxdt=x′(t)dt
d y = d y d t d t = y ′ ( t ) d t dy = \frac{dy}{dt} dt = y'(t) dt dy=dtdydt=y′(t)dt
d z = d z d t d t = z ′ ( t ) d t dz = \frac{dz}{dt} dt = z'(t) dt dz=dtdzdt=z′(t)dt
d s = s q r t ( d x 2 + d y 2 + d z 2 ) = ( x ′ ( t ) ) 2 + ( y ′ ( t ) ) 2 + ( z ′ ( t ) ) 2 d t ds = sqrt(dx^2+dy^2+dz^2)=\sqrt{(x'(t))^2 + (y'(t))^2 + (z'(t))^2} dt ds=sqrt(dx2+dy2+dz2)=(x′(t))2+(y′(t))2+(z′(t))2 dt
1.5.活动标架
对曲线的自然参数方程:
x
=
f
1
(
s
)
;
y
=
f
2
(
s
)
;
z
=
f
3
(
s
)
;
x=f1(s);y=f2(s);z=f3(s);
x=f1(s);y=f2(s);z=f3(s);
取坐标系原点和曲线p上的动点P重合,使得整个坐标系随P点的运动而运动,这种坐标系称为活动坐标系。
1.第一个坐标轴
零矢量axis1(f1’(s), f2’(s), f3’(s))为第一个坐标轴的方向,前面已经说明axis1是单位矢量。
2.第二个坐标轴
由于
f
1
′
(
s
)
2
+
f
2
′
(
s
)
2
+
f
3
′
(
s
)
2
=
1
;
f1'(s)^2+f2'(s)^2+f3'(s)^2=1;
f1′(s)2+f2′(s)2+f3′(s)2=1;
上式两边对s求取导数:
2
f
1
′
(
s
)
f
1
′
′
(
s
)
+
2
f
2
′
(
s
)
f
2
′
′
(
s
)
+
2
f
3
′
(
s
)
f
3
′
′
(
s
)
=
0
;
2f1'(s)f1''(s)+2f2'(s)f2''(s)+2f3'(s)f3''(s)=0;
2f1′(s)f1′′(s)+2f2′(s)f2′′(s)+2f3′(s)f3′′(s)=0;
看成矢量点积的形式,可得:
(
f
1
′
(
s
)
,
f
2
′
(
s
)
,
f
3
′
(
s
)
)
∗
(
f
1
′
′
(
s
)
,
f
2
′
′
(
s
)
,
f
3
′
′
(
s
)
)
=
0
;
(f1'(s),f2'(s),f3'(s))*(f1''(s),f2''(s),f3''(s))=0;
(f1′(s),f2′(s),f3′(s))∗(f1′′(s),f2′′(s),f3′′(s))=0;
所以,可知矢量(f1’‘(s),f2’‘(s),f3’'(s))和axis1垂直,令其为第二个坐标轴。由于其不是单位矢量。假设此方向上单位矢量为axis2,axis2也称为主法线矢量,其总是指向曲线凹入的方向。有:
(
f
1
′
′
(
s
)
,
f
2
′
′
(
s
)
,
f
3
′
′
(
s
)
)
=
k
(
s
)
∗
a
x
i
s
2
;
(f1''(s),f2''(s),f3''(s))=k(s)*axis2;
(f1′′(s),f2′′(s),f3′′(s))=k(s)∗axis2;
其中k(s)是一个和s取值有关的系数。称其为曲线在s处的曲率。称为1/k(s)为曲率半径。曲率半径反映的是曲线在此点处的弯曲程度。
3.第三个坐标轴
axis1叉积axis2得到一个垂直于两者的矢量,且此矢量必然是单位矢量,记为axis3。
取axis3方向为第三个坐标轴方向。也称其为单位副法线矢量。
这样便构成一个活动坐标系。
通过点P,由axis1,axis2构成的平面称为密切平面。
通过点P,由axis1,axis3构成的平面称为从切平面。
通过点P,由axis2,axis3构成的平面称为法平面。
补充知识:三维曲线挠率。
从上述可知axis3矢量的每个分量也是关于s的方程。记axis3为(t1(s), t2(s), t3(s)),则(t1’(s), t2’(s), t3’(s))反映s处密切平面法向变化率。
已知:
(
t
1
′
(
s
)
,
t
2
′
(
s
)
,
t
3
′
(
s
)
)
=
−
a
∗
a
x
i
s
2
;
(t1'(s), t2'(s), t3'(s))= -a*axis2;
(t1′(s),t2′(s),t3′(s))=−a∗axis2;
其中a为系数。称其为挠率。
1.6.型值点,插值,逼近,控制点
1.型值点
通过测量得到的一组描述曲线或曲面几何形状的数据点。
2.插值
基于型值点得到其他点的值。
3.逼近
型值点太多时,构造曲线使其通过所有型值点变得困难,此时构造一个曲线方程在某种意义下最佳逼近这些型值点。
插值与逼近统称为拟合。
4.控制点
用来控制或调整曲线曲面形状的控制多边形的顶点。
1.7.三维变换与投影
1.7.1.坐标系
1.世界坐标系
右手坐标系:
右手握拳从x到y,大拇指方向为z轴。
左手坐标系:
左手握拳从x到y,大拇指方向为z轴。
2.建模坐标系
对物体建模使用的坐标系,也叫局部坐标系。
3.观察坐标系
观察坐标系:以眼睛/相机作为原点,视线方向作为z方向,采用左手坐标系。
4.屏幕坐标系
三维显示上三维空间物体最终在视线方向到物体中间的某个平面(屏幕)上显示。显示的是三维物体在此平面的投影。对屏幕坐标系,原点一般位于窗口客户区中心,x轴水平向右,y轴垂直向上。
5.设备坐标系
显示设备自身持有一个坐标系。原点位于平面左上角,x轴水平向右,y轴垂直向下,基本单位为像素。
1.7.2.三维几何变换
对物体的变换,最后都是通过对三维点的变换来切入的。通过齐次矩阵来作为实现点变换的工具。
1.平移变换
希望对P(x,y,z)执行三个轴为(tx,ty,tz)的平移变换。令平移后的点为P’(x’, y’, z’)。
x
′
=
x
+
t
x
;
y
′
=
y
+
t
y
;
z
′
=
z
+
t
z
;
x'=x+tx;y'=y+ty;z'=z+tz;
x′=x+tx;y′=y+ty;z′=z+tz;
用齐次矩阵进行等价表示为:
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
[
x
y
z
1
]
=
[
x
+
t
x
y
+
t
y
z
+
t
z
1
]
\begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} = \begin{bmatrix} x + t_x \\ y + t_y \\ z + t_z \\ 1\ \end{bmatrix}
100001000010txtytz1
xyz1
=
x+txy+tyz+tz1
上述齐次矩阵即为三维平移变换矩阵。
2.旋转变换
旋转变换首先得有旋转轴。右手大拇指指向旋转轴正向,四指的转向为转角正方向。
2.1.饶x轴旋转
希望对P(x,y,z)执行绕x轴的旋转变换。令旋转ang角度后的点为P’(x’, y’, z’)。
我们分析绕轴旋转:
a.确定投影点
轴是三维直线。首先求取三维点到此三维直线投影点。
投影点位于直线上,点和投影构成的矢量和直线垂直。
以绕x轴为例,设P(x0,y0,z0),则投影点为:P0(x0, 0, 0)。
b.确定投影半径
投影半径为点和投影点距离。
以绕x轴为例,设P(x0,y0,z0),则投影半径为:
∣
P
P
0
∣
=
s
q
r
t
(
y
0
2
+
z
0
2
)
;
|PP0|=sqrt(y0^2+z0^2);
∣PP0∣=sqrt(y02+z02);
c.确定旋转结果
三维点绕轴旋转形成的是三维圆形曲线。
以绕x轴为例,设P(x0, y0, z0)。
旋转形成的曲线构成的圆形曲线为以投影点为圆心,以投影半径为半径,落在以x轴为法线平面上。此曲线方程为:
x
=
x
0
;
(
y
−
y
0
)
2
+
(
z
−
z
0
)
2
=
s
q
r
t
(
y
0
2
+
z
0
2
)
;
x = x0; (y-y0)^2+(z-z0)^2=sqrt(y0^2+z0^2);
x=x0;(y−y0)2+(z−z0)2=sqrt(y02+z02);
将上述方程以旋转角度为参数的参数方程形式给出,结果为:
x
=
x
0
;
y
=
y
0
c
o
s
(
a
n
g
)
−
z
0
s
i
n
(
a
n
g
)
;
z
=
y
0
s
i
n
(
a
n
g
)
+
z
0
c
o
s
(
a
n
g
)
;
x=x0;\\ y=y0cos(ang)-z0sin(ang);\\ z=y0sin(ang)+z0cos(ang);\\
x=x0;y=y0cos(ang)−z0sin(ang);z=y0sin(ang)+z0cos(ang);
用齐次矩阵进行等价表示为:
[
1
0
0
0
0
c
o
s
(
a
n
g
)
−
s
i
n
(
a
n
g
)
0
0
s
i
n
(
a
n
g
)
c
o
s
(
a
n
g
)
0
0
0
0
1
]
[
x
y
z
1
]
=
[
x
y
c
o
s
(
a
n
g
)
−
z
s
i
n
(
a
n
g
)
y
s
i
n
(
a
n
g
)
+
z
c
o
s
(
a
n
g
)
1
]
\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos(ang) & -sin(ang) & 0 \\ 0 & sin(ang) & cos(ang) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} = \begin{bmatrix} x \\ ycos(ang)-zsin(ang) \\ ysin(ang)+zcos(ang) \\ 1\ \end{bmatrix}
10000cos(ang)sin(ang)00−sin(ang)cos(ang)00001
xyz1
=
xycos(ang)−zsin(ang)ysin(ang)+zcos(ang)1
2.2.类似的可以得到绕y轴旋转的齐次矩阵表示形式
[
c
o
s
(
a
n
g
)
0
s
i
n
(
a
n
g
)
0
0
1
0
0
−
s
i
n
(
a
n
g
)
0
c
o
s
(
a
n
g
)
0
0
0
0
1
]
[
x
y
z
1
]
=
[
z
s
i
n
(
a
n
g
)
+
x
c
o
s
(
a
n
g
)
y
z
c
o
s
(
a
n
g
)
−
x
s
i
n
(
a
n
g
)
1
]
\begin{bmatrix} cos(ang) & 0 & sin(ang) & 0 \\ 0 & 1 & 0 & 0 \\ -sin(ang) & 0 & cos(ang) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} = \begin{bmatrix} zsin(ang)+xcos(ang) \\ y \\ zcos(ang)-xsin(ang) \\ 1\ \end{bmatrix}
cos(ang)0−sin(ang)00100sin(ang)0cos(ang)00001
xyz1
=
zsin(ang)+xcos(ang)yzcos(ang)−xsin(ang)1
2.3.用类似方法可得绕z轴旋转的齐次矩阵表示形式
[
c
o
s
(
a
n
g
)
−
s
i
n
(
a
n
g
)
0
0
s
i
n
(
a
n
g
)
c
o
s
(
a
n
g
)
0
0
0
0
1
0
0
0
0
1
]
[
x
y
z
1
]
=
[
x
c
o
s
(
a
n
g
)
−
y
s
i
n
(
a
n
g
)
x
s
i
n
(
a
n
g
)
+
y
c
o
s
(
a
n
g
)
z
1
]
\begin{bmatrix} cos(ang) & -sin(ang) & 0 & 0 \\ sin(ang) & cos(ang) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} = \begin{bmatrix} xcos(ang)-ysin(ang) \\ xsin(ang)+ycos(ang) \\ z \\ 1\ \end{bmatrix}
cos(ang)sin(ang)00−sin(ang)cos(ang)0000100001
xyz1
=
xcos(ang)−ysin(ang)xsin(ang)+ycos(ang)z1