绕任意轴旋转的推导

转载 2015年07月08日 10:27:05

万丈高楼平地起;勿在浮沙筑高台。

暂时放下其他的东西的学习,还不能称之为学习。潜心研究pbrt,看到第二章绕任意轴的旋转一部分,但是只是给了一个大体的推导,最终的推导并没有给出,所以在此做一下简单的推导。

给定一个规范化的方向向量a作为旋转轴,然后使向量v绕着这个轴旋转θ度,如图1所示,首先我们计算一个平行于向量a的向量 ,此向量与向量a的起点相同,终点与向量v的终点(此时向量v与向量a起点相同)在以a为法线的平面上。假设向量v与a之间的夹角为 ,那么我们有

image图1,绕任意轴旋转示意图

我们首先在这个平面上构造一组向量基 v1与 v2,其中 v1是v1=v - vc

另外一个基向量可以通过两个向量的叉乘得到:v2 = (v1 x a),因为向量a是规范化的,所以v1与v2具有相同的长度,这个长度与v与vc之间的向量长度相同。在旋转平面(v1与v2所在的平面)来计算v绕向量vc旋转θ得到:

F]Z{1G~~UG9OP)JA%ZK)L0X

再继续下面推导之前先复习一下向量点乘与叉乘的基本规律:

向量点乘符合以下规律:

]TM145XK7I`FRL`D[$8N3TC

向量叉乘符合以下规律:

`9P5MH}21~V$U]83E1WL1{T

现在可以开始推导上面的公式了,推导过程如下:(手机效果太烂。。。将就着看吧)

 

_L2@P]1C9`@8HBKU$UR958M

最后附上源码:

   1: Transform Rotate(float angle, const Vector &axis) {
   2:     Vector a = Normalize(axis);
   3:     float s = sinf(Radians(angle));
   4:     float c = cosf(Radians(angle));
   5:     float m[4][4];
   6:  
   7:     m[0][0] = a.x * a.x + (1.f - a.x * a.x) * c;
   8:     m[0][1] = a.x * a.y * (1.f - c) - a.z * s;
   9:     m[0][2] = a.x * a.z * (1.f - c) + a.y * s;
  10:     m[0][3] = 0;
  11:  
  12:     m[1][0] = a.x * a.y * (1.f - c) + a.z * s;
  13:     m[1][1] = a.y * a.y + (1.f - a.y * a.y) * c;
  14:     m[1][2] = a.y * a.z * (1.f - c) - a.x * s;
  15:     m[1][3] = 0;
  16:  
  17:     m[2][0] = a.x * a.z * (1.f - c) - a.y * s;
  18:     m[2][1] = a.y * a.z * (1.f - c) + a.x * s;
  19:     m[2][2] = a.z * a.z + (1.f - a.z * a.z) * c;
  20:     m[2][3] = 0;
  21:  
  22:     m[3][0] = 0;
  23:     m[3][1] = 0;
  24:     m[3][2] = 0;
  25:     m[3][3] = 1;
  26:  
  27:     Matrix4x4 mat(m);
  28:     return Transform(mat, Transpose(mat));
  29: }

OpenGL实现鼠标绕任意轴旋转/平移/缩放

刚刚学opengl的童鞋肯定有个苦恼的麻烦,只会绘制一个三角形,但是想像那些三维软件那样用鼠标控制视角还是有点困难的,所以我就封装了一个场景漫游类:RoamingScenceManager,这个类使用...

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

1. 2D中绕原点旋转 设基向量p,q和r分别是朝向+x,+y和+z方向的单位向量。 旋转角度为θ,基向量p,q绕原点旋转,得到新的基向量p`和q` 即旋转矩阵R(θ)为 ...

3D数学--学习笔记(三):3D中绕任意轴的旋转

3D游戏开发基础--3D中绕任意坐标轴的旋转

3D 空间中物体绕任意轴旋转公式

占位
  • cluner
  • cluner
  • 2010年03月26日 16:16
  • 725

绕任意轴旋转的矩阵推导

绕任意轴旋转的矩阵推导   左手坐标系下,一点绕任意轴旋转θ角的右乘矩阵: 其中C为cosθ,S为sinθ,A为单位化的旋转轴 以下推导均为左手坐标   首先我们将P看成从原点出发的自由向量,将其...

3D中绕任意轴旋转的推断问题

当然也能绕3D中任意轴旋转。因为这里不考虑平移,可以假设旋转轴通过原点。这种旋转比绕坐标轴的旋转更复杂也更少见。用单位向量n描述旋转轴,和前面一样的θ描述旋转量。让我们导出绕轴n旋转角度θ的矩阵。也就...
  • L_Andy
  • L_Andy
  • 2016年08月19日 09:50
  • 2135

3D数学--学习笔记(三):3D中绕任意轴的旋转

本文转自:http://blog.csdn.net/zjc_game_coder/article/details/24269757 不要小看我们在Unity或者3DMAX中的一个简单的旋转物体操作。...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

[转载]空间点绕任意轴旋转变换公式

空间点绕任意轴旋转变换公式 P点绕A向量旋转θ角后得到P': P' = Pcosθ + (A × P)sinθ + A(A·P)(1 - cosθ) 注意:视口为向量指向的位置,就是向...

编译在iphone下的freetype

 原始URL: http://www.alfredrossi.com/?p=73When I was first looking into building FreeType for the iPho...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绕任意轴旋转的推导
举报原因:
原因补充:

(最多只允许输入30个字)