D3DXMatrixShadow 产生一个矩阵,把几何体投影到平面上,神奇的是这个矩阵不论对平行光还是点光,都具有统一的形式(见左边D3DXMatrixShadow的文档链接)。

Introduction to 3D Game Programming with DirectX9.0 模板缓冲区那一章里提示感兴趣的读者参考Chapter 6, “Me and My (Fake) Shadow,” Jim Blinn’s Corner: A Trip Down the Graphics Pipeline

《计算机图形学与几何造型导论》用很基本的向量和矩阵(线性代数)的知识,分别推导出了平行投影和透视投影各自的变换矩阵。因为后者我很早就读过了,非常熟悉;只把前者简单地看了看,有了一个思路(随着点光源距离平面越来越远,平面上任意两点接收到的光线趋于平行,若点光源位置无穷远,则就是平行光了),把这两个变换矩阵合二为一。


齐次坐标

一维

数轴L上一点的坐标 x = x/1 = kx/k ( k!=0 ) 即数轴上一点的坐标可以写成两个实数 X、k 的比值,记作 (X,k) k!=0,这就是一维空间的齐次坐标(比例关系X:k)。

(x,1) 与 k!=0 k(x,1)=(kx,k) 都是数轴L上的同一个点,对应着二维空间中的一条过原点、斜率不为零的直线(除去原点)。

(X,k) k!=0 代表数轴L上的点 x=X/k,若X!=0,k->0  x-> infinity,即无穷远。记 (X,0) X!=0 代表无穷远,对应着二维空间中过原点、斜率为零的直线(除去原点)。

而剩下的 (0,0) 对应着 二维空间的 原点。

二维

黄色平面(z=1)上某点A的二维坐标 (x,y) = (x/1, y/1) = (kx/k, ky/k) k!=0,kx=X,ky=Y,写成齐次坐标的形式:(X, Y, k) <--> (X/k, Y/k, 1) = (x,y,1) k!=0,比例关系 (X: Y :k) 。

(x,y,1) 与 (kx,ky,k) k!=0 都表示黄色平面上的同一个点,对应着三维空间中一条过原点、不在xoy平面(灰色)内的直线(除去原点)。

(X, Y, k) k!=0 代表黄色平面上的点(x,y) x=X/k, y=Y/k,k->0, 若X,Y不同时为零,(x,y)= (X,Y)*(1/k) 沿(X,Y)方向趋于无穷远。记 (X,Y,0)代表无穷远,对应着三维空间中过原点、在xoy平面上、方向向量是(X,Y)的直线(除去原点)。

而剩下的 (0,0,0) 对应着 三维空间的 原点。

在黄色平面这个二维世界中,A是一个点光源,它的齐次坐标为 (a,b,w),即二维坐标为 (a/w,b/w) = (a,b)*(1/w),当w->0时,点A不断沿着平行于向量(a,b)的方向(与向量(a,b)的方向相同或相反)向远处移动,最后趋于黄色平面上向量(a,b)方向的直线两端的无穷远。此时A就是一个平行光了,方向是(a,b)。记作(a,b,0)。(a,b,0) 与 (ka,kb,0) k!=0 产生的平行光线是一样的。

这样平行光、点光源就用齐次坐标统一起来了:(a,b,w) w!=0 时,代表(a/w,b/w)位置的点光源;w=0且a、b不同时为零,代表平行于向量(a,b)的平行光。(0,0,0)含义未定义。

无穷远 对应 一组共线的非零向量。

同理可以推广到三维空间、更高维度几何空间点的齐次坐标,运用代数。


投影矩阵

平行投影

投影平面过Q点,法向是N,平行光线的方向向量为u(光线与平面不平行),则投影矩阵 Parallel(Q,N,u) 为(证明见附录),矩阵的值与被变换的点P(x,y,z,1)无关:

$$\begin{bmatrix}
I-\frac{N^\top u}{uN^\top} & 0 \\ \\
\frac{QN^\top}{uN^\top}u & 1 \\
\end{bmatrix}$$

透视投影

投影平面过Q点,法向是N,点光源的位置为u,则投影矩阵 Perspective(Q,N,u) 为(证明见附录),矩阵的值与被变换的点P(x,y,z,1)无关:

$$\begin{bmatrix}
(u-Q)N^\top I-N^\top u & -N^\top \\ \\
QN^\top u & uN^\top \\
\end{bmatrix}$$

齐次形式

