绕任意轴旋转的矩阵推导总结

前言

常用的几何变换中旋转是较为复杂的一种,最近看《Physically Based Rendering, Second Edition: From Theory To Implementation》一书涉及绕任意轴旋转的实现,也给出了大体思路,但具体的推导过程及最后的旋转矩阵并未直接地给出,故根据参考Animated CGEM: Rotation About an Arbitrary Axis总结(欢迎指正)。

(一)基础

1.点乘与叉乘

点乘(dot)亦称作内积或数量积,如图,a·b = |a||b|cosφ

图1:两向量的内积

坐标形式:a = (ax, ay, az) ,b = (bx, by, bz)

a·b = axbx + ayby + azbz

叉乘(cross)亦称作外积,如图,叉乘满足|a x b| = |a||b|sinφ

图2:表示两向量的叉积

图3:左手系示意

由此,叉乘所得向量模为以两叉乘向量为邻边构成的平行四边形的面积大小,叉乘所得的向量与两向量垂直,方向在左手坐标系下依左手定则,pbrt用的是左手系,故手掌与ab向量构成的平面垂直,除拇指外四指由b转向a,此时拇指的方向即叉乘向量的方向(左手系三个坐标轴亦按上述方法确定)

叉乘的坐标形式:a=(a1,b1,c1),b=(a2,b2,c2)

a x b = (b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)

2.矩阵

对于线性变换(Linear Transformation),矩阵的三列就是在该变换下的三个坐标轴的反映,如果T是线性变换,M是对应的矩阵,那么矩阵M(4x4)中第一列即把T应用到(1,0,0,)的结果。

在齐次空间(Homogeneous Space)下,M描述一个线性变换,将M作用到坐标系中的x轴向量(1,0,0),恰好得到M的第一列,依次类推第二列即作用到y轴的结果,最后一列表示的是位置相关的信息。

即Mx = M [ 1 0 0 0]T = [m00 m10 m20 m30]T

(二)绕任意轴旋转的推导

直观形象:

图4:绕任意轴旋转的直观形象

v为被旋转向量,a为给定的任意的旋转轴

容易想象va旋转一周形成一个圆锥,更明确地说,将v沿旋转轴和垂直旋转轴方向分解为两个分向量,平行旋转轴的分向量并不旋转,是垂直分向量在平面内旋转

图5沿正面看 从a的方向往下看

推导:

图6:各向量间的关系

下列推导在a为单位向量的情况下进行,否则得到的是错误的结果

如上图,a是旋转轴,v是被旋转向量,v绕a旋转θ度,旋转平面与a垂直,vcv沿着a方向分解的分量,v1v沿着a的垂直方向分解的分量

a的起点为原点;以a为竖轴;v1为横轴(纵轴);与v1a垂直的向量v2为纵轴(横轴)建立坐标系,可以写旋转后得到的结果v’的向量表达式:

v’= vc + v1

图7:从正面看                                          俯视

易知:vc = a|v|cosα = (v·a)a

v1 = v - vc

v2 = v1 x a (注意a是单位向量,所以|v2| = |v1|)

v’= vc + v1

v1’= |v|cosθ·1/|v1v1 + |v|sinθ·1/|v2v2

但由于|v1| = |v2|= |v’|,故消去后得到:v= vc + v1cosθ + v2sinθ

再整理成矩阵形式,我们将这个矩阵应用到坐标系中,那么就实现了原来点或向量的旋转,最后完成旋转再将坐标系恢复为原坐标系。

a=(ax, ay, az), v =(1,0,0)

vc = (ax2,axay, axaz)

v1 = v - vc = (1-ax2, -axay, -axaz)

v2 = v1 x a = (0, az, -ay)

代入v= vc + v1cosθ + v2sinθ得:

a=(ax, ay, az), v =(0, 1, 0);令a=(ax, ay, az), v =(0, 0, 1)可得到旋转矩阵的第二列、第三列。

最终所得到的即Goldman公式:

时间: 06-30

绕任意轴旋转的矩阵推导总结的相关文章

构建绕任意轴旋转的矩阵

转载请注明出处:http://www.cnblogs.com/jietian331/p/5634039.html

