计算机图形学一:数学基础

数学基础(变换矩阵,向量运算等)

1.变换矩阵总结

一切物体(包括模型,向量等)的缩放,旋转,平移,切变等,都可以通过变换矩阵得到。在投影(projection)变换时也有很多应用。
本节简单的介绍一下变换矩阵

1.1 旋转

旋转在几何和线性代数中是描述刚体围绕一个固定点的运动的在平面或空间中的变换

我们这里只讨论“坐标系保持不动,向量绕坐标轴旋转”的观点。
因为当旋转与平移进行结合时,会因为先后顺序发生不同的情况
(先平移后旋转,物体的位置会因旋转而发生变换,原因是在平移后坐标空间发生的变化,因此再使用旋转矩阵进行变换是相对于世界空间原点进行变换的)
在这里插入图片描述

(先旋转后平移,物体的位置不会因为旋转而发生变化,原因是在平移前,已经做了旋转变换,因此旋转时物体本身坐标空间还在世界中心。)
在这里插入图片描述
回到正题
在这里插入图片描述
在这里插入图片描述
由于涉及到角度,所以可以把笛卡尔坐标系转换到极坐标系,设r为极半径,则P点坐标为
在这里插入图片描述
相应的,P’点坐标为
在这里插入图片描述
根据三角函数公式,联立两个方,可知,P’关于x,y的方程为:
在这里插入图片描述
用4x4矩阵可以表述为:
在这里插入图片描述
即,绕Z轴旋转的变换矩阵为:
在这里插入图片描述
同理可得下面几个常见的旋转变换矩阵:
在这里插入图片描述
其中逆时针是正方向,当顺时针旋转时,角度可以取负的正方向,之后根绝三角函数的奇偶性即可进行转换(意思是只要记住逆时针旋转的公式就行了)

1.2缩放

缩放在欧式空间中是描述延一个或多个坐标轴方向的缩放因子放大或者缩小物体的线性变化

每一个坐标轴方向都有其单独的缩放因子。
各坐标轴缩放因子不同,缩放后结果的形状可能发生变化,此时的缩放被叫做方向缩放。
在这里插入图片描述
如图,我们已知P点坐标,则P’点的坐标可以表示为:
在这里插入图片描述
用4x4矩阵表示为:
在这里插入图片描述
所以,三维缩放变换矩阵为:[外链图片转存失败,源站可能有防盗在这里插入链机制,建描述]议将图片上https://传(imbg.csdnimg.cn/9c92cd97df154zPXT1688c7a164b2a4f00f.pg08)(https://img-log.csdnimg.cn/9c92cd97df1541688c7a164b2a4f800f.png)]

1.3平移

平移在仿射空间中指物体延同一方向移动相同距离的变换

平移是一种等距同构的变换,可以被视为某一向量施加于物体没一点的结果。即,设v是已知向量,P为空间中一点,则平移:
在这里插入图片描述
如下图所示:
在这里插入图片描述

用4x4矩阵表示为
在这里插入图片描述
即平移变换矩阵为:
在这里插入图片描述

1.4 投影

投影是指一个从向量空间V映射到它自身的线性变换。

投影是生活中“平行投影”概念的形式化和一般化。例如,在现实生活中,阳光照射物体在地面留下的影子。我们假设阳光是沿着同一方向(平行且垂直于地面的)照射物体,地面是严格的平面。那么,这就是投影最直观的例子。

1.5总结

适用于列向量的4x4矩阵形式
在这里插入图片描述
这里的x,y,z与平移相关,分别是x,y,z轴的平移量。
a,b,c,d,e,f,g,h,i与线性变换相关。
l,m,n与透视投影变换相关。

为什么仿射变换要升维度?

线性变换在几何直观上有如下特点:

变换前后,直线仍然保持是直线的状态

变换前后,原点保持固定,不会变化

是因为我们无法通过矩阵的实现平移操作,平移会改变向量空间。

仿射变换,又称仿射映射,是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

仿射变换相比于线性变换,不需要保证变换前后坐标原点不变。

我们希望能通过矩阵的乘法实现一个通用的计算模式,来进行坐标点的变化。
因此就需要齐次坐标:齐次坐标的本质就是升维来解决问题。

通过增加一个维度,可以在高维度上,通过线性变换来处理低维度的仿射变换。

在这里插入图片描述

2.向量点乘,叉乘的定义及几何意义

2.1 向量点乘

点乘的数学定义:在这里插入图片描述
点乘的几何意义:两个单位向量之间夹角的余弦值。在这里插入图片描述

2.2 向量叉乘

参考:https://www.jianshu.com/p/ccdee786acbd
http://www.360doc.com/content/19/1222/18/40070800_881412732.shtml
https://juejin.cn/post/6886474840111317005
https://www.jianshu.com/p/c3e887c4c4f4

3.欧拉角与四元数与万向节死锁

欧拉角:

