Java教程

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

本文主要是介绍图形学中一些旋转矩阵推导,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、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

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

这篇关于图形学中一些旋转矩阵推导的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!