当前位置: 首页 > news >正文

【Games101】如何将屏幕坐标的重心坐标矫正至观察空间-公式推导

在光栅化三角形时,我们常使用重心坐标来判断点是否在三角形内、插值法线、插值纹理坐标,然而在光栅化三角形时计算出来的是在屏幕坐标下的重心坐标,而在运用透视投影时实际需要的应该是在观察坐标下的重心坐标,虽然不进行矫正在某种情况下看不出差别。本文将基于Games101所给的的投影矩阵进行矫正公式的推导。
首先,透视投影矩阵 \(M_{perspective}\) 如下:

\[M_{perspective}= M_{正交} \times \begin{bmatrix}n & 0 & 0 & 0\\0 & n & 0 & 0\\0 & 0 & n+f & -n \times f \\ 0 & 0 & 1 & 0 \end{bmatrix} = \begin{bmatrix}\frac{2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0\\0 & \frac{2n}{t-b} & -\frac{t+b}{t-b} & 0\\0 & 0 & \frac{n+f}{n-f} & \frac{-2nf}{n-f} \\ 0 & 0 & 1 & 0 \end{bmatrix}\]

根据正交投影的性质,可知正交投影并不会改变 \(x、y、z\) 的值,实际改变 \(x、y、z\) 的是矩阵M,其中:

\[M=\begin{bmatrix} n & 0 & 0 & 0\\0 & n & 0 & 0\\0 & 0 & n+f & -n \times f \\ 0 & 0 & 1 & 0 \end{bmatrix}\]

并且对于齐次坐标下的点P=\((x, y, z, 1)^T\),经透视投影后有\(P^{'}\)

\[M\times P=\begin{bmatrix} nx \\ ny \\ z(n+f)-nf \\ z \end{bmatrix}=z\times \begin{bmatrix} \frac{nx}{z} \\ \frac{ny}{z} \\ \frac{z(n+f)-nf}{z} \\ 1 \end{bmatrix}=z\times P^{'}\]

可以看出,经透视变换后 \(x->\frac{nx}{z}\)...。

假设观察坐标下有 点 \(P,A,B,C\) ,其在屏幕坐标下为别为 \(P^{'},A^{'},B^{'},C^{'}\)\(A,B,C\) 构成 三角形,\(P\) 在三角形\(ABC\)内。
根据重心坐标定义有:

\[P^{'}=\begin{bmatrix} A{'} \ \ \ B^{'} \ \ \ C^{'} \end{bmatrix} \times \begin{bmatrix} \alpha^{'} \\ \beta^{'} \\ \gamma^{'} \end{bmatrix} \]

同时,有 \(P^{'}=\frac{1}{P.z}M\times P\) , \(A^{'}=\frac{1}{A.z}M\times A\), \(B^{'}=\frac{1}{B.z}M\times B\), \(C^{'}=\frac{1}{C.z}M\times C\) ,带入上式中有:

\[\frac{1}{P.z}M\times P = \begin{bmatrix} \frac{1}{A.z}M\times A \ \ \ \ \frac{1}{B.z}M\times B \ \ \ \ \frac{1}{C.z}M\times C \end{bmatrix} \times \begin{bmatrix} \alpha^{'} \\ \beta^{'} \\ \gamma^{'} \end{bmatrix} \]

很容易得到以下式子:

\[\frac{1}{P.z}\times P = \begin{bmatrix} \frac{1}{A.z}\times A \ \ \ \ \frac{1}{B.z}\times B \ \ \ \ \frac{1}{C.z}\times C \end{bmatrix} \times \begin{bmatrix} \alpha^{'} \\ \beta^{'} \\ \gamma^{'} \end{bmatrix} \]

进一步,由于\(P.z,A.z,B.z,C.z\) 为标量,从而有:

\[ P = \begin{bmatrix}A \ \ \ \ B \ \ \ \ C \end{bmatrix} \times \begin{bmatrix} \frac{\alpha^{'}}{A.z}\\ \frac{\beta^{'}}{B.z} \\ \frac{\gamma^{'} }{C.z} \end{bmatrix} \times \frac{1}{P.z} \]

而这正是P的重心坐标形式。但是,我们根本不知道\(P\)的任何信息。
所幸,我们知道,重心坐标实际上就是 \(A,B,C\)的凸组合,有\(\alpha+\beta+\gamma=1\) ,因此,有:

\[(\frac{\alpha^{'}}{A.z}+\frac{\beta^{'}}{B.z} +\frac{\gamma^{'} }{C.z})\times \frac{1}{P.z}=1 \]

从而很轻易得到 \(\frac{1}{P.z}\)
最终得到观察坐标下的重心坐标 \(\alpha,\beta,\gamma\) 分别为:

\[\alpha=\frac{\alpha^{'}}{A.z}/(\frac{\alpha^{'}}{A.z}+\frac{\beta^{'}}{B.z} +\frac{\gamma^{'} }{C.z}) \]

\[\beta=\frac{\beta^{'}}{A.z}/(\frac{\alpha^{'}}{A.z}+\frac{\beta^{'}}{B.z} +\frac{\gamma^{'} }{C.z}) \]

\[\gamma=\frac{\gamma^{'}}{A.z}/(\frac{\alpha^{'}}{A.z}+\frac{\beta^{'}}{B.z} +\frac{\gamma^{'} }{C.z}) \]

并且,观察坐标下的 \(z\) 就等于经透视变换后的 \(w\) 分量。

http://www.jsqmd.com/news/767040/

相关文章:

  • 从‘看到’到‘理解’:拆解Grounded-SAM如何让计算机视觉模型听懂人话
  • yuque-exporter技术深度解析:语雀文档批量导出架构设计与实现原理
  • HPM SDK深度解析:从RISC-V MCU开发到嵌入式系统实践
  • 纯前端实现个性化鼠标指针:从CSS cursor属性到30+主题库实战
  • 2026年伺服码垛机公司推荐指南,码垛机/低位码垛机/机器人码垛机/坐标式码垛机 - 品牌策略师
  • 研究人工智能,何以落于上古汉语同源词意义系统
  • 别光看FPS了!用thop和PyTorch Event给你的模型做个‘全身体检’(附完整代码)
  • LeetCode 最大栈题解
  • 2026年拉萨砂浆采购指南:如何甄选靠谱的本土优质厂家? - 2026年企业推荐榜
  • 基于完美信息蒸馏的斗地主AI技术突破:PerfectDou架构设计与实战部署
  • 5分钟快速解锁Windows远程桌面限制:RDP Wrapper完全指南
  • LLAMA 配置AI大模型参数 --temp、--top-p、--top-k
  • 基于GitHub Actions自动化构建团队技能矩阵:从原理到实战部署
  • 从混乱到专业:5分钟用LaTeX的booktabs和multirow打造期刊级三线表与复杂表格
  • 轻量级进程守护工具 openclaw-keep-alive 实战指南
  • 2026年番禺铭悦玉府全屋定制专业服务商如何选型指南
  • 从VGG、ResNet到DenseNet:在FER2013上跑个分,聊聊我为什么最终选了它
  • 【Docker 27低代码容器化实战手册】:27个生产级部署技巧,零基础3天上线首个低代码应用
  • 【Docker监控黄金法则】:20年运维专家亲授7大必监指标与实时告警配置实战
  • 动态容量MoE框架实现语音与音乐统一生成
  • 如何快速连接魔兽世界自定义服务器:Arctium启动器完全指南
  • 毕业季不熬夜:用百考通AI轻松搞定本科毕业论文
  • 仅花几十元用一年|2026 实测智在记录 AI 会议纪要,每月省 20 + 小时,年省上千块
  • 从‘拖拉机油门’到平稳控制:在Python/Matlab里仿真PID积分饱和与抗饱和设计
  • TInyML基础:“不用死记公式!一文讲透全连接层:它到底把神经网络‘连’成了什么样?”
  • 农业物联网插件安全审计必做清单,VSCode 2026新增SAST扫描模块深度解析(仅限前500名下载CVE-2026-Agri补丁)
  • LeetCode 基本计算器题解
  • 如何实现Cursor Pro永久免费使用:完整技术指南
  • 凿岩机械臂力传感与运动控制轨迹规划【附代码】
  • MCP协议:构建AI智能体与外部工具的安全标准化桥梁