本文根据教程:ogldev进行扩充学习,一步步从零开始,记录学习历程
之前已经学习了怎么将物体在3维空间里自由地缩放、旋转和平移,博客链接如下:
OpenGL学习之路6—-平移,旋转和缩放变换
也学习怎么把三维世界表现在我们屏幕这个2维平面上,博客链接如下:
但是我们发现了一个问题,我们默认的视点(就是我们观察的地点)都是在原点并且看向Z轴的正方向,我们希望能够从三维空间的任意地方观察我们的物体,这次我们就学习如何任意移动我们的观察地点(称作相机)
一、数学基础
1.1 点积
1.1.1 几何定义:
设二维空间内有两个向量a和b,它们的夹角为φ(0≤φ≥π),则点积为:
a · b= ||a|| * ||b|| * cosφ
- 向量a和b点积的值即为a的长度乘b的长度乘夹角的余弦值(这个定义只对二维和三维空间有效)
- 如果a和b向量都为单位向量,则点积的结果为夹角的余弦值
定义向量a到向量b的投影为
a -> b
示意图如下:
则可以推出以下公式:
a -> b = ||a|| * cosφ = a · b / ||b||
可以看到如果b是单位向量,则点积即是向量a到向量b的投影
1.1.2 代数定义
二维空间中的两个向量a=(xa,ya)和b=(xb,yb),根据
X · X = Y · Y = 1
X · Y = 0
可以得到a和b的点积为:
a · b = (xaX+yaY) · (xbX+ybY)
= xaxb(X·X)+xayb(X·Y)+xbya(Y·X)+yayb(Y·Y)
= xaxb + yayb
可以推出三维空间a=(xa,ya,za),b=(xb,yb,zb)向量的点积为
a · b = xaxb + yayb + zazb
1.2 叉积
1.2.1 叉积定义
叉积定义为:
a × b = a*b*sinθ
- 叉积a × b返回一个三维向量,该向量与另外两个向量a和b都正交长度为:
||a × b|| = ||a|| * ||b|| * sinθ
三维向量a=(xa,xb,xz),b=(xb,yb,zb)的叉积为
a∗b=(xaX+yaY+zaZ)∗(xbX+ybY+zbZ)=(yazb−za