数学公式测试

news2024/11/18 17:42:23

MVP变换

MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。

MVP变换分为三步:

  • 模型变换(model tranformation):将模型空间转换到世界空间(找个好的地方,把所有人集合在一起,摆个pose)
  • 摄像机变换(view tranformation):将世界空间转换到观察空间(找到一个放相机的位置,往某一个角度去看)
  • 投影变换(projection tranformation):将观察空间转换到裁剪空间(茄子!)

在这之后,还有一个#视口变换

视图变换(View)

视图变换的目的是变换Camera位置到原点,上方为Y,观察方向为-Z,即

M v i e w = R v i e w T v i e w = [ x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t y t z t 0 x − g y g z − g 0 0 0 0 1 ] [ 1 0 0 − x e 0 1 0 − y c 0 0 1 − z c 0 0 0 1 ] \begin{align} M_{view}&=R_{view}T_{view}\\ &=\begin{bmatrix} x_{\hat{g}\times\hat{t}}& y_{\hat{g}\times\hat{t}}& z_{\hat{g}\times\hat{t}}& 0\\ x_{t}& y_{t}& z_{t}& 0\\ x_{-g}& y_{g}& z_{-g}& 0\\ 0& 0& 0& 1 \end{bmatrix} \begin{bmatrix}1& 0& 0& -x_{e}\\ 0& 1& 0& -y_{c}\\ 0& 0& 1& -z_{c}\\ 0& 0& 0& 1\end{bmatrix} \end{align} Mview=RviewTview= xg^×t^xtxg0yg^×t^ytyg0zg^×t^ztzg00001 100001000010xeyczc1
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
定义Camera:

  • Camera位置 e ⃗ \vec{e} e
  • 观察方向 g ^ \hat{g} g^
  • 视点上方向 t ^ \hat{t} t^

规定:

  • Camera的y轴正方向向上,z轴方向是 − x ⃗ × y ⃗ -\vec{x}\times \vec{y} x ×y (右手系)
  • 对物体进行运动,摄像机会跟随着一起运动保持相对位置不变。

变换Camera位置到原点,上方为Y,观察方向为-Z:

  1. e ⃗ \vec{e} e 移动到标准位置: T v i e w = [ 1 0 0 − x e 0 1 0 − y c 0 0 1 − z c 0 0 0 1 ] T_{view}=\begin{bmatrix}1& 0& 0& -x_{e}\\ 0& 1& 0& -y_{c}\\ 0& 0& 1& -z_{c}\\ 0& 0& 0& 1\end{bmatrix} Tview= 100001000010xeyczc1 (因为朝原点移动,所以为负)
  2. 旋转 g ^ \hat{g} g^到-Z , t ⃗ \vec{t} t Y g ^ × t ⃗ \hat{g}\times\vec{t} g^×t X R v i e w = [ x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t y t z t 0 x − g y g z − g 0 0 0 0 1 ] R_{view}=\begin{bmatrix}x_{\hat{g}\times\hat{t}}& y_{\hat{g}\times\hat{t}}& z_{\hat{g}\times\hat{t}}& 0\\ x_{t}& y_{t}& z_{t}& 0\\x_{-g}& y_{g}& z_{-g}& 0\\ 0& 0& 0& 1\end{bmatrix} Rview= xg^×t^xtxg0yg^×t^ytyg0zg^×t^ztzg00001

推导:这个过程是旋转X g ^ × t ^ \hat{g}\times\hat{t} g^×t^Y t ^ \hat{t} t^Z − g ^ -\hat{g} g^的逆过程。所以 R v i e w R_{view} Rview是这个逆过程的逆矩阵(正交矩阵的逆是转置矩阵):外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型变换和视图变换经常被一起叫作模型视图变换(ModelView Translation)

投影变换(Projection)

投影变换分为两种:

  • 正交投影变换:透视线平行
  • 透视投影变换:透视线相交,近大远小

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正交投影

