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

[3D基础]理解计算机3D图形学中的坐标系变换

转载:http://www.cnblogs.com/shanhaobo/articles/1065380.html

     要谈坐标系变换,那么坐标系有哪些呢?依次有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系.我要讨论的就是这些坐标系间的转换。

     这些坐标系不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现.
     计算机3D图形学最最最基本的目标就是:将构建好的3D物体显示在2D屏幕坐标上.
     初看好像就是将最初的物体坐标系转换到屏幕坐标系就可以了呀,为什么多出了世界坐标系,相机坐标系,投影坐标系。这是因为:在一个大世界里有多个物体,而每个物体都有自己的坐标系,如何表述这些物体间相对的关系,这个多出了世界坐标系;如果只需要看到这个世界其中一部分,这里就多出了相机坐标系;至于投影坐标系那是因为直接将3D坐标转换为屏幕坐标是非常复杂的(因为它们不仅维度不同,度量不同(屏幕坐标一般都是像素为单位,3D空间中我们可以现实世界的米,厘米为单位),XY的方向也不同,在2D空间时还要进行坐标系变换),所以先将3D坐标降维到2D坐标,然后2D坐标转换到屏幕坐标。
理解3D图形学的第一步:理解左手坐标系与右手坐标系
     为什么会有左手坐标系与右手坐标系之分?
     在3D空间(没错!就是3D)中,所有2D坐标系是等价的(就是通过一系列的仿射变换,可以互相转换)
     而3D坐标系不是等价的,通过仿射变换,是无法将左手坐标系转换到右手坐标系;也就是说,物体坐标系用的就是左手坐标系,世界坐标系用的是右手坐标系,那么物体可能就是不会是我们所希望的样子了,可能是倒立的,也可能是背对着我们的,所以我们要区分左手坐标系与右手坐标系。也许在4D空间,左右手坐标系就可以互相变换了吧。
     进入正题吧:
     首先讨论的是物体坐标系->世界坐标系
     前面说了为了描述多个物体间相对的关系,这里引进了世界坐标系,所以世界坐标系是个参考坐标系。
     这一步的目的将所有的物体的点都转移到世界坐标系,这里主要涉及的是旋转,缩放,平移等。
     不过我将详细说明为何及如何用矩阵来描述这些变换。
     例:如果有两个坐标系C与C`, C`是C绕Z轴旋转θ得到的。下面是各坐标轴的变换:
             
     如果是C坐标系的点P(x, y, z),而在C`的表示就是
    
     这时该如何建立矩阵呢? 答案就是区分你用的是行向量还是列向量.也许有人会问为什么不区分是左手坐标系还是右手坐标系呢?因为C可以变换到C`,那么他们一定是同在左手坐标系或右手坐标系,变换只能在可以互相转换的坐标系之间进行。
     如果你用的是行向量:由于行向量只能左乘矩阵(注意乘与乘以的区别)
     所以矩阵形式应该是这样
     
    只有这样,在左乘矩阵时才能得到上面P`的形式。
     
     如果你用的是列向量: 由于列向量只能右乘矩阵(注意乘与乘以的区别)
     所以矩阵形式应该是这样
     
     只有这样,在右乘矩阵时才能得到上面P`的形式。
     
     至于如何旋转,缩放,平移我不在多说。
     …………………………………觉得自己好像跑题了.还好这两个坐标系变换很简单。
     我们再讨论世界坐标系->相机坐标系
     引进相机的目的就是只需看到世界的一部分,而哪些是可以在相机里看到的,就需要进行筛选。将物体转换到相机坐标系,这样相机坐标系进行筛选时就会简单很多。这里的重点是构建相机坐标系。
     物体坐标系,世界坐标系是美工在绘制时就定义好了的。而相机坐标系是需要程序实时构建的。(当然这是通常情况下,如果你要建立一个世界,这个世界都是围绕你转,要实时改变所有物体坐标系,固定相机坐标系(其实这时候相机坐标系就是世界坐标系),建立一个地心说的世界,我也没办法,你的思维也太不一样了。)
     如何构建相机坐标系呢?首先我们要明确目标:我们是要构建3D坐标系(好像是废话),三个坐标轴要互相垂直(也好像是废话).
     我们一般用UVN相机。例如:D3D的D3DXMatrixLookAtLH,D3DXMatrixLookAtRH,OGL的gluLookAt(右手坐标系).
     如何建立呢UVN相机呢? 我们就要利用叉积这个工具了:两个不平行,不重叠的向量的叉积可以得到与这两个向量互相垂直的向量。
     如果有了相机的位置与目标的位置那么我们可以确定一个Z轴(有人问为什么是Z轴,因为物体的远与近我们就习惯用Z值来表示的)。求Z轴时要注意是左手坐标系还是右手坐标系,左右手坐标系XY轴方向相同时,Z轴的方向相反。所以左手坐标系是目标位置减去相机位置,而右手坐标系则是相机位置减去目标位置。记得normalize
     这是我们要得到X与Y轴了。如何求X,Y轴呢?
     一般方法是:
     1、选择一个临时Y轴,
     2、对临时Y 与Z 轴进行叉积求得一个X轴
     3、X轴再与Z轴进行叉积,得到一个Y轴。
     有了XYZ就可以求出旋转的相机矩阵了。
     如何选择一个Y轴呢?大多数情况下是(0,1,0),但是如果是相机位置E与目标位置T垂直,即(E-T=(0,+/-1,0)时),这时就不能用(0,1,0)了, 因为两个平行向量的叉积是零向量,所以我们就要另选一个Y轴。
     但是我觉得我们可以改变方法。
     如果不能选Y轴,我们就选择一个临时X轴,这个临时X轴就是(1,0,0)。
     然后再对临时X轴与Z轴进行叉积求得一个Y轴。
     最后Y轴再与Z轴进行叉积,得到X轴。
     这样可以得到XYZ轴。
     最后再根据行向量与列向量建立相机矩阵,再进行平移。

     相机坐标系->投影坐标系.
     投影的目的就是:降维.
     两种投影方式:正交投影与透视投影.
     在我们TEAM中易颖已经写了,我就不多说了,大家去看他的文章。

     投影坐标系->屏幕坐标系
     这是最简单的。2D坐标变换。也不多说。

