图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维

1.1 缩放矩阵

在这里插入图片描述

x,y分别表示在x轴,y轴缩放的倍数

示例: 点(2,1)在x,y轴上分别缩放x倍,y倍

在这里插入图片描述

1.2 平移矩阵

在这里插入图片描述

x,y分表表示在x轴,y轴上移动的距离

示例:点(2,1)分别在x轴,y轴上平移x距离,y距离
在这里插入图片描述

1.3 旋转矩阵

在这里插入图片描述
示例:点(x,y) 绕原点逆时针旋转θ°
在这里插入图片描述

示例:
点 (2,0) 绕原点旋转90°
在这里插入图片描述

绕任一点旋转?
转为先平移到这个点, 再旋转即可。

1.4 变换顺序

先平移再旋转,得到的变换矩阵是:
在这里插入图片描述
示例:

(2,0) 先平移 (0,2) 再旋转90°应该为: (-2,2)
在这里插入图片描述

如果换成是先旋转再平移则是(0,4):
在这里插入图片描述

二、三维

2.1 缩放矩阵

在这里插入图片描述

x,y,z分别表示点在x,y,z轴缩放的倍数

示例:
点 (2,1,2) 在x,y,z轴上分别缩放x,y,z倍
在这里插入图片描述

2.2 平移矩阵

在这里插入图片描述

示例:
点(2,1,2) 在x,y,z轴上分别移动 x,y,z距离
在这里插入图片描述

2.3 旋转矩阵

在这里插入图片描述

θ 表示点绕过原点的 x, y, z 轴旋转θ°
注意:绕某轴旋转则眼睛看向某轴的负方向,逆时针为正,顺时针为负(和左右手坐标系没关系)。

参考: https://zhuanlan.zhihu.com/p/147282442

示例:

  • 点(2,1,2) 绕过原点的y轴旋转90°,应为:(2, 1, -2)

在这里插入图片描述
在这里插入图片描述

  • 点(1,2,2) 绕过原点的x轴旋转90°,应为:(1,-2,2)
    在这里插入图片描述
  • 点(2,2,1) 绕过原点的z轴旋转90°,应为(-2,2,1)
    在这里插入图片描述

绕任一点旋转?
转为先平移到这个点, 再旋转即可。

2.4 变换顺序(同二维,不再赘述)

三、threejs中的矩阵变换 (Matrix3)

3.1 矩阵存储格式

如果将矩阵的元素存储为数组的话,我们人类易读的是行优先,但three.js采用的是列优先,它们区别如下:
在这里插入图片描述
不过,虽然three.js内部存储是列优先,但在传参时遵循的是行优先,看下面源码:

在这里插入图片描述

3.2 旋转方向的奇怪问题

three.js中使用矩阵旋转的时候有个奇怪的地方,如下:

  • new THREE.Matrix3().makeRotation(Math.PI/2):从0创建一个旋转矩阵,逆时针旋转90°;
  • new THREE.Matrix3().rotate(Math.PI/2):累加旋转, 顺时针旋转90°;

下面是例子:

<script type="module">
	import * as THREE from 'three';
	//makeRotation: 逆时针为正
	var m2 = new THREE.Matrix3().makeRotation(Math.PI/2);
	var ret2 = new THREE.Vector2(2,0).applyMatrix3(m2);
	//输出: (2,0) makeRotation(90°): {"x":1.2246467991473532e-16,"y":2}
	console.log(`(2,0) makeRotation(90°): ${JSON.stringify(ret2)}`)	
	
	//rotate是累加: 顺时针为正
	var m = new THREE.Matrix3().rotate(Math.PI/2);
	var ret = new THREE.Vector2(2,0).applyMatrix3(m);
	//输出: (2,0) rotate(90°): {"x":1.2246467991473532e-16,"y":-2}
	console.log(`(2,0) rotate(90°): ${JSON.stringify(ret)}`)
</script>

3.3 其他示例

<script type="module">
	import * as THREE from 'three';
	//先平移后逆时针旋转
	var m = new THREE.Matrix3().translate(0,2).rotate(-Math.PI/2);
	var ret = new THREE.Vector2(2,0).applyMatrix3(m);
	//(2,0) 先平移(0,2)后逆时针旋转90°: {"x":-1.9999999999999998,"y":2}
	console.log(`(2,0) 先平移(0,2)后逆时针旋转90°: ${JSON.stringify(ret)}`)
	
	//先逆时针旋转后平移
	var m2 = new THREE.Matrix3().rotate(-Math.PI/2).translate(0,2);
	var ret2 = new THREE.Vector2(2,0).applyMatrix3(m2);
	//(2,0) 先逆时针旋转90°后平移(0,2): {"x":1.2246467991473532e-16,"y":4}
	console.log(`(2,0) 先逆时针旋转90°后平移(0,2): ${JSON.stringify(ret2)}`)
</script>

四、c#中的矩阵 (Matrix3x2)

查看的c#矩阵源码地址:《Matrix3x2.Impl.cs》

4.1 矩阵存储格式

没有存储9个矩阵元素,而是6个,如:
在这里插入图片描述
内部存储是用了三个 Vector2 向量存储,参考源码:
在这里插入图片描述

4.2 奇怪的相乘顺序

一般认为的:
在这里插入图片描述

但实际上,c#是右乘,如:

//(2,0) 先逆时针旋转90°, 再平移 (0,2)
var m = Matrix3x2.CreateRotation(MathF.PI / 2) * Matrix3x2.CreateTranslation(0, 2);
//输出 (0,4)
Console.WriteLine(Vector2.Transform(new Vector2(2, 0), m));

但,,,好像结果是对的。。。这就牵扯到另外一个问题:

4.3 奇怪的矩阵转置