M o r t h o = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + L 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] \begin{align} M_{ortho}&=\begin{bmatrix}\frac{2}{r-l}& 0& 0& 0\\ 0& \frac{2}{t-b}& 0& 0\\ 0& 0& \frac{2}{n-f}& 0\\ 0& 0& 0& 1\end{bmatrix} \begin{bmatrix}1& 0& 0& -\frac{r+L}{2}\\ 0& 1& 0& -\frac{t+b}{2}\\ 0& 0& 1& -\frac{n+f}{2}\\ 0& 0& 0& 1\end{bmatrix}\\\\ &=\begin{bmatrix}\frac{2}{r-l}& 0& 0& -\frac{r+l}{r-l}\\ 0& \frac{2}{t-b}& 0& -\frac{t+b}{t-b}\\ 0& 0& \frac{2}{n-f}& -\frac{n+f}{n-f}\\ 0& 0& 0& 1\end{bmatrix} \end{align} Mortho= rl20000tb20000nf200001 1000010000102r+L2t+b2n+f1 = rl20000tb20000nf20rlr+ltbt+bnfn+f1

正交投影的核心:用一个立方体框住物体的 [ l , r ] × [ b , t ] × [ f , n ] [l,r]\times[b,t]\times[f,n] [l,r]×[b,t]×[f,n],把这个立方体变换到标准正方体 [ − 1 , 1 ] 3 [-1,1]^{3} [1,1]3中。

变换顺序:先移动(中点移动到原点),再缩放(基向量缩放比例为 2 长 / 宽 / 高 \frac{2}{长/宽/高} //2 )。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意事项:

  • 右手系:n>f
  • OpenGl是左手系

透视投影

M p e r = M o r t h o M p e r s p → − o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] = [ 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 f + n n − f 2 f n f − n 0 0 1 0 ] \begin{align} M_{per}&=M_{ortho}M_{persp\rightarrow -ortho}\\\\ &=\begin{bmatrix}\frac{2}{r-l}& 0& 0& -\frac{r+l}{r-l}\\ 0& \frac{2}{t-b}& 0& -\frac{t+b}{t-b}\\ 0& 0& \frac{2}{n-f}& -\frac{n+f}{n-f}\\ 0& 0& 0& 1\end{bmatrix}\begin{bmatrix}n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& n+f& -nf\\ 0& 0& 1& 0\end{bmatrix}\\\\ &=\begin{bmatrix}\frac{2n}{r-l}& 0&\frac{l+r}{l-r}& 0\\ 0& \frac{2n}{t-b}& \frac{b+t}{b-t}& 0\\ 0& 0& \frac{f+n}{n-f}& \frac{2fn}{f-n}\\ 0& 0& 1& 0\end{bmatrix} \end{align} Mper=MorthoMpersportho= rl20000tb20000nf20rlr+ltbt+bnfn+f1 n0000n0000n+f100nf0 = rl2n0000tb2n00lrl+rbtb+tnff+n100fn2fn0

透视投影的核心:用“远平面”和“近平面”框住物体,先把“远平面”向“近平面“挤压,然后做一次正交投影。
即透视投影分为两步:

  • 将透视投影转化为正交投影
  • 将正交投影转换到正则立方体

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

研究挤压:

规定:

  • 挤压过程中,近平面和远平面的z值不发生变换(中间要发生变化)
  • 挤压过程中,远平面中心原点 ( x , y ) T (x,y)^{T} (x,y)T不发生变化

挤压过程中的x,y变化的比例关系:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
x同理。
y ′ = n z y ,    x ′ = n z x y' = \frac{n}{z}y,~~x'=\frac{n}{z}x y=zny,  x=znx

用齐次坐标描述任一点的坐标变换:
[ x y z 1 ] → [ n x / z n y / z u n k n o w n 1 ] = [ n x n y z ⋅ u n k o w n z ] \begin{align} \begin{bmatrix}x\\ y\\ z\\ 1\end{bmatrix}\rightarrow \begin{bmatrix} nx/z\\ ny/z\\ unknown\\ 1\end{bmatrix}=\begin{bmatrix}nx\\ ny\\ z\cdot unkown\\ z\end{bmatrix} \end{align} xyz1 nx/zny/zunknown1 = nxnyzunkownz

把这个变换用齐次坐标矩阵表示:
M ( 4 × 4 ) [ x y z 1 ] = = [ n x n y z ⋅ u n k o w n z ] M(4\times 4)\begin{bmatrix}x\\ y\\ z\\ 1\end{bmatrix}==\begin{bmatrix}nx\\ ny\\ z\cdot unkown\\ z\end{bmatrix} M(4×4) xyz1 == nxnyzunkownz