矩阵变换:沿任意轴旋转及其推导

http://blog.csdn.net/zsq306650083/article/details/8773996 1. 2D中绕原点旋转 设基向量p,q和r分别是朝向+x,+y和+z方向的单位向量. 旋转角度为θ,基向量p,q绕原点旋转,得到新的基向量p`和q` 即旋转矩阵R(θ)为 2. 3d中绕坐标轴旋转 01. 绕x轴旋转,基向量q和r旋转θ,得到新的基向量q`和r` 即旋转矩阵Rx(θ)为: 02. 绕y轴旋转,基向量p和r旋转θ,得到新的基向量p`和r` 即旋转矩阵Ry(θ)为: 0

cocos2dx--- Node 绕Y轴旋转

step += 5; float ra = (float) CC_DEGREES_TO_RADIANS(step); float i = sinf(ra) * pNode->getCamera()->getZEye(); float j = cosf(ra) * pNode->getCamera()->getZEye(); pNode->getCamera()->setEyeXYZ(i, 0, j); cocos2dx--- Node 绕Y轴旋转,布布扣,bubuko.

定点绕定轴旋转

通过两个已知点,绕定轴旋转360次,每次旋转一度,获得360个点,一次相连,可以获得一个近似圆.网上找的公式基本都是左手坐标系下的选择公式,故而进行了多次坐标转换 1.3.2版本 public static List<Vector3d> Translate(List<Vector3> list) { List<Vector3d> zuoshou = new List<Vector3d>();//存左手坐标系下的各点坐标 List<Vector3d>

(转)android3D动画,绕y轴旋转

原文地址:http://blog.csdn.net/x_i_a_o_h_a_i/article/details/40449847 其实网上的3D旋转的例子很多,在这里我只是想把其代码做一个解释. 先上图: 代码: TurnAroundActivity /** * 图片浏览器的主Activity. * * @author guolin */ public class TurnAroundActivity extends Activity { /** * 根布局 */ private Relativ

在平面中,一个点绕任意点旋转θ度后的点的坐标

假设对图片上任意点(x,y),绕一个坐标点(rx0,ry0)逆时针旋转a角度后的新的坐标设为(x0, y0),有公式: x0= (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0 ; y0= (x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0 ;

实现物体绕不同轴旋转,并可以外部调用的函数

第一个文件,声明枚举类型,分别为均匀变化和加速变化 1 2 3 4 5 6 7 8 using UnityEngine; using System.Collections; public enum CTRotationType {     Uniform,     AccelerateUniformly } 第二个文件:主函数,实现围绕轴变化的两个函数,分别为均匀变化和加速变化   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Unity3D 控制物体旋转详解 —— 自身绕轴旋转、缓慢旋转、鼠标控制旋转、欧拉数和四元数的关系

问题描述:昨天需要实现一个功能是根据指令左转90度或者右转90度,当时脑汁可能是有浆糊吧,居然要用直接赋值rotation,这样一来就要牵扯到eulerAngles和四元数的Euler函数了,结果忙活了好久没解决,bug层出,今天经过详细了解,解决了相关问题,一并把其他关于角度和旋转的知识点整理出来. 一.问题的解决:如何让物体绕自身轴旋转 直接上关键代码: player_cube.Rotate(-90, 0, 0); player_cube是获取的需要旋转的物体的Transform,其中-90

绕单轴的旋转矩阵

对于绕单轴的旋转矩阵,很多小伙伴分不清楚到底是B转W还是W转B的,下面就先用上面对旋转矩阵的理解来推导一下绕单轴的旋转矩阵,然后介绍下怎么记忆.注意对旋转正负号的定义,惯用的定义是,从原点沿着坐标轴看,顺时针为正.下面看图. 初始状态的W和B系绕Z轴旋转绕Y.X轴旋转 这样就通过计算B系各坐标轴在W系的投影得到了绕各轴旋转的  ,反之计算W系在B系的投影就可得到绕各轴旋转的  ,不过因为它们互为转置,所以得到了一个,就知道另一个了. 注意这里的W系和B系可以换成任意两个坐标系,只要把握哪个坐标系