你如何找到2个3D矢量之间的3个欧拉角?当我有一个Vector并且我想获得它的旋转时,通常可以使用此链接:计算旋转以查看3D点?
但是如何按照彼此计算它们呢?
我有一个旋转的球体,我有一个div附加的示例可以在这里查看:https://jsfiddle.net/ao5wdm04/
我计算x和y值并使用translate3d变换放置div ,这非常有效.
我的问题是如何能得到值的rotateX,rotateY和rotateZ或rotate3d转换,因此格"切线"球体表面.我知道立方体网格面向球体中心,所以我假设相对于相机的向外法线向量的旋转向量将包含我需要的值.但我不太清楚如何获得这些.
更新
通过使用欧拉角,我几乎达到了预期的效果,如下所示:https://jsfiddle.net/ao5wdm04/1/但旋转不够大.
我很震惊.我想将iPhone的CMAttitude信息转换为海拔高度(0到90度)和方位角(0到360度).我已经google了一下并且讨论了一些讨论它的线程,但没有一个线程得到肯定的答案,大多数讨论Quaternion和Euler角度的文章都是太多的数学物质进入我的大脑!
是否有一些开源材料可以轻松完成这项任务?或者有人编写代码来执行此转换?
编辑:首先,抱歉这么抽象!
方位角是指设备所指向的地球表面上的方向.像北= 0度,东北= 45度,东= 90度,南= 180度,依此类推.范围在0度到360度之间:

海拔高度是从地球平面到天空中物体的角度:

谢谢,
拉吉
iphone cocoa-touch quaternions euler-angles rotational-matrices
我试图改变deviceorientation沿左右轴和上下轴的两个事件之间的方向,这些轴通常被定义为电话x和y轴(https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained)
即瞬间之间t1和t2其中那些电话线从移动(x1, y1)到(x2, y2),它想获得(angle(x2-x1), angle(y1-y2)).
当设备处于纵向模式时(与横向模式相反),这些轴似乎对应于beta和gamma.然而,当手机处于垂直状态(底部朝向地面)时,该gamma值变得非常不稳定,并且从90度跳到-90度(在相同的情况下,alpha跳跃180度)您可以在手机上轻松看到
我想避免这种情况,并且还获得360范围内的值.这是我到目前为止:
// assuming portrait mode
var beta0, gamma0;
window.addEventListener('deviceorientation', function(orientation) {
if (typeof beta0 === 'undefined') {
beta0 = beta;
gamma0 = gamma;
}
console.log('user has moved to the left by', gamma - gamma0, ' and to the top by', beta - beta0);
});
Run Code Online (Sandbox Code Playgroud)
当设备大部分是水平的时候工作正常,而当它是垂直的时候根本不工作
首先,我根本不是数学专家。请容忍我的数学错误并在必要时纠正我,我很乐意学习。
我有一个立方体,它使用带有变换的 css 动画进行旋转:matrix3d(4x4)。我还可以手动旋转立方体,将用户操作转换为相同的矩阵3d 转换。
我想要的是当用户停止交互时带有 css 的旋转立方体,从用户离开的位置开始。这是我通过获取立方体的变换矩阵 3d 值并使用乘法动态设置 css 关键帧成功完成的事情。
然而,当用户开始与立方体交互时,立方体会跳转到其最后一个已知的手动旋转点并从那里继续,因为我无法弄清楚如何从 4x4 矩阵获取 X 和 Y 轴上的旋转。
我目前正在使用以下库Rematrix,它可以帮助我从手动旋转变为 css 旋转,如上所述。
我一直在研究有关欧拉的文章,以及如何从欧拉到矩阵,反之亦然,但正如我之前提到的,我认为这就是我缺乏数学知识阻碍我的地方。我似乎无法弄清楚。
作为参考,这里是我读过的一些文章,试图解决我的问题。
最后一个来源对我来说最有意义,但如果我是正确的,那么在这种情况下没有用,因为它是关于 2D 变换,而不是 3D。
我通过以下方式获取当前的matrix3d:
const style = getComputedStyle(this.element).transform
const matrix = Rematrix.parse(style)
Run Code Online (Sandbox Code Playgroud)
对于手动旋转,我使用基于用户鼠标位置(positionY、positionX)的矩阵乘法。
const r1 = Rematrix.rotateX(this.positionY)
const r2 = Rematrix.rotateY(this.positionX)
const transform = [r1, r2].reduce(Rematrix.multiply)
this.element.style[userPrefix.js + 'Transform'] = Rematrix.toString(transform)
Run Code Online (Sandbox Code Playgroud)
从手动旋转到 css 旋转,我使用以下函数:
const setCssAnimationKeyframes = (lastTransform, animationData) => {
const rotationIncrement = 90
let matrixes = [] …Run Code Online (Sandbox Code Playgroud) 我的问题看似微不足道,但我读到的内容越多-我越困惑……我已经开始了一个小项目,希望大致跟踪旋转物体的运动。(准确地说是篮球)我有一个3轴加速度计(低通滤波)和一个测量°/ s的3轴陀螺仪。我知道陀螺仪的问题,但由于测量仅需几秒钟,并且角度往往很大-我现在不在乎漂移和万向架。
我的陀螺仪给了我所有三个轴的旋转速度。由于我想对加速度进行两次积分以获取每个时间步的位置,因此我想将传感器的坐标系转换为接地系统。第一次尝试,我想使事情保持简单,因此我决定使用大型标准旋转矩阵。但是由于我的结果太糟糕了,我想知道这是否是正确的方法。如果我正确理解-矩阵只是将3个矩阵按一定顺序相乘。由于篮球旋转没有任何“自然”命令,所以这可能不是一个好主意。我的传感器一次测量3个角速度。如果我将它们“逐步”放入系统中,那将是不正确的,因为我的第二个矩阵会计算围绕“新y轴”的旋转,但是我的传感器实际上测量了围绕“旧y轴”的角速度。到目前为止,对吗?
那么如何正确计算3D旋转?我需要去季铵盐吗?但是如何从3个不同的轮换中得到一个?而且我在这里没有同样的问题吗?
我先从一个单位矩阵((1,0,0)(0,1,0)(0,0,1))乘以加速度矢量得出我的第一个动作。然后,我想使用“旋转矩阵”来找出下一个加速度的实际方向,因此我可以将加速度简单地相加。
但是现在我太困惑了,找不到合适的方法。
有什么建议么?顺便说一句 对不起,我的英语不好,我很累,(显然)不是母语人士;)
谢谢亚历克斯
我的基于运动和位置的 iOS 应用程序中有一些功能,它需要一个旋转矩阵作为输入。一些图形输出依赖于这个矩阵。随着设备的每一次移动,图形输出都会改变。这是代码的一部分,它使得:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get and process matrix data
}
Run Code Online (Sandbox Code Playgroud)
在此结构中,只有 4 个帧可用:
X任意Z垂直
XArbitraryCorrectedZVertical
XMagneticNorthZ垂直
XTrueNorthZ垂直
我需要另一个参考,fe 陀螺仪值而不是 North,而这些框架不能完全提供我想要的。
为了达到我的目标,我使用下一个结构:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get Euler angles and transform it to rotation matrix
}
Run Code Online (Sandbox Code Playgroud)
你可能会问我,为什么我不使用内置的旋转矩阵?答案很简单。我需要制作某种自己的参考系,我可以通过放入修改后的角度值来实现。
为了从欧拉角获得旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于 3D 情况,我们将为每个轴(其中 3 个)设置矩阵。之后我们乘以矩阵。问题是输出取决于乘法的顺序。X Y Z 不等于 Z Y X。维基百科告诉我,有 12 种变体,我不知道哪一种适合 iOS 实现。我需要知道我需要按什么顺序将它们相乘。另外,我需要知道哪些角度代表X、Y、Z。例如,X-roll,Y-pitch,Z-yaw。
实际上,Apple 多年前就解决了这个问题,但我无法访问 .m 文件,而且我不知道哪种乘法顺序适合 iOS 设备。
transformation objective-c euler-angles ios rotational-matrices
我正在开展一个涉及 Aruco 标记和 openCV 的项目。我的项目进展还很远。我可以读取旋转向量并使用 openCV 将它们转换为罗德里格斯矩阵rodrigues()。
这是我得到的罗德里格斯矩阵的示例:
[0,1,0;
1,0,0;
0,0,-1]
Run Code Online (Sandbox Code Playgroud)
我使用以下代码。
Mat m33(3, 3, CV_64F);
Mat measured_eulers(3, 1, CV_64F);
Rodrigues(rotationVectors, m33);
measured_eulers = rot2euler(m33);
Degree_euler = measured_eulers * 180 / CV_PI;
Run Code Online (Sandbox Code Playgroud)
我使用预定义的 rot2euler 将罗德里格斯矩阵转换为欧拉角。我将收到的弧度转换为度数。
rot2euler 如下所示。
Mat rot2euler(const Mat & rotationMatrix)
{
Mat euler(3, 1, CV_64F);
double m00 = rotationMatrix.at<double>(0, 0);
double m02 = rotationMatrix.at<double>(0, 2);
double m10 = rotationMatrix.at<double>(1, 0);
double m11 = rotationMatrix.at<double>(1, 1);
double m12 = rotationMatrix.at<double>(1, 2);
double m20 = rotationMatrix.at<double>(2, 0);
double …Run Code Online (Sandbox Code Playgroud) 我有包含位置(纬度、经度、高度)和方向(俯仰、滚动、航向)随时间变化的飞行数据。
我想在 CesiumJS 中代表飞机。
我试图从飞行数据创建 CZML 文件。一切都很适合这个职位。但是 CZML 格式仅支持基于地球固定轴参考中的四元数的方向。 这意味着我必须为每个位置、俯仰、滚动、航向预处理这个四元数,以便编写 CZML。
你认为我应该实现这个四元数计算(不是直接的)?
或者我应该使用另一种解决方案来使用允许我直接使用俯仰、滚转、航向值的铯函数吗?。在这种情况下,我想知道可以使用哪种格式将我的飞行数据传输到 Cesium。
谢谢你的建议
euler-angles ×10
quaternions ×3
rotation ×3
math ×2
matrix ×2
3d ×1
cesium ×1
cocoa-touch ×1
czml ×1
delphi ×1
geometry ×1
glscene ×1
gyroscope ×1
html5 ×1
ios ×1
iphone ×1
javascript ×1
mobile ×1
objective-c ×1
opencv ×1
opengl ×1
three.js ×1
vector ×1