根据矩阵乘法,可以写出M的大致形式:
M = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] M=\begin{bmatrix}n& 0& 0& 0\\ 0& n& 0& 0\\ ?& ?& ?& ?\\ 0& 0& 1& 0\end{bmatrix} M= n0?00n?000?100?0

代入上面提到的两种点:

  • 近平面或远平面上的任一点(令 u n k n o w n = n , z = n unknown=n,z=n unknown=n,z=n): M [ x y n 1 ] = [ n x n y n 2 n ] M\begin{bmatrix}x\\ y\\ n\\ 1\end{bmatrix}=\begin{bmatrix}nx\\ ny\\ n^{2}\\ n\end{bmatrix} M xyn1 = nxnyn2n 根据矩阵乘法行操作: M 第三行 [ x y n 1 ] = n 2 M第三行\begin{bmatrix}x\\ y\\ n\\ 1\end{bmatrix}=n^{2} M第三行 xyn1 =n2 因为不涉及旋转,所以第三行与x,y无关。 [ 0 0 A B ] [ x y n 1 ] = n 2 \begin{bmatrix}0& 0& A& B\end{bmatrix}\begin{bmatrix}x\\ y\\ n \\ 1\end{bmatrix}=n^{2} [00AB] xyn1 =n2 即: A n + B = n 2 An+B=n^{2} An+B=n2
  • 远平面的原点(令 x = 0 , y = 0 , z = f x=0,y=0,z=f x=0,y=0,z=f): [ 0 0 f 1 ] → [ 0 0 f 2 f ] \begin{bmatrix}0\\ 0\\ f\\ 1\end{bmatrix} \rightarrow \begin{bmatrix}0\\ 0\\ f^{2}\\ f\end{bmatrix} 00f1 00f2f 同理可得: A f + B = f 2 Af+B=f^{2} Af+B=f2

综上所述,
A = n + f B = − n f A=n+f B=-nf A=n+fB=nf

求得变换矩阵为:
M p e r s p → − o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] M_{persp\rightarrow -ortho}=\begin{bmatrix}n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& n+f& -nf\\ 0& 0& 1& 0\end{bmatrix} Mpersportho= n0000n0000n+f100nf0

得到透视投影矩阵为:
M p e r = M o r t h o M p e r s p → − o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] = [ 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 f + n n − f 2 f n f − n 0 0 1 0 ] \begin{align} M_{per}&=M_{ortho}M_{persp\rightarrow -ortho}\\\\ &=\begin{bmatrix}\frac{2}{r-l}& 0& 0& -\frac{r+l}{r-l}\\ 0& \frac{2}{t-b}& 0& -\frac{t+b}{t-b}\\ 0& 0& \frac{2}{n-f}& -\frac{n+f}{n-f}\\ 0& 0& 0& 1\end{bmatrix}\begin{bmatrix}n& 0& 0& 0\\ 0& n& 0& 0\\ 0& 0& n+f& -nf\\ 0& 0& 1& 0\end{bmatrix}\\\\ &=\begin{bmatrix}\frac{2n}{r-l}& 0&\frac{l+r}{l-r}& 0\\ 0& \frac{2n}{t-b}& \frac{b+t}{b-t}& 0\\ 0& 0& \frac{f+n}{n-f}& \frac{2fn}{f-n}\\ 0& 0& 1& 0\end{bmatrix} \end{align} Mper=MorthoMpersportho= rl20000tb20000nf20rlr+ltbt+bnfn+f1 n0000n0000n+f100nf0 = rl2n0000tb2n00lrl+rbtb+tnff+n100fn2fn0

视口变换

视口变换
将处于标准平面映射到屏幕分辨率范围之内,即[-1,1]^2->[0,width]*[0,height], 其中width和height指屏幕分辨率大小

视锥

视锥表示看起来像顶部切割后平行于底部的金字塔的实体形状。这是透视摄像机可以看到和渲染的区域的形状。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
定义视锥:

  • 长宽比 Aspect
  • 垂直的角度 FovY

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用视锥得到物体长宽高:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

