ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图形学中一些旋转矩阵推导

2022-01-29 22:31:28  阅读:255  来源: 互联网

标签:推导 Quaternion 矩阵 图形学 旋转 四元 Unity 向量


一、2D中向量旋转公式推导

已知向量(x,y)旋转θ角之后得到向量(x',y')

如下图所示
image
这时我可以看到的是信息是

旋转后的向量与之前的向量长度r它是不变的

第一个向量所具有的信息是
image
旋转后的向量所具有的信息是
image
根据三角函数公式
image
将此关系式拆开就可以得到
image
最后可以得到
image
写成矩阵形式
image

二、从局部空间变换到世界空间SRT矩阵中R的推导记忆

我这里是unity的左手坐标系,所以接下来我都用左手定则来阐述
image
首先我们先看,绕z轴的3维坐标变换
image
z坐标保持不变,旋转x、y坐标,这可不就是我们上面推导的二维坐标系的旋转公式吗

这样我们可以直接得到
image
除了y轴旋转有点不同,x轴与z轴都是在相应位置的二维旋转变换

那么为什么y轴会不同

看旋转方向

绕z轴旋转,是从x轴开始,绕原点逆时针旋转(你也可以想成x叉乘y,正好等于z轴)

绕x轴旋转,是从y轴开始,也绕原点逆时针旋转(你也可以想成y叉乘z,正好等于x轴)

可是绕y轴旋转,是从x轴开始,绕原点逆时针旋转(x叉乘z,等于-y)

所以相当于把角度向反方向旋转,这就等于了绕y轴旋转,旋转矩阵不同的记忆方法

害,之前硬啃《Unity Shader入门精要》的时候没多想,直接硬记,果然这些东西还是自己有能力推一遍会更加深刻吧

三、绕任意轴旋转矩阵

在图形学中,我们经常会遇到绕轴旋转的问题,这里先记录下欧拉角公式里的绕任意轴旋转

下面是我学习笔记,思路可能结果和思路都有可能出错,不代表绝对,仅供参考。
image

假设一个向量n(0,0,1),并将它看作旋转轴,再假设一点v(x,y,z),绕n向量(轴),旋转θ角,得到v’(x1,y1,z1).

首先我先找到它们共有的信息:

显然||v||模是等于||v’||模的.

根据向量加减,我们可以得到image
(向量v等于水平方向v//加竖直方向v⊥)
image
由这张图我们可以想到,image,那么我们先求出向量image
image向量v投影到向量n的长度再乘于**单位向量n **得到的。
image

非常好,我已经得到一个已知量了,只要再求个v'⊥就可以了,
我们不妨求个垂直于v//v'⊥的向量w
image
image
根据image
这些都是我们已知的了,代入方程式1;
image
自此我们得到了x基向量v'⊥
很好,再来求个y基向量也就是向量w,我们就可以知道旋转后的v'⊥
根据方程式2:
image
同轴同向叉乘无意义,最后得
image
完事了,最后将方程填完就可以得到v'⊥
image
image
image

仅供参考

四、Unity中解决万向节锁

1、首先什么是万向节锁1、首先什么是万向节锁

按我的理解就是,正常情况直接使用transform.localEulerAngles是没问题的,但是根据Unity的zxy的旋转规则,当你是先绕x轴(pitch俯仰)旋转90度后,这时再去单独旋转y(Yaw偏航),和单独旋转z,效果都是绕z轴(Roll桶滚)旋转,这就不是我们要的结果了。

然后解决的办法就是用四元数(Quaternion)

2、什么是四元数

这个我推荐去b站搜四元数

3、结论

通过了解与实际操作后,将欧拉角带入unity四元数Quaternion.Euler()中即可。

Unity官方文档关于Quaternion的描述:
https://docs.unity3d.com/ScriptReference/Quaternion.html

本人之前在搞摄像机跟随旋转视角和人物转向的时候踩过一次坑,之后通过各种资源知道了用四元数,所以在这按自己的想法记录下,同时也推荐朋友们去了解,共同进步

标签:推导,Quaternion,矩阵,图形学,旋转,四元,Unity,向量
来源: https://www.cnblogs.com/Ariaaaaaa/p/15856018.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有