一般认为,平移矩阵是:
在这里插入图片描述
但c#构造后是:
在这里插入图片描述
参考源码:
在这里插入图片描述

一般认为,构造旋转矩阵是:
在这里插入图片描述
但c#构造后是:
在这里插入图片描述
参考源码:
在这里插入图片描述

但,恰好是 转置的矩阵右乘 刚好和我们认为的(非转置矩阵左乘)效果一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——指针的高级引用

目录 1.概述 2.虚拟内存空间 2.1存储期限 2.2栈区管理 2.3堆区域的使用 3.动态内存分配和释放&#xff08;重点&#xff09; 3.1通用指针类型void 3.2内存分配malloc函数 3.2.1 malloc函数&#xff08;memory allocation&#xff09;&#xff08;注意len*size&#xff…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

【高项】信息化发展

目录 1.1 信息与信息化 1.1.1 信息 1.信息的定义 2.信息的特征与质量 1.1.2 信息系统 1.信息系统及其特性 2.信息系统生命周期 1.1.3 信息化 1.信息化内涵 2.信息化体系&#xff08;口诀&#xff1a;上应下技左人右规&#xff0c;中资网&#xff09; 1.2 现代化基础…

Vue笔记 2

数据代理 数据代理&#xff1a;通过一个对象代理对另一个对象中属性的操作&#xff08;读/写&#xff09; let obj{x:100} let obj2{y:200} Object.defineProperty(obj2,x,{get(){return obj.x},set(value){obj.x value} })Vue中的数据代理 Vue中的数据代理&#xff1a; 通…

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏

u盘之前还好好的,可以传输文件,使用正常,但是最近使用时却出现问题了。只要将u盘一插入电脑,电脑就显示蓝屏。u盘为什么一插上电脑就蓝屏呢?一般,导致的原因有以下几种。一,主板的SATA或IDE控制器驱动损坏或安装不当;二,电脑系统分区存在磁盘或文件故障错误;三,电脑中…

【力扣】125.验证回文串

刷题&#xff0c;过了真的好有成就感&#xff01;&#xff01;&#xff01; 题解&#xff1a; 根据题目要求&#xff0c;我们需要处理一下几个问题&#xff1a; 将大写字母转变成小写对原来的字符串进行处理&#xff0c;只要字母和数字考虑只有一个和字符串为空的情况 1、将…

element-ui backtop 组件源码分享

今日简单分享 backtop 组件的源码实现&#xff0c;从以下三个方面&#xff1a; 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性&#xff0c;触发滚动的对象&#xff0c;类型 string&am…

【保姆级讲解Nginx】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【Linux系统编程】第一弹---背景介绍

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux 背景介绍 1.1、发展史 1.1.1、UNIX发展的历史 1.1.2、Linux发展历史 2、开源精神 3、Linux内核官网 4、企业应用…

SAP SD学习笔记04 - 出荷Plant(交货工厂),出荷Point(装运点),输送计划,品目的可用性检查,一括纳入/分割纳入,仓库管理

上一章讲了SD的主数据。 SAP SD学习笔记03 - SD模块中的主数据-CSDN博客 本章讲出荷Plant&#xff08;交货工厂&#xff09;&#xff0c;出荷Point&#xff08;装运点&#xff09;和出和路线。 还是偏理论多一些&#xff0c;后面的文章尽量多加些练习巩固一下。 1&#xff0…

2024年思维100春季线上比赛倒计时8天,来做做官方样题

今天是2024年4月12日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有8天。今年思维100活动的考试重点是什么呢&#xff1f;虽然主办方未公布&#xff0c;我们可以从主办方发布的参考题目中来推测今年的考试重点&#xff0c;并且按照这个来举一反三&#x…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

百科引流攻略|小马识途分享百科营销的五个技巧

纵观整个互联网领域&#xff0c;国内几大巨头百度、抖音、腾讯都布局了自身的百科平台&#xff0c;百科营销也始终作为网络营销一个重要分支而存在。很多人都知道百科营销是品牌背书的一把王牌&#xff0c;但很少有人提及百科营销的引流作用。 有人可能会说&#xff0c;百科词条…

K8S资源管理之计算资源管理

1.详解Requests和Limits参数 以CPU为例&#xff0c;下图显示了未设置Limits与设置了Requests和Limits的CPU使用率的区别 尽管Requests和Limits只能被设置到容器上&#xff0c;但是设置了Pod级别的Requests和Limits能大大提高管理Pod的便利性和灵活性&#xff0c;因此在Kubernet…

【RV1106的ISP使用记录之二】设备树的构建

基于MIPI接口的两种摄像头接入方式&#xff0c;理清楚各链路关系&#xff0c;方便后续的开发调试工作&#xff0c;先上一张图&#xff0c;后面再补充解释。

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

IP广播对讲系统停车场解决方案

IP广播对讲系统停车场解决方案 一、需求分析 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要停车场系统提高工作效率与服…

Asterisk 21.2.0编译安装经常遇到的问题和解决办法之pjproject风云再起

目录 pjproject问题的另外一种形式上传文件来解决关于pjproject 为什么要用指定版本的 pjproject问题的另外一种形式 在反复测试Asterisk 21.2.0版本安装的时候&#xff0c;在 ./configure 的时候又遇到一个跟pjproject有关的问题&#xff0c;错误提示信息是这样的&#xff1a…

【Linux】UDP协议

UDP协议 1.再谈端口号端口号划分认识知名端口号(Well-Know Port Number)两个问题netstatpidof 2.UDP协议2.1UDP的特点2.2面向数据报2.3UDP的缓冲区2.4UDP使用注意事项2.5基于UDP的应用层协议 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.再谈端口号 端口…