坐标系统
关键词:世界坐标系 模型坐标系 相机坐标系 模型坐标系到世界坐标系的变换举证,世界坐标系到相机坐标系的变换举证,透视投影,成像面与屏幕的比例映射

一般在计算机图形显示中,我们需要三个坐标系构成一个坐标系统。分别是世界坐标系,局部坐标系(模型坐标系),相机坐标系。我们一开始建立模型的时候都是在模型坐标系(局部坐标系下完成的),然后我们通过局部坐标系到世界坐标系的变换矩阵,把局部坐标系中的模型变换到世界坐标系,最后我们将所有在世界坐标系中的位置变换到相机坐标系,然后一般利用透视投影将其投影到成像面,再利用成像面的大小和屏幕的大小关系将其在屏幕上的位置求出来

为什么需要使用三个坐标系?

因为三个坐标系基本上满足了图形自由显示的需要,也与真是世界也比较好的对应关系。在三个坐标系中世界坐标系基本上固定不动,相机坐标系一般也运动比较少,我们喜欢把相机坐定在世界坐标系的Z轴上,这样会带来很多方便,当然通过改变相机坐标系和世界坐标系的变换矩阵,我们就间接改变了相机的位置和方向。
在这里比较重要的是局部坐标系(模型坐标系),每一个独立的模型都有自己的模型坐标系,而世界坐标系和相机坐标系,整个坐标系统中只有一个,但是局部坐标系可以有很多个,我们通过改变模型坐标系与世界坐标系的变换矩阵,我们可以改变模型相对于世界原点的位置和方向,我们通过在给模型附加一个旋转矩阵可以使模型在局部坐标系中旋转,而且模型中心相对于世界坐标系的位置没有变化。就像在真实世界中我们手拿一个玩偶翻转它,并不改变它相对于其他物体的位置。

什么是透视投影?

透视投影就是模仿人的眼睛,根据成像物体的远景,让越远的物体成像越小,越近的物体成像越大,成像投影的模型如下:

旋转
关键词 鼠标控制 arcBall原理

首先是arcBall原理,arcBall原理将鼠标在屏幕上的二维坐标映射到三维,并且根据两个二维坐标获得两个三维位置来计算出旋转轴和旋转角。

将屏幕归一化到一个半径为1的外接圆上更好,这样通过勾股定理可以计算出屏幕上两个点在圆上对应的Z值,这个时候两个向量叉乘可以获得垂直于两个向量的轴,这就是旋转轴,点成利用反余玄可以获得旋转角。
但是这个时候的旋转轴是用屏幕坐标系(与相机坐标系表示一样),我们希望在模型坐标系中旋转模型,所以需要把旋转轴转化到模型坐标系中去,(不管在哪个坐标系中,旋转轴的方向都是一样的,只不过表示的参数不同),又因为旋转轴是一个向量,向量可以看做起点在原点,另一个点在一个单位球上,我们做矩阵逆变换时,只需要做旋转的逆变换即可 首相逆变换世界模型到相机模型的逆矩阵,然后逆变换世界模型到局部模型的的逆矩阵,**注意这个顺序很重要,**最后得到在局部坐标系下的旋转轴。

绕任意直线旋转

绕任意直线旋转的方法
首先将这条直线旋转到某一个平行轴,然后旋转角度,再把这条直线逆旋转回之前的位置,注意逆旋转的时候逆矩阵级联的顺序是相反的


在这里编程时要注意,万一这个旋转轴与某一个坐标轴重合,需要考虑u v等于0的情况,这个时候单独判断三角函数的值,因为计算不能除0。

参考文章1:https://blog.csdn.net/jennybi/article/details/79742058
参考文章2:https://learnopenglcn.github.io/01%20Getting%20started/08%20Coordinate%20Systems/