(x,y,z,1) Parallel(Q,N,u) = (x',y',z',1)

(x,y,z,1) Parallel(Q,N,u)uN^T = (x',y',z',1) uN^T ~ (x',y',z';1)

$$Parallel(Q,N,u)uN^\top=\begin{bmatrix}uN^\top I-N^\top u & 0 \\ \\QN^\top u & uN^\top \\\end{bmatrix}$$

> Parallel(Q,N,u)uN^T也是平面Q,N和平行光u的平行投影矩阵。

点光源的位置是u,若表示成齐次坐标(S,w),w是任意不为零的常数,则u=S/w,代入Perspective(Q,N,u)得:

$$Perspective(Q,N,S,w)=\begin{bmatrix} 
(\frac{1}{w}S-Q)N^\top I-\frac{1}{w}N^\top S & -N^\top \\ \\ 
\frac{1}{w}QN^\top S & \frac{1}{w}SN^\top \\ 
\end{bmatrix}\quad w\neq 0$$

(x,y,z,1) Perspective(Q,N,S,w) = (X,Y,Z,k)  ~ (X/k,Y/k,Z/k,1)
(x,y,z,1) Perspective(Q,N,S,w) w =  (X,Y,Z,k) w ~ (X/k,Y/k,Z/k,1)w!=0

$$Perspective(Q,N,S,w)w=\begin{bmatrix}
(S-wQ)N^\top I-N^\top S & -wN^\top \\ \\
QN^\top S & SN^\top \\
\end{bmatrix}\quad w\neq 0$$

> w!=0,Perspective(Q,N,S,w) w 是平面Q,N和点光源(S,w)的透视投影矩阵。


统一的表示

L=(a,b,c,w)=(S,w), a,b,c,w 不同时为零,定义一个矩阵叫做Projection(L,Q,N) 为:$$\begin{bmatrix}
(S-wQ)N^\top I-N^\top S & -wN^\top \\ \\
QN^\top S & SN^\top \\
\end{bmatrix}$$形式上与Perspective(Q,N,S,w) w完全一样。

w=!0时,L是点光源,其透视投影矩阵是Perspective(Q,N,S,w) w,也就是Projection(L,Q,N)。

现在对于任意的一个给定的S,让w趋向于0,点光源的位置沿着S方向的直线移动;极限情况下 L是一个与S共线的平行光,lim L = lim (S,w) = (S,0);

而w->0极限情况下 lim Projection(L,Q,N)= Parallel(Q,N,S)SN^T,是一个平行投影矩阵。(求极限都是把w=0带入)

所以,Projection(L,Q,N)在w!=0时表示点光源的透视投影矩阵,在w=0时表示平行光的平行投影矩阵。


附录

平行投影

字母既代表 点或(行)向量,也代表它们的坐标,运用向量代数:
$$\begin{array}{ll}
P' = P+ tu \\ 
(P'-Q)N^\top = 0\end{array}$$
解得 \( t = {{QN^\top-PN^\top} \over {uN^\top}} \),
所以 \( P' = P+ \frac{QN^\top u-PN^\top u}{uN^\top} = P + \frac{QN^\top u}{uN^\top} - \frac{PN^\top u}{uN^\top}
=P (I-\frac{N^\top u}{uN^\top}) + \frac{QN^\top}{uN^\top}u \).
\( v' = P'-Q = P (I-\frac{N^\top u}{uN^\top}) +  Q(\frac{N^\top u}{uN^\top}-I) = (P-Q) (I-\frac{N^\top u}{uN^\top})= v (I-\frac{N^\top u}{uN^\top}) \).
符合仿射变换的定义:P'=PM+w,v'=vM,得:
\( M=(I-{N^\top u \over uN^\top}),w={QN^\top \over uN^\top} u \)

透视投影

质点几何

①把位置是P,质量是m!=0的点记做(mP,m),叫做质点坐标。已知某点的质点坐标很容易求出它的位置:mP/m=P。
(mP,m)~(P,1),~ 代表等价关系(自反、对称、传递的二元关系),a~b: a b同一位置。
②质点坐标的好处是质心位置的计算:A(mP,m),B(nQ,n),则A、B的质心为(mP+nQ, m+n) ~ ( (mP+nQ)/(m+n), 1)。
E是投影点,P' 位于投影平面上,该平面过点Q,法向是N(单位法向量),假定方向朝右(朝左不影响的)
E到平面的距离=d,P到平面的距离=z,
假设点E的质量=z,点P的质量=d,
则P' 所在的位置恰好是E、P两点的质心(杠杆EP的支点)。

透视投影矩阵

(E,1)~(Ez,z),(P,1)~(Pd,d),

(Ez,z)+(Pd,d) = (Ez+Pd, z+d) ~ (P',1)

其中,\(z=(P-Q)N^\top, \;d=(Q-E)N^\top, \;z+d=(P-E)N^\top \)

所以,\( (Ez+Pd, z+d)=( (P-Q)N^\top E+(Q-E)N^\top P, \; (P-E)N^\top ) \)

\( =( PN^\top E -QN^\top E +(Q-E)N^\top P, \; PN^\top -EN^\top) \)

\( =( P(N^\top E+(Q-E)N^\top I) -QN^\top E, \; PN^\top -EN^\top) \)

假设$$(P,1)\begin{pmatrix}
M & b \\
w & c \\
\end{pmatrix}_{H} =(Ez+Pd, z+d) \sim (P',1) $$

则\( M=N^\top E+(Q-E)N^\top I, \; w=-QN^\top E, \; b= N^\top, c=-EN^\top \)

因为 k (Ez+Pd, z+d)=( k(Ez+Pd), k(z+d) ) ~ (Ez+Pd, z+d) ~ (P',1) k!=0

所以 矩阵H可以 相差非零因子倍,于是法向朝左或朝右没有关系。

平行投影与透视投影的关系与统一的矩阵表示相关推荐

  1. 图形学 平行投影与透视投影

    平行投影分为正投影与斜投影:正投影是最常用的投影,它不需要知道投影源(投影中心),只需要在知道投影面的情况下就可以求出投影后的图.我们在求三视图的时候,用的就是正投影,但是这儿要注意,图形学中的求三视 ...

  2. openGL 平行投影和透视投影函数分析

    glViewport(GLint x, GLint y, GLsizei width, GLsizei height); 在窗口中定义一个像素矩形,最终的图像会映射到这个矩形中.(x,y)指定了的视口 ...

  3. 直播 | ACL 2021论文解读:提升预训练语言模型实体与关系理解的统一框架

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  4. 计算机图形学与相关学科的关系,哈尔滨工业2015博士招生计算机图形学与人机交互设计大纲...

    哈尔滨工业大学2015博士招生计算机图形学与人机交互设计考试大纲及参考书目 考博复习第一手复习资料及最权威的复习参考书目就是研究生院公布的考博科目考试大纲.参考书目,新东方在线整理了哈尔滨工业大学20 ...

  5. 计算机图形学透视投影知识点,计算机图形学

    计算机图形学期末复习 第一章 绪论 计算机图形学定义:计算机图形学是研究通过计算机将数据转换成图形,并在专门显示设备上显示的原理.方法和技术 第二章 计算机设备及硬件系统 知识点 阴极射线管(CRT) ...

  6. 总结|机器视觉中三大坐标系及其相互关系

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:林青春 链接:https://zhuanlan.zhihu.com/p/59289459 本文转 ...

  7. 关系重叠?实体嵌套?曝光偏差?这个模型统统都搞得定!

    ©PaperWeekly · 作者|王雨城 学校|中国科学院信息工程研究所硕士 研究方向|自然语言处理 本文提出了一种新的实体关系联合抽取标注方案,可在一个模型中实现真正意义上的单阶段联合抽取,不存在 ...

  8. 【论文翻译】统一知识图谱学习和建议:更好地理解用户偏好

    一.摘要 将知识图谱(KG)纳入推荐系统有望提高推荐的准确性和可解释性.然而,现有方法主要假设KG是完整的并且简单地在实体原始数据或嵌入的浅层中转移KG中的"知识".这可能导致性能 ...

  9. 基于主体掩码的实体关系抽取方法

    点击上方蓝字关注我们 基于主体掩码的实体关系抽取方法 郑慎鹏1, 陈晓军1, 向阳1, 沈汝超2 1 同济大学电子与信息工程学院,上海 201804 2 上海国际港务(集团)股份有限公司,上海 200 ...

最新文章

  1. data-参数说明(模态弹出窗的使用)
  2. 不可不看的干货——机器人自主系统的技术构建:感知、决策和执行
  3. 如何从我的Android应用程序发送电子邮件?
  4. 参数注入:不使用xml,使用java配置参数的方法,以前的spring的方法
  5. 创建可扩展性系统-4
  6. Taro+react开发(37)箭头函数括号加个return
  7. java使用AntPathMatcher进行uri匹配
  8. 下如何查看mysql表单_Navicat 教程:如何进行表单查看
  9. 002---设计表结构
  10. Memcahce和Redis比较
  11. 将图像转为特征值_用K均值进行图像分割
  12. 难以置信:产品图标是黑色背景
  13. Hadoop 核心原理(贼全面)
  14. RFID定位技术在智能出入库中的应用--新导智能
  15. php随机生成6个数字,php随机产生六位数密码的实例代码
  16. 语速对科大讯飞,百度,思必驰,云知声的语音引擎识别结果影响对比
  17. 二维码:Data Matrix和QRCode
  18. Exp3 免杀原理与实践 20164302 王一帆
  19. mmdetection--自定义数据集
  20. 基于神经网络识别抑郁症附matlab代码

热门文章

  1. 解决Notepad--在ubuntu16.04无法运行问题
  2. 四点共面(混合积 x 乘 与 . ”乘)
  3. 崔健没变,北汽极狐该做出改变了
  4. 7-10 商人的诀窍 (20 分)
  5. U-boot 2016.11 代码结构 dra7xx
  6. 【JavaSe】String类、StringBuilder、StringBuffer(超详细)
  7. 学习黑盒优化算法CMA和RandomSearch,借助阿里达摩院MindOpt的RABBO榜单【系列2/4】
  8. 查询全部学生的学号、姓名、性别和出身年月日
  9. VLOOKUP函数制作多表查询(学生信息表/员工工资表)
  10. 第三方登录用户信息表设计