相关文章:

  • 从世界坐标系到相机坐标系(3D物体到2D图像的转变)
  • 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结
  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析
  • 相机去畸变,以及双目平行校正----极线校正(一)————之单目畸变校正详细过程
  • 摄像机模型与标定—棋盘、亚像素角点和绘制棋盘角点
  • 摄像机模型与标定——单应性
  • 摄像机模型与标定——摄像机标定
  • 摄像机模型与标定——标定函数
  • 摄像机模型与标定——三个坐标系及其之间关系
  • 推导四对对应点单应矩阵的计算公式?
  • 透视投影中已知两平面的单应矩阵,能否求出这两平面的夹角?
  • 相机标定的网页收纳
  • 机器视觉的相机标定到底是什么?
  • 摄像机标定--矫正畸变
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [笔记] php常见简单功能及函数
  • 0基础学习移动端适配
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Elasticsearch 参考指南(升级前重新索引)
  • emacs初体验
  • Fabric架构演变之路
  • Git初体验
  • java第三方包学习之lombok
  • Python学习之路13-记分
  • Vue UI框架库开发介绍
  • Xmanager 远程桌面 CentOS 7
  • 工程优化暨babel升级小记
  • 微信小程序填坑清单
  • 7行Python代码的人脸识别
  • ionic入门之数据绑定显示-1
  • #1014 : Trie树
  • #控制台大学课堂点名问题_课堂随机点名
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)(1.11) SiK Radio v2(一)
  • (4)logging(日志模块)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (转)大型网站架构演变和知识体系
  • .Family_物联网
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET开发者必备的11款免费工具
  • .net连接MySQL的方法
  • /proc/stat文件详解(翻译)
  • @NestedConfigurationProperty 注解用法
  • @Service注解让spring找到你的Service bean
  • @Valid和@NotNull字段校验使用
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [Android] Upload package to device fails #2720