鼠标 ArcBall 局部坐标系 旋转模型相关推荐

  1. GLFW+OpenGL三维空间旋转模型的算法

    在三维软件中,用鼠标控制三维模型旋转是很必要的,可以方便使用者观察模型,具有诸多优势,那么如何实现呢? 有两种方案,一种是控制模型旋转,这种方法将着色器中的model进行旋转变换即可:另一种是旋转摄像 ...

  2. YOLO5 旋转模型图片标注及训练

    YOLO5 旋转模型图片标注及训练 使用工具 图片获取工具-- opencv_display.py 图片标注工具-- rolabelimg 标注转换工具-- roxml_to_dota.py 模型训练 ...

  3. unity在UI界面上展示旋转模型

    1.创建一个Raw Image用来在UI界面进行显示模型 2.将图片在界面调整到合适位置,根据自己的需要进行调整 3.在Assets文件夹下创建"渲染器纹理" 后面如果觉得显示不够 ...

  4. WebGL入门(三十四)-三维空间中鼠标控制物体旋转,用鼠标控制立方体的旋转

    用鼠标控制立方体的旋转 1. demo效果 2. 实现要点 2.1 注册鼠标事件 2.1.1 注册鼠标事件函数的声明 2.1.2 注册鼠标事件函数的调用 2.2 纹理图片加载 2.3 图形绘制 3. ...

  5. Unity 在zSpace上使用鼠标控制相机旋转和鼠标指引式放大缩小,在触屏上手势位置为中心放大缩小

    在zSpace上使用鼠标控制相机旋转和鼠标指引式放大缩小,在触屏上手势位置为中心放大缩小 鼠标和触屏的操作 下面展示一些 内联代码片. using System; using System.Colle ...

  6. Unity鼠标拖拽旋转拉远拉近场景

    按下 左 "Alt" 键, 然后按下鼠标左键旋转场景,按下鼠标右键拖拽场景,滚动鼠标滚轮拉远拉近场景 (实际是摄像机的旋转移动和拉远拉近) 将下脚本直接拖拽到场景中的物体上,运行即 ...

  7. cesium 鼠标操作习惯修改 鼠标左键旋转 鼠标右键平移

    修改鼠标操作习惯 // 倾斜视图 鼠标左键旋转 viewer.scene.screenSpaceCameraController.tiltEventTypes = [ Cesium.CameraEve ...

  8. Revit建模:楼板三维视图旋转模型如何使图案跟着旋转

    楼板填充图案后,在三维视图中旋转模型,图案不会跟随楼板旋转.如何解决这种情况? 在这种情况下,我们需要知道绘图填充和模型填充的区别. 创建一个楼板 水磨石是一种为楼板添加表层并设置表层的材料. 点击面 ...

  9. Unity鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野

    如题目所示,本文实现这三个效果.所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题. 一. 鼠标拖拽移动物体 效果演示 源代码 public class mousedra ...

最新文章

  1. 生命的礼赞,请记住我的名字,我叫科比-布莱恩特
  2. js中的几种跨域方法
  3. Python基础教程:获取list中指定元素的索引
  4. Python档案袋( Sys 与 Import 模块)
  5. java11下载_JDK11 JAVA11下载安装与快速配置环境变量教程
  6. 基于MySQL的高可用可扩展架构探讨
  7. python求一元三次方程的根_初中数学专题复习-方程与方程组
  8. django模型_Django模型
  9. Mac 使用Navicat连接Oracle提示:ORA-21561: OID generation failed
  10. 移动边缘计算——MEC
  11. [雪峰磁针石博客]接口测试面试题
  12. 超详细,如何不用任何第三方软件实现电脑与手机文件传输
  13. 微信指纹服务器,华为公布10月底完成微信指纹适配,网友:等了三年终于有结果...
  14. 零和博弈,囚徒困境,马斯洛需求层次理论
  15. PHP的realpath(...)
  16. cakephp视图用php文件,CakePHP-视图
  17. java中正则表达式Pattern与Matcher类使用详解(find、group)
  18. c++算法:四数之和---固定两数,用夹逼法
  19. Android Studio中layout_gravity与gravity
  20. 特步CIO:企业信息化建设的“解放战争”

热门文章

  1. 获取本机IP_考虑多网卡的情况
  2. vue 父组件传子组件数值,父值变更子获取的值没有变的问题
  3. java 多线程 交替_java 多线程–线程交替
  4. 对象作为函数参数可能会导致的问题
  5. mysql 备份库的shell_shell学习之自动备份mysql数据库
  6. nginx负载均衡常用的策略
  7. 项目中缺少maven dependencis,或者pom文件报红
  8. 详细分析图像形态学操作
  9. windows tomcat 升级openssl_Linunx开发环境配置——Tomcat
  10. C#数据本地存储方案之SQLite