第 3 章练习:坐标空间与调试
对应教程:03 坐标空间、颜色与调试
起始示例:坐标空间可视化,修改 03-spaces.js,必要时修改 03-spaces.html。
练习 1:记录坐标空间的变化
依次选择“局部空间”“世界空间”“观察空间”,先只移动模型,再把模型复位并只移动相机。
**目标:**写下每种模式中“同一个模型点的颜色”是否随上述操作改变,并解释依据。
**完成标准:**能填写下表,并区分“物体在屏幕上的位置改变”和“物体表面某个点对应的颜色改变”。
| 可视化模式 | 移动模型后,同一个模型点的颜色? | 移动相机后,同一个模型点的颜色? |
|---|---|---|
| 局部空间 | ||
| 世界空间 | ||
| 观察空间 |
练习 2:替换位置计算公式
**目标:**用 modelViewMatrix 计算 gl_Position,并保持三个颜色模式可用。
**要求:**顶点着色器中的 vWorldPosition 和 vViewPosition 仍要赋值;只替换写入 gl_Position 的那一行。
**完成标准:**相机和模型滑块的行为与原示例相同,立方体位置不跳动。
练习 3:把观察空间深度变成灰度
**目标:**新增一个“观察空间深度”模式,用灰度表示片元离相机的大致距离。
**要求:**使用已有 vViewPosition.z;增加一个模式选项。在本示例中,用 6.0 作为显示尺度。
**完成标准:**新增模式能显示明暗差别;移动模型和相机时,深度变化对应的灰度也改变。
<details> <summary>提示</summary>
相机前方的观察空间 Z 通常为负值,取反后得到正数,再除以显示尺度。
</details>
<a id=“reference-answers”></a>
第 3 章练习参考解答
对应练习:坐标空间与调试。
练习 1:记录坐标空间的变化
| 可视化模式 | 移动模型后,同一个模型点的颜色? | 移动相机后,同一个模型点的颜色? |
|---|---|---|
| 局部空间 | 不变 | 不变 |
| 世界空间 | 改变 | 不变 |
| 观察空间 | 改变 | 改变 |
这里比较的是同一个局部点的颜色。移动模型或相机,立方体在屏幕上可能移动、旋转或改变投影,但这与局部点的颜色是否变化是两件事。世界空间的位置不随相机移动;观察空间的位置随相机移动。
练习 2:替换位置计算公式
在 03-spaces.js 的顶点着色器中,把最后一行改为:
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
保留上方 worldPosition、viewPosition 及两个 varying 的赋值。对于本示例的普通网格,modelViewMatrix 等于 viewMatrix * modelMatrix,所以立方体投影位置不变。
练习 3:把观察空间深度变成灰度
在 03-spaces.html 的模式下拉框中增加:
<option value="3">观察空间深度</option>
在 03-spaces.js 的片元着色器中,将 vec3 color = ... 一行改成条件分支:
vec3 color;
if ( uMode == 3 ) {
float depthGray = -vViewPosition.z / 6.0;
color = vec3( depthGray );
} else {
color = positionToShow * 0.2 + 0.5;
}
在示例的相机和模型范围内,相机前方的 vViewPosition.z 为负,取反并除以 6.0 后落在便于观察的灰度范围。这个灰度只是调试映射,并不等于深度缓冲区中的非线性深度值。改动前后的三个原有模式仍走 else 分支。