首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >四元数和四元数的矩阵不能给出相同的结果

四元数和四元数的矩阵不能给出相同的结果
EN

Stack Overflow用户
提问于 2017-10-16 04:21:44
回答 2查看 1.5K关注 0票数 3

我正在把一个矩阵(M)转换成一个四元数,这样我就可以在两个不同的变换矩阵之间做一个平滑的动画,在其中我需要自己制作视频帧。

当我把四元数转换成矩阵作为测试时,这个新的矩阵与那个变成quat的矩阵是完全不同的。

代码语言:javascript
复制
import numpy as np
from transforms3d import quaternions

M = np.array([[  0.757403109,  -0.186744161,   145.541734],
 [ -0.154492906,   0.626185286,   100.878814],
 [ -0.000294826495,  -0.000344726091,   1.00000000]])


quat = quaternions.mat2quat(M)


testM = quaternions.quat2mat(quat)
print("TEST: M original")
print(M)
print("TEST: quat back to mat (testM)")
print(testM)
print("Why not the same")
print ("quat")
print(quat)
print("quat of testM")
print(quaternions.mat2quat(testM))

#Scaling gives same result, scale M to be -1. to 1
mmax = np.amax(M)
scaleTestM = M / mmax
print("M Scaled")
print(scaleTestM)
quatOfScaled = quaternions.mat2quat(scaleTestM)
print("Quat of scaled")
print(quaternions.quat2mat(quatOfScaled))

我是否错过了四元数实际上可以表示的东西,还是代码错了?如果这不能工作,其他关于如何在两个转换矩阵之间平稳地移动的建议将受到欢迎。

Python 3.6

控制台输出如下:

TEST: M original [[ 7.57403109e-01 -1.86744161e-01 1.45541734e+02] [ -1.54492906e-01 6.26185286e-01 1.00878814e+02] [ -2.94826495e-04 -3.44726091e-04 1.00000000e+00]] TEST: quat back to mat (testM) [[ 0.38627453 -0.42005089 0.8211877 ] [-0.54462197 0.61466344 0.57059247] [-0.74443193 -0.6676422 0.00865989]] Why not the same quat [ 0.70880143 -0.43673539 0.55220671 -0.04393723] quat of testM [ 0.70880143 -0.43673539 0.55220671 -0.04393723] M Scaled [[ 5.20402697e-03 -1.28309699e-03 1.00000000e+00] [ -1.06150244e-03 4.30244486e-03 6.93126372e-01] [ -2.02571789e-06 -2.36857210e-06 6.87088145e-03]] Quat of scaled [[ 0.38627453 -0.42005089 0.8211877 ] [-0.54462197 0.61466344 0.57059247] [-0.74443193 -0.6676422 0.00865989]]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-16 04:40:06

对于给定的四元数,有多个矩阵表示是正确的。当您将矩阵转换为四元数时,有关您最初使用的这些表示的信息将丢失。

参见https://en.wikipedia.org/wiki/Quaternion中的矩阵表示

票数 3
EN

Stack Overflow用户

发布于 2021-10-12 08:06:06

我也遇到了同样的问题,并对其进行了更深入的分析。

https://en.wikipedia.org/wiki/Quaternion的描述描述了48种可能的四元数矩阵表示。我试着从这些矩阵中构造旋转矩阵,并存储要使用的信息,但是它没有工作。原因是四元数矩阵表示与旋转变换矩阵无关。我花了一天时间才发现这个。

这一问题的相关部分在本章中。

三维和四维旋转群所有单位四元数的集合在乘法下形成一个3球S3和一个群(李群),双覆盖行列式1的实正交3×3矩阵的群SO(3,ℝ),因为两个单位四元数对应于上述对应关系下的每个旋转。看盘子的把戏。

因此,仅仅有一个规范化的变换矩阵是不够的,行列式必须是1。一旦满足这个条件,就可以创建一个旋转四元数,并将它转换回旋转变换矩阵。如果不满足该条件,则四元数将是未定义的,因此,当转换回矩阵时会产生不同的矩阵。

