对象 | 定位 | 场景范围 | 成像 | |
---|---|---|---|---|
照相 | 自然景物 | 设定相机位置、方向、相机的正向上方向 | 改变相机焦距大小 | 胶片 |
三维观察 | 三维虚拟场景 | 设置三维观察坐标系 | 选定观察体大小 | 观察平面 |
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz,
GLdouble upx, GLdouble upy, GLdouble upz)
函数参数中:
点(eyex, eyey, eyez)代表眼睛所在位置 p 0 p_0 p0;
点(centerx, centery,centerz)代表眼睛看向的位置;
向量(upx, upy, upz)代表视线向上方向,其中视点和参考点的连线与视线向上方向要保持垂直关系。(这个是view-up vector,为什么我们需要这个向量呢?因为我们可以歪着头看物品)
gluLookAt
的时候非常容易输入不精确(不和N严格垂直),所以观察函数一般会自动调整向量V的方向。https://blog.csdn.net/smilejiasmile/article/details/79606234
**问题:**已知MC在WC的原点坐标为(4,3),在MC坐标上有点p(1,1),求转换矩阵和这个点在WC的位置(用列向量表示)。
解:设点 p ( x , y ) p(x,y) p(x,y) 变换后的点为 p ′ ( x ′ , y ′ ) p'(x',y') p′(x′,y′),假设MC开口朝右(只是便于理解),那么我们的坐标系就不用通过旋转,那么有 x ′ = x + T x , y ′ = y + T y x'=x+T_x,y'=y+T_y x′=x+Tx,y′=y+Ty
于是转换矩阵易得为 [ x ′ y ′ 1 ] = [ 1 0 T x 0 1 T y 0 0 1 ] ⋅ [ x y 1 ] = [ x + T x y + T y 1 ] \begin{bmatrix} x'\\y'\\1 \end{bmatrix}=\begin{bmatrix} 1 & 0 & T_x\\0 & 1 & T_y\\0 & 0 & 1\end{bmatrix}\cdot \begin{bmatrix} x\\y\\1 \end{bmatrix}= \begin{bmatrix} x+T_x\\y+T_y\\1 \end{bmatrix} ⎣⎡x′y′1⎦⎤=⎣⎡100010TxTy1⎦⎤⋅⎣⎡xy1⎦⎤=⎣⎡x+Txy+Ty1⎦⎤
带入 x = 0 , y = 0 , x ′ = 4 , y ′ = 3 x = 0,y = 0,x' = 4,y' = 3 x=0,y=0,x′=4,y′=3,则求出 T x = 4 , T y = 3 T_x = 4, T_y = 3 Tx=4,Ty=3。
此时再带入 x ′ = 1 , y ′ = 1 x' = 1,y' = 1 x′=1,y′=1求出 x = 5 , y = 4 x = 5,y = 4 x=5,y=4,这不是我们想要的结果,因为MC的开口朝左。此时我们需要让WC开口逆旋转90°。
{ x = r cos α y = r sin α \left\{ \begin{aligned} x =r \cos \alpha \\ y =r \sin \alpha \\ \end{aligned} \right. {x=rcosαy=rsinα
{ x ′ = r cos ( α + θ ) = r c o s α c o s θ − r s i n a α s i n θ y ′ = r sin ( α + θ ) = r c o s α s i n θ + r s i n α c o s θ \left\{ \begin{aligned} x' =r \cos (\alpha+\theta) = rcos\alpha cos\theta - rsina \alpha sin\theta\\ y' =r \sin (\alpha+\theta) = rcos\alpha sin\theta+rsin\alpha cos\theta \\ \end{aligned} \right. {x′=rcos(α+θ)=rcosαcosθ−rsinaαsinθy′=rsin(α+θ)=rcosαsinθ+rsinαcosθ
将上面的 x , y x,y x,y带入下面的式子即可得到
{ x ′ = x c o s θ − y s i n θ y ′ = x s i n θ + y c o s θ \left\{ \begin{aligned} x' =xcos\theta - ysin\theta\\ y' =xsin\theta+ycos\theta \\ \end{aligned} \right. {x′=xcosθ−ysinθy′=xsinθ+ycosθ
于是即可推出
[ x ′ y ′ 1 ] = [ x y 1 ] ⋅ [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] \begin{bmatrix} x'\\y'\\1 \end{bmatrix}=\begin{bmatrix} x\\y\\1 \end{bmatrix}\cdot \begin{bmatrix} cos\theta & sin\theta & 0\\-sin\theta & cos\theta & 0\\0 & 0 & 1\end{bmatrix} ⎣⎡x′y′1⎦⎤=⎣⎡xy1⎦⎤⋅⎣⎡cosθ−sinθ0sinθcosθ0001⎦⎤
代入 θ = 90 ° \theta = 90° θ=90°,则矩阵变成 [ 0 1 0 − 1 0 0 0 0 1 ] \begin{bmatrix} 0 & 1 & 0\\-1 & 0 & 0\\0 & 0 & 1\end{bmatrix} ⎣⎡0−10100001⎦⎤
把(1,1)乘以旋转矩阵
[ 1 1 1 ] ⋅ [ 0 1 0 − 1 0 0 0 0 1 ] = [ 1 − 1 1 ] \begin{bmatrix} 1\\1\\1 \end{bmatrix}\cdot \begin{bmatrix} 0 & 1 & 0\\-1 & 0 & 0\\0 & 0 & 1\end{bmatrix}=\begin{bmatrix} 1\\-1\\1 \end{bmatrix} ⎣⎡111⎦⎤⋅⎣⎡0−10100001⎦⎤=⎣⎡1−11⎦⎤
再把结果代入之前的平移矩阵: [ 1 0 3 0 1 4 0 0 1 ] ⋅ [ 1 − 1 1 ] = [ 4 3 1 ] \begin{bmatrix} 1 & 0 & 3\\0 & 1 & 4\\0 & 0 & 1\end{bmatrix}\cdot \begin{bmatrix} 1\\-1\\1 \end{bmatrix} = \begin{bmatrix} 4\\3\\1 \end{bmatrix} ⎣⎡100010341⎦⎤⋅⎣⎡1−11⎦⎤=⎣⎡431⎦⎤
推导思路是完全一样的,只是变成了从WC到MC。这个是平移矩阵,我们假定世界坐标系上有一点 p 0 ( x 0 , y 0 , z 0 ) p_0(x_0,y_0,z_0) p0(x0,y0,z0),那么我们发现转换矩阵的原点坐标变成了 p 0 p_0 p0坐标的相反数,这是因为相对 p 0 p_0 p0,世界坐标系的原点坐标就是这个位置。
有正交投影视图体积就有透视投影视图体
透视投影视图体积通常被称为视觉金字塔(pyramid of vision),因为它近似于我们眼睛的视锥或相机
通过添加垂直于 z v i e w z_{view} zview轴并平行于视图平面的近和远剪裁平面,我们切除无限透视投影视图体积的一部分,以形成截断的棱锥,或者称为棱台
透视投影观察体完全可由视场角、裁剪窗口的横纵比及从投影参考点到近和远裁剪平面的距离来确定。裁剪窗口的左下角和右上角的坐标位置与棱台中心点及窗口的高、宽之间存在如下关系
x w m i n = x c − 宽 度 / 2 , x w m a x = x c + 宽 度 / 2 , y w m i n = y c − 高 度 / 2 , y w m a x = y c + 高 度 / 2 x_{wmin}=x_c-宽度/2,x_{wmax}=x_c+宽度/2,y_{wmin}=y_c-高度/2,y_{wmax}=y_c+高度/2 xwmin=xc−宽度/2,xwmax=xc+宽度/2,ywmin=yc−高度/2,ywmax=yc+高度/2
http://glasnost.itcarlow.ie/~powerk/GeneralGraphicsNotes/projection/orthographicprojection.html
https://blog.csdn.net/smilejiasmile/article/details/79606234
https://blog.csdn.net/Goncely/article/details/5397729
http://glasnost.itcarlow.ie/~powerk/GeneralGraphicsNotes/projection/orthographicprojection.html
https://blog.csdn.net/qq_16334327/article/details/81228679
https://blog.csdn.net/caoshangpa/article/details/80272903
《计算机图形学:原理及实践》
三维观察ppt