图形学学习 TOPIC 3 3D Viewing Implementation

2023-10-19 05:10

本文主要是介绍图形学学习 TOPIC 3 3D Viewing Implementation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、Classical Viewing(经典/人眼观察)
    • 平面几何投影
      • 1.平行投影 parellel
        • (1)正投影 orthographic projection
        • (2)轴测投影 axonometric projection
        • (3)斜投影 oblique projection
      • 2.透视投影
  • 二、Computer Viewing
    • 1.平行投影
      • (1)正投影(正交投影):orthographic projection
        • Summary
      • (2)斜投影
    • 2.透视投影
      • 透视投影规范矩阵

一、Classical Viewing(经典/人眼观察)

Classical Viewing 需要三个基本要素
(1)一个或多个观察对象
(2)观察者和一个投影表面
(3)从物体到投影表面的投影仪

投影中心:照相机镜头或者人眼中心(COP)
透视投影:COP在有限远处
平行投影:COP在无限远处
平面几何投影:投影面是平面 & 投影线是直线

平面几何投影

在这里插入图片描述

1.平行投影 parellel

投影线之间是平行的

(1)正投影 orthographic projection

(1)投影线和投影平面垂直
(2)投影平面平行于对象的某个主面
(3)不改变距离和角度
eg:三视图

(2)轴测投影 axonometric projection

(1)投影线和投影平面垂直
(2)投影平面相对于对象的方向可以任意

等轴侧投影:投影平面相对于三个主面对称:三轴向的比率都相同
正二测投影:投影平面相对于两个主面对称:两轴向比率相同
正三测投影:三轴向比率均不相同

(3)斜投影 oblique projection

(1)允许投影线和投影平面成任意角度

2.透视投影

非均匀透视缩短(nonuniform foreshortening):
投影后尺寸会缩短:即对象距离观察者越远,它所成的像越小,非等距缩小

一点、两点、三点透视:区别在于对象的三个主方向中有几个平行于投影平面。

三点:没有平行于投影平面的主方向,沿着每个主方向的平行线相交于有限远处的灭点(Vanishing Points)。
两点:允许一个主方向平行于投影平面,其余沿着两个主方向的平行线相交于灭点
一点:允许两个主方向平行于投影平面,因而只要一个灭点。

二、Computer Viewing

Computer Viewing 的viewing process需要三个基本要素
(1)照相机的位置
(2)选择一个镜头(设置投影矩阵)
(3)剪裁(设置视体)

1.平行投影

投影的规范化: 先把对象变形(规范化矩阵),使得变形后的对象的正交投影图与原来想要得到的对象的投影图相同

平行投影: → \rightarrow 规范化 → \rightarrow 正投影

(1)正投影(正交投影):orthographic projection

投影线垂直于观察平面
投影平面为 z=0
P p = M o r t h I P [ x p y p z p 1 ] = [ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 ] [ x y z 1 ] \bm{P_p}=\bm{M_{orth}}\bm{I}\bm{P} \\ \begin{bmatrix} x_p \\ y_p \\ z_p \\ 1\\ \end{bmatrix}= \begin{bmatrix} 1 &0 & 0& 0 \\ 0 & 1 &0 &0\\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} Pp=MorthIPxpypzp1=1000010000000001xyz1
其中 I I I 4 × 4 4\times4 4×4的单位矩阵。
此时只有位于 “棱边长度为2,以坐标原点为中心的正方体”(规范视见体) 内的对象才有可能成像。

如果希望控制 对象与裁剪体的位置关系并确定对象的可见性,那么我们可以使用几何变换矩阵N代替单位矩阵 I I I
方法:把ortho创建的一个正交平行的视景体映射成规范视见体

mat4 N=Ortho(left,right,bottom,top,near,far);
(注意0<near<far)

总共需要两个变换:
①平移,把指定视见体的中心移动到规范视见体的中心
②缩放:使每条边的长度都为2
T = T ( − ( r i g h t + l e f t ) 2 , − ( t o p + b o t t o m ) 2 , + ( f a r + n e a r ) 2 ) S = S ( 2 ( r i g h t − l e f t ) , 2 t o p − b o t t o m ) , 2 ( n e a r − f a r ) ) N = S T = [ 2 r i g h t − l e f t 0 0 − r i g h t + l e f t r i g h t − l e f t 0 2 t o p − b o t t o m 0 − t o p + b o t t o m t o p − b o t t o m 0 0 2 n e a r − f a r − f a r + n e a r f a r − n e a r 0 0 0 1 ] \bm{T}=\bm{T}(\frac{-(right+left)}2,\frac{-(top+bottom)}2,\frac{+(far+near)}2)\\ \quad \\ \bm{S}=\bm{S}(\frac{2}{(right-left)},\frac{2}{top-bottom)},\frac{2}{(near-far)})\\ \quad \\ \bm{N}=\bm{S}\bm{T}=\begin{bmatrix} \frac{2}{right-left} &0 & 0& -\frac{right+left}{right-left} \\ \\ 0 & \frac{2}{top-bottom} &0 & -\frac{top+bottom}{top-bottom} \\ \\ 0 & 0 & \frac{2}{near-far} & -\frac{far+near}{far-near} \\ \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} T=T(2(right+left),2(top+bottom),2+(far+near))S=S((rightleft)2,topbottom)2,(nearfar)2)N=ST=rightleft20000topbottom20000nearfar20rightleftright+lefttopbottomtop+bottomfarnearfar+near1

