游戏开发的数学知识(一)三维向量绕某一向量旋转

最近在b站看到的某up主搬运了youtube大佬的游戏开发数学知识所以这里总结一下每一节讲的游戏开发中的数学问题

原视频链接 https://www.bilibili.com/video/BV1Yt411p7Nj?p=1

第一节讲解了三维向量绕某一向量旋转角度

下图中是v向量绕着n向量旋转θ角度的透视图,v向量是需要旋转向量,v'是旋转后的向量,n向量是旋转轴,p向量是v向量在n向量的投影,e向量是v-pf向量是v向量和p向量的叉乘但是大小等于e向量(也就是旋转轨迹构成的圆的半径),e'向量是旋转后的v'-p

游戏开发的数学知识(一)三维向量绕某一向量旋转

这里开始推导旋转公式

 

我们的目的是用v向量 ,n向量,和θ来表示出v'向量

第一步根据辅助图可以得出       

v' = p+e'                                 

好,现在目标就是用v ,n,和θ来表示出pe'

p向量根据向量点乘也很容易得出

p = (v·n)n                                   

现在来表示e'向量

       由于e'比较复杂,我画了一个从n看过去的鸟瞰图如下

游戏开发的数学知识(一)三维向量绕某一向量旋转

 

       看图可以知道

          e'=f·cos(θ-90°)+f⊥sin(θ)+f⊥

       因为 f⊥f是垂直的,e也和f垂直,所以f⊥ // e,并且|e|=|f|所以

          f⊥=-e·sin(θ-90°) = e·cos(θ)

       e向量比较容易得到

          e=v-p

将 上面三个式子整理下就得到

 e'=sin(θ)+(v-p)·cos(θ)           ③

 

下面就该表示f向量了

f的方向是垂直与vp的所以这里用到叉乘,同时f的模长等于e并且等于|v|·sin(vn的夹角),稍微思考下正好是

f = nxv                                     

我们整理一下,①②③④就可以用v,n,θ来表示v'

v' =cos(θ)+(v·n)n(1-cos(θ))+nxsin(θ)

这里就可以自己直接抽取函数(c#)

  private  Vector3 RotationForAxis(Vector3 v,Vector3  n ,float θ){

           return v*Mathf.Cos(θ)+Vector3.Dot(v,n)*n(1-Mathf.Cos(θ))+Vector3.Cross(n,v)*Mathf.Sin(θ);

}

当然直接用unity中的四元数也可以实现

v'=Quaternion.AngleAxis(θ,n)*v

 

如果上面有疑问,随时欢迎评论,我会第一时间回答。