📄 消隐理论.txt
字号:
光 线 跟 踪 法 需 要 分 析 物 体 表 面 的 每 一 点 的 光 反 射 状 态, 因 此 需 要 的 内 存 空 间 较 大, 运 算 速 度 也 较 慢。 但 这 种 方 法 可 同 时 生 成 物 体 的 光 照 模 型, 产 生 的 消 隐 效 果 和 真 实 感 都 很 好。
8 . 分 解 法
分 解 法 是 对CSG 模 型 的 一 种 消 隐 算 法, 首 先 将 复 杂 物 体 分 解 为 一 系 列 的 立 方 体, 离 观 察 点 近 的 立 方 体 将 遮 挡 远 的 立 方 体, 从 而 实 现 消 隐。 分 解 法 算 法 复 杂, 需 要 的 内 存 空 间 大, 速 度 也 满, 近 仅 用 于 一 些 特 殊 的 场 合。
二、 图 象 空 间 法
图 象 空 间 法 基 于 物 体 三 维 模 型 的 二 维 显 示 图 形 来 确 定 物 体 或 表 面 上 的 每 一 点 与 观 察 点 的 远 近 关 系, 从 而 判 断 哪 些 表 面 遮 挡 了 其 它 表 面。 为 了 获 得 三 维 物 体 的 二 维 显 示 图 形, 在 对 物 体 进 行 旋 转 和 平 移 变 化 后, 还 需 对 物 体 进 行 透 视 投 影 变 换。
三 维 空 间 中 点P(x, y, z) 由 透 视 点E 沿Z 轴 透 视 投 影 变 换 到XOY 二 维 平 面 中 的 点P*(x*, y*, z*)。 设E 点 距 原 点O 的 距 离 为r, 则 透 视 投 影 变 换 公 式 为:
(x*, y*, z*, 1)=(x, y, z, 1)MPeMPr
式 中MPe、MPr 分 别 为 透 视 变 换 矩 阵 和 投 影 变 换 矩 阵
1 . Z 缓 冲 区 法
Z 缓 冲 区 法 首 先 建 立 一 个 大 的 缓 冲 区, 用 来 存 储 三 维 物 体 沿Z 轴 透 视 投 影 而 得 到 的 二 维 图 形 的 所 有 象 素 的 值, 因 此 叫 做Z 缓 冲 区。Z 缓 冲 区 的 单 元 个 数 与 屏 幕 上 象 素 点 的 个 数 相 同, 也 和 帧 缓 冲 区 的 单 元 个 数 相 同, 而 且 它 们 之 间 是 一 一 对 应 的。Z 缓 冲 区 每 个 单 元 的 大 小 取 决 于 图 形 在 观 察 坐 标 系 中Z 方 向 的 变 化 范 围。Z 缓 冲 区 的 每 个 单 元 的 值 是 对 应 象 素 点 所 对 应 的 物 体 表 面 点 的Z 坐 标 值。
利 用Z 缓 冲 区 法 进 行 消 隐 和 造 型 的 过 程 就 是 对 屏 幕 中 每 一 点 进 行 判 断 并 给 帧 缓 冲 区 和Z 缓 冲 区 中 相 应 单 元 进 行 赋 值 的 过 程。 现 用 形 式 化 语 言 描 述 该 算 法 如 下:
Z缓冲区消隐算法
{
1)将帧缓冲区各单元的值置为背景色值;
2)将Z缓冲区各单元的值置为Z坐标可能出现的最大值;
3)循环:对每一物体
{
循环:对物体每一面的每一点(x, y, z)
{
i)对(x, y, z)做透视投影变换,得到变换后的X、Y坐标(x*, y*);
ii)如果Z缓冲区中(x*, y*)对应单元的值小于z,则
{
a)将Z缓冲区中(x*, y*)对应单元的值置为z;
b)将帧缓冲区中(x*, y*)对应单元的值置为点
(x, y, z)的属性值(通常是亮度、颜色值或颜色查找表的索引值);
}
iii)如果Z缓冲区中(x*, y*)对应单元的值大于z,则
{
a)说明目前帧缓冲区中(x*, y*)对应单元的
所表示的物体上点比点(x, y, z)
更接近观察点,即点(x, y, z)应被消隐;
b)将Z缓冲区和帧缓冲区中(x*, y*)对应单元的值均保持不变;
}
}
}
4)循环:对屏幕上每一点(x*, y*)
根据帧缓冲区中(x*, y*)对应单元的值画出象素点。
}
Z 缓 冲 区 消 隐 算 法 简 单、 可 靠, 而 且 消 隐 和 表 现 效 果 很 好。 但 需 要 的 内 存 容 量 大, 运 算 复 杂, 费 时。
2 . 扫 描 线 法
扫 描 线 法 是 对Z 缓 冲 区 法 进 行 改 进 而 派 生 出 来 的 消 隐 算 法。 为 了 克 服Z 缓 冲 区 法 需 要 分 配 与 屏 幕 上 象 素 点 的 个 数 相 同 单 元 的 巨 大 内 存 这 一 缺 点, 可 以 将 整 个 屏 幕 分 成 若 干 区 域, 一 个 区 一 个 区 地 进 行 处 理, 这 样 可 以 将Z 缓 冲 区 的 单 元 个 数 减 少 为 屏 幕 上 一 个 区 域 的 象 素 点 的 个 数。 将 屏 幕 的 一 行 作 为 这 样 的 区 域, 便 得 到 了 扫 描 线 法, 又 称 为 扫 描 线Z 缓 冲 区 法,Z 缓 冲 区 的 单 元 个 数 仅 为 屏 幕 上 一 行 的 象 素 点 的 个 数。
扫 描 线 法 的 形 式 化 语 言 描 述 如 下:
扫描线消隐算法
{
1)循环:从上到下对屏幕中每一条扫描线
{
i)将帧缓冲区对应行各单元的值置为背景色值;
ii)将Z缓冲区各单元的值置为Z坐标可能出现的最大值;
iii)循环:对每一物体
{
循环:对物体每一表面
{
如果当前扫描线与当前物体表面相交,则
{
循环:扫描线与当前物体表面的交点是成对的,
对每对交点之间的每一点(x, y, z)
{
A)对(x, y, z)做透视投影变换,
得到变换后的X、Y坐标(x*, y*);
B)如果Z缓冲区中(x*, y*)对应单元的值小于z,则
{
a)将Z缓冲区中(x*, y*)对应单元的值置为z;
b)将帧缓冲区中(x*, y*)对应单元的值置为点(x, y, z)
的属性值(通常是亮度、颜色值或颜色查找表的索引值);
}
C)如果Z缓冲区中(x*, y*)对应单元的值大于z,则
{
a)说明目前帧缓冲区中(x*, y*)对应单元的所表示
的物体上点比点(x, y, z)更接近观察点,即点(x, y, z)应被消隐;
b)将Z缓冲区和帧缓冲区中(x*, y*)对应单元的值均保持不变;
}
}
}
}
}
iv)循环:对屏幕上每一点(x*, y*)
根据帧缓冲区中(x*, y*)对应单元的值画出象素点。
}
}
3 . 视 线 投 射 法
视 线 投 射 法 的 基 本 原 理 是 把 物 体 的 二 维 显 示 图 像 看 成 是 从 眼 睛 到 物 体 的 视 线 把 物 体 的 可 见 点 投 射 到 显 示 屏 上 的 投 影。 该 算 法 的 形 式 化 语 言 描 述 如 下:
视线投射消隐算法
{
1)循环:对屏幕上每一象素(x*, y*)
{
确定经过视点和象素(x*, y*)的直线Ray;
判断直线Ray(x, y)与物体是否相交;
如果存在交点,则
{
a)求出直线Ray与物体的第一个交点(x, y, z);
b)交点(x, y, z)是可见点,其余交点都应消隐;
c)将点(x, y, z)的属性值(通常是亮度、颜色值或
颜色查找表的索引值)赋给象素(x*, y*);
}
}
2)循环:对屏幕上每一点(x*, y*)
画出象素(x*, y*)对应的属性值。
}
4 . 极 值 检 测 法
极 值 检 测 法 需 与 与 其 它 消 隐 算 法 结 合 适 用, 主 要 用 来 提 高 消 隐 速 度。 极 值 检 测 法 通 过 计 算 物 体 表 面 的 显 示 坐 标 的 极 大 和 极 小 值 来 判 断 这 两 个 表 面 是 否 存 在 重 叠。 如 果 一 个 表 面 的x 显 示 坐 标 的 极 大 值 小 于 另 一 个 表 面 的x 显 示 坐 标 的 极 小 值, 则 这 两 个 表 面 不 重 叠, 可 以 按 任 意 顺 序 直 接 画 出。 否 则, 这 两 个 表 面 存 在 重 叠, 需 要 用 其 它 消 隐 算 法 进 行 消 隐 处 理。
通 常 先 用 极 值 检 测 法 画 出 不 发 生 重 叠 的 表 面, 然 后 在 用 其 它 算 法 处 理 重 叠 的 表 面。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -