四元数与三维向量相乘运算法则

三维网格数据处理 专栏收录该内容
1 篇文章 0 订阅

四元数与三维向量相乘运算法则

参考网站:
https://www.cnblogs.com/jeason1997/p/9822353.html

四元数和向量相乘可以表示这个向量按照这个四元数进行旋转之后得到的新的向量。
例如:向量 c(0,0,10) 绕着Y轴旋转90°,得到新的向量是 c(10,0,0)。

通常四元ss被记为(w,x,y,z)或(x,y,z,w),以下q表示四元数,v表示向量,那么四元数和向量相乘的运算法则表示为:
q x v = (q) x (v) x (q-1)
例: q = (√2/2 , 0 , √2/2 , 0);
这里需要将三维向量v扩充为四元数(0,v), 如c(0,0,10)变为c(0,0,0,10);
q-1 是四元数q的逆,求逆过程如下:
共轭四元数:q*=(w,-x,-y,-z) 则为 (√2/2 , 0 ,-√2/2 , 0)
四元数的模:N(q) = √(x2 + y2 + z2+ w2 ),通常四元数表示为单位四元数,所以模等于1
四元数的逆: q-1 = q*/N(q) 则为 (√2/2 , 0 ,-√2/2 , 0)

四元数的乘法公式:
四元数叉乘
按照上述公式可得到新四元数(0,10,0,0),则旋转后新坐标为(10,0,0)
按上述方法计算所得到的新四元数的首项一定等于0。

上述方法 R语言实现:

  1. 计算共轭四元数
q_star <- function(q){
  qstar <- c(q[1],-q[2],-q[3],-q[4])
  return(qstar)
}
  1. 计算四元数模
Nq <- function(q){
  N <- sqrt(q[1]^2+q[2]^2+q[3]^2+q[4]^2)
  return(N)
}
  1. 计算四元数的逆
q_reverse <- function(q){
  qreverse <- q_star(q)/Nq(q)
  return(qreverse)
}
  1. 叉乘公式
q_multiply <- function(a,b){
  w1 <- a[1]
  x1 <- a[2]
  y1 <- a[3]
  z1 <- a[4]
  w2 <- b[1]
  x2 <- b[2]
  y2 <- b[3]
  z2 <- b[4]
  amulb <- c((w1*w2-x1*x2-y1*y2-z1*z2),(w1*x2+x1*w2+y1*z2-z1*y2),
             (w1*y2+y1*w2+z1*x2-x1*z2),(w1*z2+z1*w2+x1*y2-y1*x2))
  return(amulb)
}
  1. 四元数与三维向量相乘
mul <- function(q,v){
  a <- q_multiply(q,v)
  b <- q_multiply(a, q_reverse(q))
  return(b)
}
  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值