标签: euler-angles

计算旋转以查看3D点?

我需要计算3D物体面向任意3D点的2个角度(偏航和俯仰).这些旋转被称为"欧拉"旋转,仅仅因为在第一次旋转之后(假设Z,基于下图),Y轴也随着物体旋转.

这是我正在使用的代码,但它没有完全正常工作.当在地平面(Y = 0)上时,物体正确旋转以面向该点,但是一旦我在Y中向上移动该点,旋转看起来就不正确.

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )
Run Code Online (Sandbox Code Playgroud)

你知道如何计算给定点的2个欧拉角吗?


下图显示了我旋转的方式.这些是我需要计算的角度.(唯一的区别是我按X,Y,Z顺序旋转物体而不是Z,Y,X)

pic http://i53.tinypic.com/33lo6jp.jpg

在此输入图像描述


这是我的系统.

  • 坐标系是x =向右,y =向下,z =向后
  • 一个对象默认为(0,0,1),面向后方
  • 旋转的顺序为X,Y,Z,其中X上的旋转是俯仰,Y是偏航,Z是滚动

我的系统

math 3d angle rotation euler-angles

12
推荐指数
2
解决办法
3万
查看次数

四元数 - >欧拉角 - >旋转矩阵故障(GLM)

我正在编写一个程序来加载包含场景描述的文件,然后使用OpenGL显示它.我正在使用GLM进行所有数学运算.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧拉角的形式对物体进行旋转,然后在绘制时将这些角度转换为旋转矩阵.

因此,我的加载过程采用四元数旋转,将它们转换为欧拉角以存储在我的对象类中,然后将这些欧拉角转换为旋转矩阵以进行绘制.我正在使用glm :: eulerAngles和glm :: eulerAngleYXZ函数来执行这两个操作.

但是,我的结果不正确.例如,如果我理解正确,四元数{0.500 -0.500 0.500 0.500}(即WXYZ)应该描述从+ Z轴到+ Y轴的箭头旋转.但是,当我运行程序时,我得到的箭头指向+ X轴.

我认为我对四元数的理解存在一些缺陷,但我可以跳过中间的欧拉角形式来得到我预期的结果.通过使用glm :: toMat4将四元数直接转换为旋转矩阵,我得到一个将我的+ Z箭头指向+ Y的旋转.

考虑到两种方法看起来既简单又正确,我无法协调这两种不同的输出.为了简化我的问题,为什么这两个看似等效的方法会产生不同的结果:

glm::quat q(.5, -.5, .5, .5);
glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f; // eulerAngleYXZ takes radians but eulerAngles returns degrees
glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);
// transform1 rotates a +Z arrow so that it points at +X

glm::quat q(.5, -.5, .5, .5);
glm::mat4 transform2 = glm::toMat4(q);
// transform2 rotates a +Z arrow so that it points at +Y
Run Code Online (Sandbox Code Playgroud)

c++ math quaternions euler-angles glm-math

12
推荐指数
2
解决办法
1万
查看次数

欧拉角与四元数 - 由内部存储和呈现给用户之间的张力引起的问题?

四元数可以说是在内部表示对象旋转的合适选择.它们简单有效地插入并明确表示单个方向.

但是,在用户界面中显示四元数通常是不合适的 - 欧拉角通常对用户来说更为熟悉,并且它们的值更直观和可预测.

欧拉角在代码级别上变得复杂 - 它们需要存储旋转顺序,并且使用该顺序和相关联的角度组成实际方向(无论是矩阵还是四元数)是麻烦的,至少可以说是麻烦的.

使用四元数表示最方便地执行可靠的插值 - 这是否意味着我们必须在Euler表示和四元数表示之间不断转换?这在绩效方面是否可行?

我们可以将方向存储为四元数并将它们转换为仅显示给用户吗?这可能是不可能的,因为对于任何给定的方向,只有一个四元数表示,但有许多欧拉表示.我们如何"选择"与最初定义该方向的Euler表示相对应的Euler表示?这似乎是一项不可能完成的任务 - 我们在转换为四元数时已经有效地丢失了信息.

我们可以存储为欧拉角,然后根据需要转换为四元数吗?这可能是不可扩展的 - 从欧拉角到四元数的转换,插值,然后再转换回来可能是相对昂贵的代码.

我们可以简单地存储两种表示并使用最适合任何给定情况的表示吗?在存储器方面的大量成本(想象具有大约60个骨骼的骨架的动画曲线)并保持这些值同步可能是昂贵的,或者至少是麻烦的.

有没有人看到,使用或者解决这个问题的任何聪明的解决方案?当然上面的三个选项不仅仅是一个吗?是否有任何其他的问题领域类似这样已经解决了吗?

3d user-interface animation quaternions euler-angles

11
推荐指数
1
解决办法
1万
查看次数

将euler转换为矩阵,将矩阵转换为euler

我正在尝试使用.NET/C#将使用欧拉角度描述的3D旋转转换为矩阵然后返回.我的约定是:

  • 左撇子系统(x右,y上,z前进)
  • 旋转顺序:绕y前进,绕x旋转,绕z倾斜
  • 使用左手规则(拇指指向+无穷大)旋转是正的

我的试用期是:

Euler到矩阵(为了简化,我删除了x,y,z平移部分)

Matrix3D matrix = new Matrix3D() {
    M11 =   cosH * cosB - sinH * sinP * sinB,
    M12 = - sinB * cosP,
    M13 =   sinH * cosB + cosH * sinP * sinB,
    M21 =   cosH * sinB + sinH * sinP * cosB,
    M22 =   cosB * cosP,
    M23 =   sinB * sinH - cosH * sinP * cosB,
    M31 = - sinH * cosP,
    M32 = - sinP,
    M33 = …
Run Code Online (Sandbox Code Playgroud)

c# math 3d matrix euler-angles

8
推荐指数
2
解决办法
2万
查看次数

使用OpenCV,C++和图像2D进行头部姿态估计 - 几何方法 - 滚动,偏航和俯仰

我试图根据2D图像找到人脸的三个角度 2D图像.

我正在使用OpenCV和HaarCascade来寻找面部,眼睛,鼻子和嘴巴.但我没有找到任何几何方法可以帮助我找到角度X,Y和Z(滚动,俯仰和偏航).

有人可以帮助我在c ++或java中显示一些有效的方法吗?

c++ opencv euler-angles geometric-arc

8
推荐指数
1
解决办法
3852
查看次数

向四元数添加euler角度

我想为现有的四元数添加一个euler角度.这是我得到的:

Quaternion oldTransform = transform.Rotation;

float YawRotation = mouseDiff.x *  RotationSpeed;
Quaternion YawRotationQuaternion = new Quaternion();
YawRotationQuaternion.CreateFromAxisAngle (0, 1, 0, YawRotation);

float PitchRotation = mouseDiff.y * RotationSpeed;
Quaternion PitchRotationQuaternion = new Quaternion();
PitchRotationQuaternion.CreateFromAxisAngle ( 1, 0, 0, PitchRotation);

Quaternion result = oldTransform * YawRotationQuaternion * PitchRotationQuaternion;
transform.Rotation = result;
Run Code Online (Sandbox Code Playgroud)

我想只有偏航和俯仰旋转.旧变换具有此属性.我添加的我的欧拉角也只是俯仰和偏航旋转.当我乘以它时会发生的事情是oldTransform描述的旋转引入了滚动旋转.

然后我试过:

Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;
Run Code Online (Sandbox Code Playgroud)

这不会引入滚动旋转.当oldTransform将偏航轴旋转到俯仰轴上时,此选项更加糟糕,因为它具有万向节锁定.

现在我能想象的是,从旧的变形获得旧的偏航和俯仰旋转,并修改偏航和俯仰轴,使它们不再是(0,1,0)和(1,0,0).这里的问题是,当我从四元数中提取欧拉角时,我也会得到万向节锁.

那么如何将特定轴的euler角度添加到四元数?

c# math quaternions euler-angles

8
推荐指数
1
解决办法
3033
查看次数

使用特征库从旋转矩阵滚动俯仰和偏航

我需要从旋转矩阵中提取滚动俯仰偏航角度,我想确保我所做的是正确的.

    Eigen::Matrix< simFloat, 3, 1> rpy = orientation.toRotationMatrix().eulerAngles(0,1,2);
    const double r = ((double)rpy(0));
    const double p = ((double)rpy(1));
    const double y = ((double)rpy(2));
Run Code Online (Sandbox Code Playgroud)

那是对的吗?因为我在这里阅读:http: //eigen.tuxfamily.org/dox/group__Geometry__Module.html#gad118fececd448d7485ffea4858775e5a

当我在描述的最后说明在哪个区间定义角度时,我有点困惑.

c++ matrix euler-angles eigen rotational-matrices

8
推荐指数
2
解决办法
2万
查看次数

当旋转超过90度时,Three.js setFromRotationMatrix奇怪的行为

我有每个旋转轴都有一个单独父对象的对象(1表示X旋转,1表示Y旋转,1表示Z旋转.它们也按顺序相互关联:X旋转对象是Y旋转对象的子节点.Y旋转对象是Z旋转对象的子节点.

我正在尝试创建一个允许用户一起旋转场景中所有对象的功能(它们都包含在一个Object3D中).当旋转Object3D时,程序必须找到所有对象相对于世界的绝对位置和旋转,以便程序可以为每个对象输出新值.

要做到这一点,我目前设置移动对象,使其在"场景旋转器"(Object3D)内的位置设置为相对于世界的绝对位置.现在,我试图使对象的旋转成为对象相对于世界的绝对旋转,以便在"场景旋转器"的旋转改变时它相应地改变.此外,当我尝试在子对象上运行一次时,setFromRotationMatrix方法无法正常工作,所以相反,我必须为每个父对象再次运行它,并相应地从它们获取每个单独的旋转

这是我目前拥有的代码,它应该获得对象相对于世界的绝对旋转:

var beforeRotForX = new THREE.Euler();
beforeRotForX.setFromRotationMatrix(objects[i].parent.matrixWorld, "ZYX");

var beforeRotForY = new THREE.Euler(); // Had to be a separate one for some reason...
beforeRotForY.setFromRotationMatrix(objects[i].parent.parent.matrixWorld, "ZYX");

var beforeRotForZ = new THREE.Euler(); // And apparently this one has to be separate too
beforeRotForZ.setFromRotationMatrix(objects[i].parent.parent.parent.matrixWorld, "ZYX");

// Absolute before rotation
objects[i].userData.sceneBeforeRotAbs = {
    x: beforeRotForX.x,
    y: beforeRotForY.y,
    z: beforeRotForZ.z
};
Run Code Online (Sandbox Code Playgroud)

然后,它必须将该绝对旋转应用于对象的相对旋转

objects[i].parent.rotation.x = objects[i].userData.sceneBeforeRotAbs.x;
objects[i].parent.parent.rotation.y = objects[i].userData.sceneBeforeRotAbs.y;
objects[i].parent.parent.parent.rotation.z = objects[i].userData.sceneBeforeRotAbs.z;
Run Code Online (Sandbox Code Playgroud)

当第二个父级的Y旋转在-90到90之间时,这一切都正常

// Results of absolute world rotation when the Y-rotation of …
Run Code Online (Sandbox Code Playgroud)

javascript parents euler-angles degrees three.js

8
推荐指数
1
解决办法
832
查看次数

如何使用 OpenCV 理解 Python 中的头部姿势估计角度?

我正在完成此处找到的 Python 和 OpenCV 头部姿势估计教程:

https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/

我能够准确地将 3D 点投影到 2D 图像上。但是,我无法理解我使用计算的欧拉角(偏航、俯仰、滚转)的实际含义cv2.decomposeProjectionMatrix

我需要知道这些值是否对应于 (yaw, pitch, roll) 或 (roll, pitch, yaw) 等。此外,我需要了解所使用的轴方向,以便我知道旋转度数在哪里从测量。

输出图像https : //www.learnopencv.com/wp-content/uploads/2016/09/head-pose-example-1024x576.jpg

输出角度[[-179.30011146], [ 53.77756583], [-176.6277211 ]]

这是我的代码

# --- Imports ---
import cv2
import numpy as np
# --- Main ---
if __name__ == "__main__":

    # Read Image
    im = cv2.imread("headPose.jpg");
    size = im.shape

    #2D image points. If you change the image, you need to change vector
    image_points = np.array([
                                (359, 391),     # …
Run Code Online (Sandbox Code Playgroud)

python opencv euler-angles pose-estimation

8
推荐指数
1
解决办法
3124
查看次数

两个3d矢量之间的欧拉角

你如何找到2个3D矢量之间的3个欧拉角?当我有一个Vector并且我想获得它的旋转时,通常可以使用此链接:计算旋转以查看3D点?

但是如何按照彼此计算它们呢?

math 3d geometry vector euler-angles

7
推荐指数
1
解决办法
3万
查看次数