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

这篇具有很好参考价值的文章主要介绍了图形学基础:二维三维刚体的移动、缩放和旋转矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、二维

1.1 缩放矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

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

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

1.2 平移矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

示例:点(2,1)分别在x轴,y轴上平移x距离,y距离
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

1.3 旋转矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
示例:点(x,y) 绕原点逆时针旋转θ°
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

示例:
点 (2,0) 绕原点旋转90°
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

1.4 变换顺序

先平移再旋转,得到的变换矩阵是:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
示例:

(2,0) 先平移 (0,2) 再旋转90°应该为: (-2,2)
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

如果换成是先旋转再平移则是(0,4):
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

二、三维

2.1 缩放矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

示例:
点 (2,1,2) 在x,y,z轴上分别缩放x,y,z倍
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

2.2 平移矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

示例:
点(2,1,2) 在x,y,z轴上分别移动 x,y,z距离
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

2.3 旋转矩阵

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

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

示例:

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

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

  • 点(1,2,2) 绕过原点的x轴旋转90°,应为:(1,-2,2)
    图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
  • 点(2,2,1) 绕过原点的z轴旋转90°,应为(-2,2,1)
    图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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

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

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

3.1 矩阵存储格式

如果将矩阵的元素存储为数组的话,我们人类易读的是行优先,但three.js采用的是列优先,它们区别如下:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
不过,虽然three.js内部存储是列优先,但在传参时遵循的是行优先,看下面源码:

图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

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个,如:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
内部存储是用了三个 Vector2 向量存储,参考源码:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

4.2 奇怪的相乘顺序

一般认为的:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

但实际上,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 奇怪的矩阵转置

一般认为,平移矩阵是:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
但c#构造后是:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
参考源码:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

一般认为,构造旋转矩阵是:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
但c#构造后是:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数
参考源码:
图形学基础:二维三维刚体的移动、缩放和旋转矩阵,数学基础,threejs/webgl,矩阵,线性代数

但,恰好是 转置的矩阵右乘 刚好和我们认为的(非转置矩阵左乘)效果一致。文章来源地址https://www.toymoban.com/news/detail-852374.html

到了这里,关于图形学基础:二维三维刚体的移动、缩放和旋转矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Blender基础操作:移动、旋转、缩放、删除、抓取、复制

    1. 物体的移动 微调面板:Adjust last operation:对上一步操作进行微调 2.物体旋转与缩放 快速归位 几个快捷键 ALT+G 坐标归零 ALT+R 旋转归零 ALT+S 缩放归零 3.删除、抓取、复制 快捷键x:确认后删除 (视图不能缩放处理方法:选择视图》对齐视图》游标居中并查看全部/视图中心对

    2024年02月11日
    浏览(50)
  • 【入门】DoTween的基础API使用(一):移动缩放循环震动旋转

    DoMove      DoLocalMove 在自身坐标系之内移动 (1秒之内)  (1,1,1 的大小最终会变成 4,4,4) (最终的大小一直是 2,2,2, 很快的变大变小) (也是2,2,2 但是匀速) (注意参数为 -1 )    

    2024年02月16日
    浏览(60)
  • Web3D数学基础(平移、旋转、缩放矩阵)—WebGL、WebGPU、Threejs

    参考资料:threejs中文网 threejs qq交流群:814702116 本下节课给大家介绍下矩阵的概念,以及用于几何变换的矩阵,比如平移矩阵、缩放矩阵、旋转矩阵。 如果你对这些几何变换的矩阵概念比较熟悉,可以跳过本节课。 线性代数、图形学 如果你有《线性代数》、《计算机图形学

    2024年02月03日
    浏览(50)
  • 二维坐标基本变换(平移、旋转、缩放、镜像、阵列)

    诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。 首先,定义点类如下: 注意,为了形式统一,变换矩阵应统一为3*3阶,同理,对于三维坐标变换矩阵应是4*4阶。关于矩阵的表示,实际上

    2024年02月04日
    浏览(76)
  • 【数理知识】求刚体旋转矩阵和平移矩阵,已知 N>=3 个点在前后时刻的坐标,且这 N>=3 点间距离始终不变代表一个刚体

    序号 内容 1 【数理知识】自由度 degree of freedom 及自由度的计算方法 2 【数理知识】刚体 rigid body 及刚体的运动 3 【数理知识】刚体基本运动,平动,转动 4 【数理知识】向量数乘,内积,外积,matlab代码实现 5 【数理知识】最小二乘法,从线性回归出发,数值举例并用最小

    2024年02月13日
    浏览(39)
  • Unity- 控制物体旋转、移动、缩放的功能

    本文章主要介绍Unity中控制物体旋转、移动、缩放的方法~ 旋转: (一)控制物体自转 (二)控制物体A绕着物体B转 脚本放在物体A上,再将物体B拖到脚本相应位置上 移动: 物体不断向前移动  扩展:使用键盘(上下左右箭头)控制物体前后左右移动 缩放: ① 物体放大一倍

    2024年02月08日
    浏览(47)
  • Unity控制相机旋转、移动、缩放等功能

    提示: 该脚本允许你以指定的速度和角度围绕模型进行相机旋转,并可以控制相机的移动和缩放 将该脚本添加到一个游戏对象上,并将其作为主摄像机。 1、在Unity编辑器中,你可以在脚本的参数变量部分调整相机的速度、缩放和移动等设置。根据需求,修改各个参数的值。

    2024年02月04日
    浏览(52)
  • Unity鼠标控制3D物体的移动、旋转、缩放

    1.使用协程 2.鼠标左键控制物体移动,鼠标碰到物体,物体颜色改变 1. 控制物体左右旋转,上下旋转 2. 控制摄像机以物体为中心旋转 脚本挂载到摄像机上 1. 基于物体本身的Transform的缩放 2. 基于摄像机的远近的缩放 脚本挂载到摄像机上

    2024年02月11日
    浏览(50)
  • unity3d---移动、缩放、旋转

    目录 1.示意图 2.触屏移动与缩放+键盘移动、旋转与缩放+鼠标移动旋转与缩放 1.示意图   2.触屏移动与缩放+键盘移动、旋转与缩放+鼠标移动旋转与缩放

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包