# 不同坐标空间存在的意义

在图形渲染中,常常会分为 相机意义下的坐标空间 世界意义下的坐标空间 …

其实这些空间就类似于一种 相对位置 的概念,比如我说:我正前方 50 米 与 我说:这个房间的正中间 总之,不同的坐标空间会使得变换更容易被编程人员理解

# 铺垫:在渲染流水线中 我们如何把一个点或方向从一个坐标空间变换到另一个坐标空间 (这题目有点长,再加点吧)

  1. 我们需要确定相对坐标系的原点位置
  2. 基于 1 我们可以得到这个相对坐标系下的坐标

基于上两条,我们可以得到相对当前坐标系下的坐标,但是这个坐标系可能会存在一个父坐标系,或者子坐标系.
那么我们如何通过当前坐标系下的坐标来获得该点在父坐标系下的坐标就需要通过 变换 来实现。举个栗子:需求: 1. 父坐标空间PP, 子坐标空间CC A_p=M_c>pA_cA\_{p} = M\_{c->p}A\_{c} B_c=M_p>cB_pB\_{c} = M\_{p->c}B\_{p} 上述两个公式就代表了 矢量 A 从子空间转到父空间
矢量 B 从父空间到子空间
MM 就是变换矩阵 且 M\_{c->p} = (M\_{p->c})^

# 模型空间

模型空间就是对于一个模型的每个部分的相对坐标

# 世界坐标

在一个渲染引擎中,会有一个世界空间,这个空间是整个流程中唯一的

# 模型空间转换到世界空间

在入门精要 P74 上有这样一张图,小牛从世界坐标 0,0,0 点转换到大牛的位置 如果我们想要得到这个小牛身上每个部分在世界空间上的坐标,就需要得到 转换矩阵 那么这个矩阵怎么得到的呢?
我们可以这样想,如果我们得到了世界空间下原点到模型空间下原点的转换矩阵,那是不是其他部分同样的操作就可以了?
是的 而这个矩阵如何得到呢?首先,我们可以从 Unity 的 transform 组件上得到缩放,位置,旋转这些值 在最外面一层就是世界坐标到模型坐标原点的变换操作 所有的变换乘起来就是变换矩阵
每个变换都用齐次矩阵来表示
且变换的顺序必须是:缩放 -> 旋转 -> 平移 (矩阵的乘法是要反着来) 所以: M\_{modle->world} = Vec\_{translation}\*Vec\_{rotation}\*Vec\_{scale} P_world=M_model>worldP_P\_{world} = M\_{model->world}P\_

# 观察空间

观察空间也被称为摄像机空间,在观察空间中,摄像机位于原点,(也就是说是世界在动,但是摄像机没动) 顶点坐标从世界到观察空间中这个变换叫观察变换 (view transform).

# 裁剪空间

裁剪空间就是摄像机的那个近平面与远平面,这部分可以剔除不需要渲染的顶点

# 屏幕空间 (NDC)

屏幕空间是二维空间,观察空间是三维空间,所以从观察空间到屏幕空间需要做 投影(projection)