屏幕(Screen)

  • 二维数组,数组元素为像素
  • 典型的光栅成像设备

光栅(Raster)

  • 德语中的屏幕
  • 画在屏幕上

像素(Pixel <- PIcture element)

  • 像素是一个颜色均匀的小正方形
  • 颜色混合而成(红、绿、蓝)

屏幕空间

认为屏幕左下角是原点,向右是x,向上是y
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
规定:

  • 像素坐标(Pixel’s indices)是(x, y)形式,x, y都是整数。
  • 所有的像素都在(0, 0)到(width-1, height-1)之间
  • 像素的中心:(x+0.5, y+0.5)
  • 整个屏幕覆盖(0,0)to(width,height)

视口变换

要做的事情:
先不考虑z轴,把MVP后处于标准立方体 [ − 1 , 1 ] 3 [-1,1]^{3} [1,1]3映射到屏幕上。即
[ − 1 , 1 ] 2 → [ 0 , w i d t h ] × [ 0 , h e i g h t ] [-1, 1]^{2}\rightarrow [0,width]\times [0,height] [1,1]2[0,width]×[0,height]

总结:把虚拟世界的任意可视物体转换到屏幕:
M = M v i e w M p e r M c a m M m o d e l M=M_{view}M_{per}M_{cam}M_{model} M=MviewMperMcamMmodel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4年北漂之路,从软件测试外包到外企的一点小心得

4年前&#xff0c;我独自一人拖着行李箱来到了北京&#xff0c;成为了一名北漂&#xff0c;离开了校园的庇护&#xff0c;只身一人想要在这片陌生的地方闯出一番名堂&#xff0c;可最后却不得人意&#xff0c;面临着和所有北漂群体的共同困局&#xff0c;没有任何归属感&#x…

【Python Fastapi】js上传文件,fastapi处理,js显示回传信息

python from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from typing import List import requestsapp FastAPI()# 配置静态文件目录 app.mount("/static"…

C++程序员,想入坑音视频方向,需要掌握那些技能树?

C程序员&#xff0c;想入坑音视频方向&#xff0c;需要掌握那些技能树? “音视频”方向太笼统了。 最核心的技术包括编码理论&#xff0c;从基础开始就是信号处理&#xff0c;傅里叶变换&#xff0c;DCT, 采样量化插值等等。这些和C没啥关系&#xff0c;就是一套数学理论。 …

工作薄代码之将活动工作表复制到新工作簿等

【分享成果&#xff0c;随喜正能量】得失&#xff0c;可以说是人类事业上的考验&#xff0c;不要因一时的得失影响一生的期许。得失是一时的&#xff0c;理想是一生的。。 我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xf…

基于SpringBoot的企业客户管理系统

目录 前言 一、技术栈 二、系统功能介绍 管理员功能模块 员工功能模块 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c…

JVM堆内存转储

堆转储是 JVM 中特定时刻内存中的所有对象的快照。它们对于解决内存泄漏问题并优化 Java 应用程序中的内存使用情况非常有用。 堆转储通常以二进制格式 hprof 文件存储。我们可以使用 jhat 或 JVisualVM 等工具打开和分析这些文件。 下面介绍两种堆转储的方式&#xff1a; 1…

HTTP 请求轻松搞定:Swift 网络编程的不二之选 | 开源日报 No.38

Alamofire/Alamofire Stars: 39.8k License: MIT Alamofire 是一个用 Swift 编写的 HTTP 网络库。 简洁的语法和强大的功能集&#xff0c;让你仅需几行代码就能实现诸如自动重试等强大特性。支持链式请求/响应方法&#xff0c;使得处理网络请求变得如丝般顺滑。完美兼容 Swif…

前端性能测试工具-lighthouse

Lighthouse简介 Lighthouse 是 Google 的一款开源工具&#xff0c;它可以作为一个 Chrome 扩展程序运行&#xff0c;或从命令行运行。只需要给 Lighthouse 提供一个要审查的网址&#xff0c;它将针对此页面运行一连串的测试&#xff0c;然后生成一个页面性能的报告。 Lightho…

【电子通识】办法总比问题多:立式贴片座子整形成卧式

