- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在刚体上跟踪 3 个点 (3D, x y z),我用它来定义局部坐标系。我正在使用这个局部坐标系的方向(在全局引用系中)来设置 VR 程序中的 View 方向。为此,并避免万向节锁定欧拉角,我尝试使用四元数来设置 View 方向。
我从这 3 个点创建一个旋转矩阵,然后我使用 Wikipedia 中描述的方法提取假定的等效四元数。然后,我只需将 View 方向设置为计算出的四元数。
但是,我观察到主要只有 1 个自由度(俯仰),而我也应该能够同时看到偏航和滚转的变化。我已经从旋转矩阵中提取了欧拉角,除了万向节锁外,它工作得很好。所以我确定旋转矩阵是可用的,尽管在我的情况下它是不合适的。
我的问题是为什么假定的等效四元数似乎只改变“音高”自由度?
我知道四元数是绕 1 个轴的旋转,但我认为如果它是从旋转矩阵导出的,最终结果是否与设置欧拉角相同?
这是我在 python 中的代码:
import viz
import numpy as np
vec1 = np.array([-0.96803,-0.25022,0.01751],dtype=float)
vec3 = np.array([-0.024815,0.96553,0.07863],dtype=float)
vec4 = np.array([-0.03655,0.07178,-0.99675],dtype=float)
#normalize to unit length
vec1 = vec1 / np.linalg.norm(vec1)
vec3 = vec3 / np.linalg.norm(vec3)
vec4 = vec4 / np.linalg.norm(vec4)
M1 = np.zeros((3,3),dtype=float) #rotation matrix
#rotation matrix setup
M1[:,0] = vec1
M1[:,1] = vec3
M1[:,2] = vec4
#get the real part of the quaternion first
r = np.math.sqrt(float(1)+M1[0,0]+M1[1,1]+M1[2,2])*0.5
i = (M1[2,1]-M1[1,2])/(4*r)
j = (M1[0,2]-M1[2,0])/(4*r)
k = (M1[1,0]-M1[0,1])/(4*r)
viz.MainView.setQuat(i,j,k,r)
任何帮助或想法都会很棒!
最佳答案
这里的关键问题是,您将仅适用于正确的 3x3 旋转矩阵的算法应用到非正交且非常接近错误旋转矩阵的矩阵。后者是您问题的关键根源。
你的矩阵M1是
array([[-0.9994477 , -0.02887993, 0.0164005 ],
[-0.02958325, 0.99862763, -0.04323132],
[ 0.01513678, 0.0436899 , 0.99893047]])
如果您不正确地将用于从适当的旋转矩阵中提取四元数的算法应用到这个不适当的矩阵,您就会变得一派胡言。特别地,因为 M[2,1]
约等于 -M[1,2]
,所以 M[0,2]
是约等于M[2,0]
,而M[1,0]
约等于M[0,1]
,你会得到看起来几乎是纯卷的东西。
请注意:这同样适用于从矩阵中提取欧拉角的算法。这些算法都假设矩阵是一个适当的旋转矩阵。当您将它们不正确地应用于不正确的旋转矩阵时,您会变得胡说八道。
关于python - 旋转矩阵到四元数等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32208838/
是: x -= y; 相当于: x = x - y; 最佳答案 不,它们并不等同于您表达它们的方式。 short x = 0, y = 0; x -= y; // This compiles f
这个问题在这里已经有了答案: What is the rationale for all comparisons returning false for IEEE754 NaN values? (1
我在哪里可以找到与 Python maketrans 和 translate 等效的 C# 代码?谢谢! 最佳答案 这应该带你到那里的大部分方式: public class MakeTrans {
我正在 SwiftUI 中构建一个应用程序其中包含很多组件,包括 Text包含长字符串的 View 。 当我在 iPhone 11 上启动该应用程序时,一切正常,但当我在较小的设备(例如 iPhone
这个问题已经有答案了: What is the equivalent lambda expression for System.out::println (2 个回答) Function pointe
我最近在使用 postgres,我必须做一些计算。然而我一直没能模仿Excel的HOUR()函数,我看了official information但这对我帮助不大。 函数接收一个小数,并得到小数的时、分
如果在 cython 中定义了一个指针 vector ,那么与 python 中的 enumerate 类似的函数或过程是什么,用于遍历指针数组中元素的索引和值在 C 声明类型函数内的循环中? 测试.
要选择: select user_id, max(case when value > 0 then timestamp else 0 end) as max_timestamp_whe
如果没有例子,这个问题很难问,所以这里是: #include struct O { }; struct C { template void function1(void (C::*call
我得到了这个结构的实现: struct NodoQ { Etype elem; NodoQ *sig; }; 下面是这段代码吗, typedef NodoQ *PtrNodoQ; PtrNod
我有一些宏需要访问当前类的类型,目前我通过违反 DRY 的模式解决了这个问题: struct ThisScruct{ int a; double b; //example st
我想知道 TensorFlow 的 softmax_cross_entropy_with_logits 是否有等效的 PyTorch 损失函数? 最佳答案 is there an equivalent
我找到了一个 trie 的 java 实现,并希望在 J2ME 中有一个类似的实现。这是代码。 节点类 import java.util.Collections; import java.util.L
我刚刚学习了 GraphQL,我想找到用户 id=2 OR 用户 id=3 现在我将如何进行 GraphQL 查询,我正在使用以下查询获取整个集合 { users() {
假设我有两个 Web 服务:A 和 B。两者都在 Apache 上运行。我希望它们可以从我的主机的不同端口访问:A 来自端口 88,B 来自端口 89。 我可以手动完成(首先创建图像,然后使用“doc
我一直在 excel 中使用一个非常简单的数组公式来处理一些数据集,但是它们变得太大并且在我更新计算时完全破坏了我的计算机性能。 excel表格和MySQL数据库布局如下: +-Timestamp-+
我有一个类,其实例要通过不同于它们携带的数据值的标识来区分。在我的代码中,我打算使用 == 来表示两个实例在它们的数据方面是等价的,并且 is 表示两个变量引用同一个实例,也就是说,他们是相同的。根据
我正在 Windows 中使用 WinSock 2.0 开发代理服务器。如果我想在阻塞模型中开发它,select() 是等待客户端或远程服务器从中接收数据的方法。是否有任何适用的方法可以使用 I/O
我正在将我制作的 Android 应用移植到 iOS。 Android 有一个 Yield() 函数可以将线程从运行中移到线程队列的后面(?)。这很有用,这样该线程就不会占用过多的 CPU 并使其他一
这是否保证始终为真: std::numeric_limits::max() == INT_MAX C++ 标准对此有何规定?我在标准中找不到任何明确说明这一点的引用资料,但我一直在阅读这些内容应该是等
我是一名优秀的程序员,十分优秀!