Summary

投影平面是z=0 : 先变换视见体,再进行正投影。即: P p = M o r t h S T P \bm{P_p}=\bm{M_{orth}}\bm{ST}\bm{P} Pp=MorthSTP

(2)斜投影

先把对象变形,使 要求的投影 转换为 变形后的对象的规范正交 投影。
P p = M o r d h S T H ( θ , ϕ ) P \bm{P_p}=\bm{M_{ordh}}\bm{STH}(\theta,\phi)\bm{P} Pp=MordhSTH(θ,ϕ)P
其中 M o r d h S T \bm{M_{ordh}}\bm{ST} MordhST都同正投影一样,那么主要目标就在于获得矩阵 H ( θ , ϕ ) \bm{H(\theta,\phi)} H(θ,ϕ)
(这里注意一点,ST中的left right bottom top对应于斜投影视见体经过H变换之后得到的长方体顶点
在这里插入图片描述
下图:左图为上图的俯视图,右图为上图的右视图
在这里插入图片描述 H ( θ , ϕ ) = [ 1 0 c o t θ 0 0 1 c o t ϕ 0 0 0 1 0 0 0 0 1 ] \bm{H}(\theta,\phi)= \begin{bmatrix} 1 &0 & cot\theta & 0 \\ 0 & 1 &cot\phi &0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\\ H(θ,ϕ)=10000100cotθcotϕ100001
其中的 θ 、 ϕ \theta、\phi θϕ 由斜投影的投影线方向和投影平面所成的夹角给出

2.透视投影

假设照相机(COP)在原点,方向指向z轴负方向
将投影平面放在投影中心的前面,此时空间中的一点 ( x , y , z ) (x,y,z) (x,y,z)沿着一条投影线被投影到 ( x p , y p , z p ) (x_p,y_p,z_p) (xp,yp,zp)。所有的投影线都经过COP。
在这里插入图片描述
可以看出在推出的 ( x p , y p , z p ) (x_p,y_p,z_p) (xp,yp,zp)中,是非均匀的透视缩短,即对象离投影中心越远,所成的像越小。

这类投影是不可逆的:即一条投影线上所有的点都会投影到同一个点,我们不能从一个点的投影恢复出这个点。

q ′ = q = M p [ x z / d y z / d d 1 ] = [ x y z z / d ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 / d 0 ] [ x y z 1 ] \bm{q'}=\bm{q}=\bm{Mp}\\ \begin{bmatrix} \frac{x}{z/d} \\ \frac{y}{z/d} \\ d \\ 1\\ \end{bmatrix}=\begin{bmatrix} x \\ y \\ z \\ z/d\\ \end{bmatrix}= \begin{bmatrix} 1 &0 & 0& 0 \\ 0 & 1 &0 &0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1/d & 0 \\ \end{bmatrix}\begin{bmatrix} x \\ y \\ z \\ 1\\ \end{bmatrix} q=q=Mpz/dxz/dyd1=xyzz/d=100001000011/d0000xyz1

透视投影规范矩阵

首先,对于投影平面z=-1,并且投影中心位于原点的透视投影,我们已知投影变换矩阵为:
M = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 0 ] \bm{M}= \begin{bmatrix} 1 &0 & 0& 0 \\ 0 & 1 &0 &0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & -1 & 0 \\ \end{bmatrix} M=1000010000110000
我们将该投影平面移到z=0,此时即对当前投影进行正投影,即乘 M o r t h \bm{M_{orth}} Morth,最终变换矩阵为:
[ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 − 1 0 ] \begin{bmatrix} 1 &0 & 0& 0 \\ 0 & 1 &0 &0\\ 0 & 0 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ \end{bmatrix} 1000010000010000

下面,我们使用新方法得到同样的变换矩阵:
假定视见体侧面和投影平面夹角为45°
先应用变换 N N N,再应用正交投影,得到的结果与上面相同:
N N N的作用即为得到一个规范视见体:将半无穷棱锥变为规范视见体)
d = − n e a r N = [ 1 0 0 0 0 1 0 0 0 0 α β 0 0 − 1 [ 1 / d ] 0 ] α = n e a r + f a r n e a r − f a r β = 2 × n e a r × f a r n e a r − f a r 0 < n e a r < f a r d=-near\\ \bm{N}= \begin{bmatrix} 1 &0 & 0& 0 \\ 0 & 1 &0 &0\\ 0 & 0 & \alpha & \beta \\ 0 & 0 & -1[1/d] & 0 \\ \end{bmatrix}\\ \quad\\ \alpha=\frac{near+far}{near-far}\\ \quad\\ \beta=\frac{2\times near\times far}{near-far}\\ \quad\\ 0<near<far d=nearN=1000010000α1[1/d]00β0α=nearfarnear+farβ=nearfar2×near×far0<near<far

若投影平面z=d
假定视见体侧面和投影平面夹角为 θ \theta θ
则推导思路为:
本质思想为,得到一个矩阵N,使变换N后所得即为规范视见体
在这里插入图片描述

这篇关于图形学学习 TOPIC 3 3D Viewing Implementation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237534

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个