最近在测试一些和电池有关的项目&#xff0c;因为这个电池接口是没有用过的&#xff0c;以前做的一些接口板上没有兼容&#xff0c;导致不方便测试。 拿到座子后发现这个座子是立式贴片的。 但是不方便我做测试接口板工装&#xff0c;因为已经有一个立工座子了&#xff0c;再焊…

多个pdf合并成一个文件,3个方法合并pdf

如何把多个pdf合并成一个文件&#xff1f;在我们日常的工作中&#xff0c;经常会遇到一些需要处理的文件&#xff0c;其中包括PDF文件。特别是当我们需要将多个PDF文件合并成一个PDF文件时&#xff0c;会面临一些困难。这样的情况下&#xff0c;我们的阅读能力会受到限制&#…

ElementUI之首页导航+左侧菜单

一.Mockjs 什么是Mock.js Mock.js的优缺点 安装配置Mock.js 引入jsdev.env.js ​编辑 引入 prod.env.js 导依赖 导入json数据 造数据 测试结果 ​编辑 二. 总线 什么是总线 导入组件 编写路由 跳转主页 编写AppMain 编写LeftNav 编写TopNav 一.Mockjs 什么是Moc…

车载通信架构 —— SOME/IP-SD 协议介绍

车载通信架构 —— SOME/IP-SD 协议介绍 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

Xilinx FPGA 7系列 GTX/GTH Transceivers (3) Aurora 8b10b

第一节:Xilinx FPGA 7系列 GTX/GTH Transceivers (1)–了解了GTX硬件的基础知识 第二节:IBERT GTX --通过Ibert IP测试链路通信 学习官方历程 aurora 8b10b single lane 4byte 1硬件介绍 2 实验目标 跑通官方历程。检测发送数据与接收收据一致。 3 IP 生成过程 在 IP Cat…

Xcode14.3.1打包报错Command PhaseScriptExecution failed with a nonzero exit code

真机运行编译正常,一打包就报错 rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/d9889869-120b-11ee-b796-7a03568b17ac/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996) [sender2.6.9] Command PhaseScrip…

@NotNull注解不生效,全局异常处理

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.1.2</version> </dependency> 2&#xff1a;实体类 实体类属性加上NotNull注解…

第二章 使用matplotlib绘制简单图表

第二章 使用matplotlib绘制简单图表 1.绘制折线图 1.1.使用plot()绘制折线图 ​ 使用pyplot的plot()函数可以快速绘制折线图。plot()函数的语法格式如下&#xff1a; plot&#xff08;x, y, fmt, scalexTrue, scaleyTrue, dataNone, labelNone, *args, **kwargs&#xff09…

开启 Kerberos 安全认证的大数据环境中如何正确指定 HS2 的 jdbc url 地址?

开启 Kerberos 安全认证的大数据环境中如何正确指定 HS2 的 jdbc url 地址&#xff1f; 1 Kerberos 环境中 HS2 的认证方式概述 大家知道&#xff0c;HIVE 的认证方式可以通过参数 hive.server2.authentication 在服务端进行统一配置&#xff0c;而在开启了 Kerberos 安全认证…

Metasploit Framework

简介 目前最流行、最强大、最具扩展性的渗透测试平台软件基于Metasploit进行渗透测试和漏洞分析的流程和方法 2003年由HDMore发布第一版&#xff0c;2007年用 ruby 语言重写 框架集成了渗透测试标准(PETS)思想一定程度上统一了渗透测试和漏洞研究的工作环境新的攻击代码可以比较…

若依切换数据源失败

1.遇到的问题 我们使用若依框架&#xff0c;首先这个框架完全开源&#xff0c;真的是很牛也很友好的框架。不像芋道各种关注各种收费&#xff0c;看个文档还要加入199的知识星球&#xff0c;真是恶心&#xff0c;个人觉得完全没必要&#xff0c;若依提供的扩展项目中都做了集成…

电商后台架构演变

单机架构 在网站最初时&#xff0c;应用数量与用户数都较少&#xff0c;可以把Tomcat和数据库部署在同一台服务器上。浏览器往www.taobao.com发起请求时&#xff0c;首先经过DNS服务器&#xff08;域名系统&#xff09;把域名转换为实际IP地址10.102.4.1&#xff0c;浏览器转而…