计算机图形学(1) Viewing Transformation

2023-10-19 05:10

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

1.概述

Viewing(观测) Transformation由View transformation 和Projection transformation组成,也即视图变化和投影变化。观测变化是将三维空间中的点变换成二维空间中,就好像是人们用相机将三维空间的场景拍摄下来,最后形成照片一样。那么,不妨使用这个形象的比喻将空间中的变化表述出来。

2.View(视图) Transformation

View Transformation 是啥?在回答这个问题前,我们先想想现实生活中,我们是如何拍照的这个问题,首先,我们得将我们所需要拍摄的物体(粗略地包括人啦)放好位置,人也需要摆好pose,这样我们就完成了第一步,其次,我们得确定相机的角度,这是很重要的,一个好的拍摄角度才能拍出出色的效果嘛,最后一步,就是按下拍摄键,相机将场景上的一切映射成一张图片。

通过上图我们就可得知,View Transformation就是第二步确定相机的位置角度,那么问题又来了,该如何去确定这个相机的位置以及角度呢,这就需要我们在空间中确定一些向量来确定位置,如图

我们定义一个相机所处的置点e,然后定义它的看向方向,以及这个Up direction,这个向量主要是控制相机的左右旋转,有点像汽车的方向盘。确定好后又出现了一些问题,由于相机的位置可以出现在任意位置,物体也是,能不能通过一种变换将问题统一化管理呢。如图:

 在生活中,我们知道当我们在车上,不知道外界情况的情况下,我们也不会觉得在运动,这是一个简单的物理知识,是由于物体的相对运动的结果。那么,我们将相机始终固定在一个点即e为原点,up对应Y轴,look at对应-Z轴,那么物体也会随之改变。那么为啥要这么做,这其实是一种约定俗成,把相机放在原点有很多的好处,能够简化很多计算,当然也会出现问题,即在Z轴上离相机越远它的Z值越小,离相机越近Z值越大。接下来,我们要将这些变化写成矩阵,该如何去用矩阵表示,下图将进行分析。

 这个变换要将我们上述说的,将e放到原点,g X t 转换成X,t 转换成 Y ,g 转换成 -Z。但是这样转换好像有点困难,我们不妨反过来进行转换,因为将Y转换成t较为简单((0,1,0)-->t的坐标),这样我们得到其逆矩阵,由于正交矩阵的性质,逆矩阵等于其转置矩阵,这样我们就可以求出原变换矩阵。

总结,一些视图变化做了啥,将相机的位置和角度设置成了约定俗成的结果,因为物体都是和相机一起运动的,所以视图变换又称为模型视图变换 。

3.Projection Transformation

那么,我们将物体和相机的相关位置和角度都设置好了之后,接下来的工作就是投影啦,也就是形成照片,我们知道投影分为两种:Orthographic projection(正交投影)和Perspective projection(透视投影)。这两者的视觉效果如图。

可以很直观地看出透视投影是由一个点和空间中的一个平面相连形成一个四棱锥,具有近大远小的视觉效果,而正交相机则直接将一个面映射出来不会有其他的视觉效果。

3.1 Orthographic Projection

我们先来分析正交投影,我们先进行一个简单的处理方式,对于正交投影,我们将摄像机处于原点,让其看向-Z方向,然后我们拿掉Z轴,这样一个三维的空间就变成了二维,也就是物体映射在了XY平面上,然后再将其进行平移和缩放到一个[-1,1]^{2}的正方形内(约定俗成的做法)就完成了正交投影 。

通常的做法如下,也其实是差不多的,只不过上面的描述更容易理解。

 

我们要关注的是该变换矩阵是如怎样的,首先,我们得将长方体(使用通常定义)的中心平移到坐标轴的原点,然后再将各边进行缩放,缩放成[-1,1]^{3}的正方体,正交投影就完成了。同时注意:这和OpenGL有差异,OpenGL使用的是左手系,其结果可能相反。

 3.2 Perspective projection

经过上面的介绍,透视投影会有近大远小的视觉效果,那么该投影的矩阵变换是怎么样的呢,看下图结合文字理解,我们知道透视投影会和投影平面形成一个椎体,而正交投影是一个长方体,同时两者在空间当中取一个近平面和远平面,那么会得到一个Frustum(描述得到的空间体)和Cubiod,不难发现将Frustum的远平面挤压成和近平面一样大,然后再进行正交投影不就可以得到透视投影了嘛。把未知的转换成已知的,是常用的解决难题的方法。

  但是要定义一些规则,从而得到唯一解。如近平面的点是不会变化的,远平面的中点是不会变得,nf之间的距离是不变的即Z是不变的,我们只是将远平面进行缩放。我们如果从侧面观测便可以得到一些数学关系。

根据相似三角形的一些性质可得,如图的关系,从而进一步确定x和y前后变化的关系。

 

但是Z的变化始终不知道,但是根据前面定义的规则,近远平面的上的点不会发生改变,我们就可以得到计算。

 

这里,需要说明的是对于齐次坐标而言,所有坐标乘以一个相同的数,其仍然代表相同的点 。上面得到了第一个等式,是对于近平面上的点而言的。

由近远平面上的点得出两个等式,从而可以求出变换矩阵第三行的内容,从而得到挤压的变换矩阵,最后再将这个矩阵和正交矩阵相乘即可,得到透视投影的矩阵变换。 

参考闫令琪老师的课程所做的笔记,供大家参考阅读。

 

这篇关于计算机图形学(1) Viewing Transformation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

Python计算机视觉编程 第十章

目录 一、OpenCv基础知识 1.读取和写入图像 2.颜色空间 3.显示图像和结果 二、处理视频 1.输入视频 2.将视频读取到NumPy数组中 三、跟踪 1.光流 2.Lucas-Kanade算法 一、OpenCv基础知识 OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。 1.读取和写入图像 import cv2# 读取图像im = c

2025届计算机毕业设计:如何构建Java SpringBoot+Vue个人健康档案管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

计算机毕业设计选题推荐-域名管理系统-域名商城-域名竞拍系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python项目 安卓项目 微信小程序项目 文章目录 一、前言二、开发环境三、系统界面展示四、代码参考五、论文参考六、系统视频结语