pitch俯仰角:点头,x轴为旋转轴。
yaw偏航角:左右摇头,y轴为旋转轴
roll滚动角:向日葵(招手)式的摇头,z轴为旋转轴。
在这里插入图片描述
在这里插入图片描述
经典面试题:欧拉角定义的旋转矩有什么问题,怎么处理?
欧拉角定义了绕着三个坐标轴的旋转角,来确定刚体的旋转位置的方式,包括俯仰角pitch,偏航角yaw和滚动角roll;
它的优点是比较直观,而且单个维度上的角度上比较容易插值;
缺点是它不能进行任意方向的插值,而且会导致万向节死锁的问题,旋转的次序也会对结果产生影响,也就是在旋转过程中会损失自由度。
我们依次绕坐标系x,y,z轴旋转,当绕y轴旋转90度后,z轴就指向了原来的x轴,这样一来。事实上只绕了x和y两个轴旋转,第三个轴的自由度缺失了。

四元数:

我们使用四元数一般就是简单的用来进行三维旋转,记住下面的几个公式:
首先,定义一个需要做的旋转。旋转轴为向量v = (vx,vy,vz),旋转角度为θ(右手法则的旋转)。
在这里插入图片描述
在这里插入图片描述
那么与此相对应的四元数(下三行式子都是一个意思,只是不同的表达形式)。
注意角度都是θ/2。
在这里插入图片描述
这是它的共轭(下三行式子都是一个意思,只是不同的表达形式)。
在这里插入图片描述

如果你想算一个点w = (wx,wy,wz)在这个旋转下新的坐标W’,需要进行如下操作。

    1. 定义纯四元数
      qw = (θ,wx,wy,wz) = θ+wxi+wyj+wz*k
    1. 进行四元数运算
      qw’ = q x qw x q-1
    1. 产生的qw’一定是纯四元数,也就是说它的第一项为θ,有如下形式:
      qw’ = (θ,wx’,wy’,wz’) = θ + wx’*i+wy’*j+wz’*k
    1. qw’中的后三项(wx’,wy’,wz’)就是w’:
      w’ = (wx’,wy’,wz’)

这样一来,就完成了一次四元数旋转运算。

同理,如果你有一个四元数:
q = (q1,q2,q3,q4) =在这里插入图片描述
那么,它对应一个以向量v = (vx,vy,vz)为轴旋转θ角度的旋转操作(右手法则的旋转)。

其他小记:

其实还有一些比较重要的数学上的知识,比如说MVP矩阵的推导,尤其是
VP矩阵的推导
三角形插值,透视插值矫正,光线追踪求交等。
都略知一二,但是都不是很深入,有待整理提高。
慢慢的往上加,但是一般在后面的章节里都有记载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/57087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL两种存储引擎及索引对比

MySQL两种存储引擎及索引对比 前言存储引擎主要区别相关命令存储引擎1: MyISAM存储引擎2: InnoDB其他存储引擎: 索引聚集(聚簇)索引二级索引 常见面试题为什么 DBA 都建议表中一定要有主键,而且推荐使用整型自增?为什么要有主键&a…

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图: 弹框信息: Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…

【vim 学习系列文章 4 - vim与系统剪切板之间的交互】

文章目录 背景1.1.1 vim支持clipboard 检查1.1.2 vim的寄存器 上篇文章:【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】 背景 从vim中拷贝些文字去其它地方粘贴,都需要用鼠标选中vim的文字后,Ctrlc、Ctrlv&#x…

GD32F103VET输出PWM波形

GD32F103VET将TIMER0_CH3映射到PE14引脚,使其输出PWM波形。测试时,使用示波器看PE14引脚输出的波形,效果更直观。 TIMER0之PWM输出引脚映射如下: TIMER0_REMAP[1:0]"00"(没有映射): TIMER0_CH0默认被映射到PA8引脚 TIMER0_CH1默认…

Grafana V10 告警推送

最近项目建设完成,一个城域网项目,相关zabbix和grafana展示已经完,想了想,不想天天看平台去盯网络监控平台,索性对告警进行分类调整,增加告警的推送,和相关部门的提醒,其他部门看不懂…

大数据分析案例-基于随机森林算法构建多发性硬化症预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

HIVE优化之不需要参数优化

#1.数据倾斜 什么是数据倾斜? 一部分数据多 一部分数据少 造成的结果: MR运行过慢 主要是shuffle和reduce过程慢 分组聚合导致数据倾斜 Hive未优化的分组聚合 方法1:在MAP端直接聚合(分组聚合优化),减少…

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目

Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…

echarts绘制甘特图

说在前面 项目上有需求,需要在大屏上展示进度甘特图,调研了DHTMLX和普加甘特图,效果都不是特别符合需求现状,查询了一些博客,决定使用echarts来绘制甘特图。 实现效果展示 实现思路分析 1、应该采用柱状图&#xff…

关于Java的IO流开发

IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候&a…

[自动化测试] 读取CSV 文件

CSV文件可以用来存储固定字段数据,可以通过excel 表格另存为csv文件,不要直接改文件名称创建,不是真正的csv文件 import csv import codecs from itertools import islice #读取本地csv文件 datacsv.reader(codecs.open(filename./data/us…

探讨|使用或不使用机器学习

动动发财的小手,点个赞吧! 机器学习擅长解决某些复杂问题,通常涉及特征和结果之间的困难关系,这些关系不能轻易地硬编码为启发式或 if-else 语句。然而,在决定 ML 是否是当前给定问题的良好解决方案时,有一…