向量沿着另一个向量旋转-旋转轴和四元数

stackoverflow上看到的问题:
I have two vectors as Python lists and an angle. E.g.:

v = [3,5,0]
axis = [4,4,1]
theta = 1.2 #radian
What is the best/easiest way to get the resulting vector when rotating the v vector around the axis?

也就是v沿着axis转1.2弧度,求旋转后向量,发现答案都很复杂。贴个简单的,再加个难度,一般都是很多点。

import numpy as np
from scipy.spatial.transform import Rotation as R
def rot():
    v=[3, 5, 0]
    v=np.asarray([v,v])
    axis=[4, 4, 1]
    theta=1.2  # radian
    a=np.asarray(axis)
    b=a/np.linalg.norm(a)
    r=R.from_rotvec(theta * b)
    m=r.as_matrix()
    c=np.matmul(m,v.T)
    print(c.T)

结果:[2.74911638 4.77180932 1.91629719] 和得票最多回答一样。

补充一个四元数的方法,网上太多说四元数,从数学角度说的很复杂,从使用角度,这个工具就是来解决旋转的,那么还是上面的例子,

import numpy as np
from scipy.spatial.transform import Rotation as R

v = [3, 5, 0]
v = np.asarray([v, v])
# v = np.asarray(v)

axis = np.asarray([4, 4, 1])
theta = 1.2  # radian


def rot():
    b = axis / np.linalg.norm(axis)
    r = R.from_rotvec(theta * b)
    m = r.as_matrix()
    c = np.matmul(m, v.T)
    print("旋转轴结果==", c.T)


def quat():
    b = axis / np.linalg.norm(axis)
    quat = np.append(np.sin(theta / 2) * b, [np.cos(theta / 2)])
    r = R.from_quat(quat)
    m = r.as_matrix()
    c = np.matmul(m, v.T)
    print("四元数结果===", c.T)

两种结果完全一样 注意四元数是如何构造的,先把旋转轴归一,然后实部在后面(这个和数学习惯不一样)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值