CS Basics

计算机图形学基础

视角(view)和投影(projection)变换

Reference

  1. https://krasjet.github.io/quaternion/quaternion.pdf
  2. 视角和投影变换](https://zhuanlan.zhihu.com/p/362713511))

相机变换

变换的目的是将三维图形投影到二维平面上,通过光栅化获得像素的离散表征,给定相机的位置$e$,look at方向$g$(相机朝向),up方向$t$,获得一个新坐标轴,原点在e,y轴方向和t相同,z轴方向和g相反,视角变换矩阵$M_{view}$拆分成旋转$R_{view}$和平移$T_{view}$两项

考虑三维空间中的旋转,v分解为平行和垂直分量

仅仅旋转$v_\perp$,增加一个轴,记作

将变换后的$v_\perp^\prime$分解到w和$v_\perp$方向,得到

它们的关系是

image-20240423233028735

因此新的旋转结果记作

旋转轴是一个单位向量

为了进一步讨论三维空间中的旋转,我们引入四元数,在这种情况下空间中任何一个点表示为

对应的共轭四元数为$s - v$,定义

两个四元数相乘记作

写成矩阵形式

image-20240423234104826

一对互逆的四元数满足

共轭四元数指的是

我们将$\ref{rotate_eq}$中的向量视为纯四元数

考虑垂直分量,写成纯四元数的形式

这是垂直向量的旋转公式,因此旋转被记作

对于单位向量u以及$q = [\cos\theta ,\sin\theta u]$,有$q^2 = qq = [\cos2\theta,\sin 2\theta u]$,并且q也是单位四元数,此时若$p =[\cos\frac \theta 2,\sin \frac \theta 2u]$,有$p^2 = q,p^{-1} = [\cos\frac{\theta}2 ,- \sin\frac\theta 2u]=p^*$

进一步写出

简化这个公式,介绍两个引理

image-20240424001049867

image-20240424001108272

$v^\prime$进一步优化为

这个公式表明对$v_\perp$做了正反两次旋转

最终写成终极形式,左乘四元数$a + bi +cj +dk$等价于乘以

image-20240424001358950

右乘等价于乘以矩阵

image-20240424001456714

最终写成

最终旋转定理写成

image-20240424001541332

v最后一维是0,因此取上三角

image-20240424001605722

alpha-blending

渲染过程中引入透明度的概念,考虑光线可以经过面元的情况,对于渲染管线,引入$\alpha$参数描述图层的透明度

深度缓冲(物体之间完全遮挡,不考虑物体的透明度)

为每个像素构建如下缓冲

  1. 深度缓冲,记录距离相机最近的面元深度
  2. 帧缓冲,记录像素点颜色

渲染对于每个面元先进行深度测试,舍去比Z-buffer更远的面元,深度写入更新Z-buffer

透明度混合:存在透明物体进行渲染

不透明不透明不透明不透明不透明*片元的深度值,渲染透明片元仍然应该进行深度测试,避免不透明物体在透明物体之前的情况

先渲染透明片元,在渲染不透明片元,因为透明片元不写到Z-buffer中,如何判断两者的深度,这里提供两条原则

  1. 透明片元按照深度逐个渲染
  2. 不透明片元优先于透明片元进行渲染(深度测试不为空)
本站访客数人次