你可以利用矩阵中的两个向量的交叉积来构造这样一个矩阵,并利用结果的交叉积。

代码语言:javascript
复制
M = np.array([[0.757403109, -0.186744161, 145.541734],
              [-0.154492906, 0.626185286, 100.878814],
              [-0.000294826495, -0.000344726091, 1.00000000]])

quat = quaternions.mat2quat(M)

testM = quaternions.quat2mat(quat)
print("TEST: M original")
det = np.linalg.det(M)
print("M det:"+str(det))
print(M)
print("TEST: quat back to mat (testM)")
print(testM)
print("Why not the same")
print("quat")
print(quat)
print("quat of testM")
print(quaternions.mat2quat(testM))

# Scaling gives same result, scale M to be -1. to 1
mmax = np.amax(M)
scaleTestM = M / mmax
print("M Scaled")
det = np.linalg.det(scaleTestM)
print("M Scaled  det:"+str(det))
print(scaleTestM)
quatOfScaled = quaternions.mat2quat(scaleTestM)
print("Quat of scaled")
print(quaternions.quat2mat(quatOfScaled))

v1 = M[0]
v2 = M[1]
v3 = M[2]

v1 = v1 / np.linalg.norm(v1)
v2 = v2 / np.linalg.norm(v2)
v3 = v3 / np.linalg.norm(v3)

print(v1)
print(v2)
print(v3)

v33 = np.cross(v1, v2)
v33 = v33 / np.linalg.norm(v33)

v22 = np.cross(v1, v33)
v22 = v22 / np.linalg.norm(v22)
scaledOrthoM = np.array([v1, v22, v33])
print("M Scaled")
det = np.linalg.det(scaledOrthoM)
print("M Scaled det:"+str(det))
print(scaledOrthoM)

if det == -1:
    v33 = v33 * -1
    scaledOrthoM = np.array([v1, v22, v33])
    det = np.linalg.det(scaledOrthoM)
    print("M Scaled det:"+str(det))
quatOfScaledOrtho = quaternions.mat2quat(scaledOrthoM)
print("Quat of scaled")
print(quaternions.quat2mat(quatOfScaledOrtho))

控制台输出如下:

代码语言:javascript
复制
TEST: M original
M det:0.5119378064538171
[[ 7.57403109e-01 -1.86744161e-01  1.45541734e+02]
 [-1.54492906e-01  6.26185286e-01  1.00878814e+02]
 [-2.94826495e-04 -3.44726091e-04  1.00000000e+00]]
TEST: quat back to mat (testM)
[[ 0.38627453 -0.42005089  0.8211877 ]
 [-0.54462197  0.61466344  0.57059247]
 [-0.74443193 -0.6676422   0.00865989]]
Why not the same
quat
[ 0.70880143 -0.43673539  0.55220671 -0.04393723]
quat of testM
[ 0.70880143 -0.43673539  0.55220671 -0.04393723]
M Scaled
M Scaled  det:1.6605599862106246e-07
[[ 5.20402697e-03 -1.28309699e-03  1.00000000e+00]
 [-1.06150244e-03  4.30244486e-03  6.93126372e-01]
 [-2.02571789e-06 -2.36857210e-06  6.87088145e-03]]
Quat of scaled
[[ 0.38627453 -0.42005089  0.8211877 ]
 [-0.54462197  0.61466344  0.57059247]
 [-0.74443193 -0.6676422   0.00865989]]
[ 0.00520395 -0.00128308  0.99998564]
[-0.00153144  0.00620718  0.99997956]
[-2.94826465e-04 -3.44726056e-04  9.99999897e-01]
M Scaled
M Scaled det:-1.0
[[ 0.00520395 -0.00128308  0.99998564]
 [ 0.66862666 -0.74358506 -0.00443364]
 [-0.74358006 -0.66864013  0.00301168]]
M Scaled det:1.0
Quat of scaled
[[ 0.00520395 -0.00128308  0.99998564]
 [ 0.66862666 -0.74358506 -0.00443364]
 [ 0.74358006  0.66864013 -0.00301168]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46762898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档