标签: quaternions

C# 如何将四元数转换为欧拉角 (XYZ)

我见过很多关于欧拉角和四元数之间转换的问题,但我从未找到任何可行的解决方案。也许你可以帮助我为什么这没有返回正确的值。我需要四元数(XYZ)到欧拉角之间的转换,这是我当前使用的代码:

        public static Vector3 Q2E(Quaternion q) // Returns the XYZ in ZXY
        {
            Vector3 angles;

            angles.X = (float)Math.Atan2(2 * (q.W * q.X + q.Y * q.Z), 1 - 2 * (q.X * q.X + q.Y * q.Y));
            if (Math.Abs(2 * (q.W * q.Y - q.Z * q.X)) >= 1) angles.Y = (float)Math.CopySign(Math.PI / 2, 2 * (q.W * q.Y - q.Z * q.X));
            else angles.Y = (float)Math.Asin(2 * (q.W * q.Y - q.Z * q.X));
            angles.Z = (float)Math.Atan2(2 * (q.W …
Run Code Online (Sandbox Code Playgroud)

c# math quaternions euler-angles

4
推荐指数
1
解决办法
6420
查看次数

四元数相机和抛射物矢量

在我们的软件中,我们有一个基于鼠标移动的摄像头,其核心是四分之一.

我们想要从这个位置发射射弹,我们可以做,但是我们想用相机来瞄准.射弹采用一个矢量,它将在每个游戏帧中添加到它的位置.

我们如何从给定的相机/四元数中获取这样的矢量?

c++ math vector rotation quaternions

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

在Matlab中从四元数中获取欧拉角

我有一个四元数的X,Y,Z和W分量随着时间的推移,在4个分离的向量中.

  QW             1x346             2768  double       
  QX             1x346             2768  double
  QY             1x346             2768  double
  QZ             1x346             2768  double              
Run Code Online (Sandbox Code Playgroud)

我想转换为欧拉角,以便在三个不同的子图中绘制3个欧拉组件,因此我需要有3个这样的矢量.

  heading(t)          1x346 
  attitude(t)         1x346 
  bank(t)             1x346 
Run Code Online (Sandbox Code Playgroud)

在matlab中是否有一种中间方式来获取它(我的意思是输入我的4个向量并输出上面3个向量的函数)或者我是否必须编写一些代码来为每个时间步进行转换?提前致谢.

matlab quaternions euler-angles

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

使用四元数的OpenGL立方体旋转

我一直在尝试使用在SDL全屏窗口中运行的OpenGL来旋转立方体.我成功地完成了这项工作glRotatef(),但是我经历了"万向节锁定"以及与欧拉角相关的其他问题.想要改进我的程序,我研究了四元数.我编写了一个四元数类,下面上的指示该页面,并试图用它来转动我的隔间glMultMatrixf(),但与不是90度的多角度各地超过1轴旋转时,立方体被扭曲.我检查了我的四元数到矩阵转换和我的四元数乘法代码,但我找不到任何错误.

这是问题的照片: 在此输入图像描述

这是显示这些立方体的完整程序(需要SDL和OpenGL)

//==============================================================================
#include <cmath>

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

namespace game_lib
{
    struct vec3
    {
        vec3() : x(0), y(0), z(0) { }
        vec3(float x, float y, float z) : x(x), y(y), z(z) { }

        vec3 normalize();
        inline float lenSqr() { return x*x + y*y + z*z; }
        float len();

        inline vec3 operator+(vec3 v) { v.x += x; v.y += y; v.z += z; return v; }
        inline vec3 operator-(vec3 v) { …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rotation quaternions sdl-opengl

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

使用Eigen插值旋转(slerp)

我试图使用Eigen在2个四元数之间进行调整(认为这是最简单的).

我发现了两个不同的例子

一,

for(int i = 0; i < list.size(); i++)
{
  Matrix3f m;
  Quaternion<float,0> q1 = m.toRotationMatrix();

  Quaternion<float,0> q3(q1.slerp(1,q2));
  m_node->Rotation(q3.toRotationMatrix());
}
Run Code Online (Sandbox Code Playgroud)

第二,

Vec3 slerp(const Vec3& a, const Vec3& b, const Real& t)
{
 Quaternionf qa;
 Quaternionf qb;
 qa = Quaternionf::Identity();
 qb.setFromTwoVectors(a,b); 
  return (qa.slerp(t,qb)) * a; 
 }
Run Code Online (Sandbox Code Playgroud)

我真的不能说哪一个是正确的.关于此的文档并不多.任何人都可以告诉我是否应该使用不同的库?或者我如何使用eigen进行slerp.

c++ opengl quaternions eigen

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

旋转一组矢量

我试图将我采样的一组矢量旋转到三角形的法线

如果这是正确的,随机抽样的半球将与三角形对齐.

目前我在Z轴上生成它并尝试将所有样本旋转到三角形的法线.

但它似乎"刚刚关闭"

在此输入图像描述

glm::quat getQuat(glm::vec3 v1, glm::vec3 v2)
{

    glm::quat myQuat;
    float dot = glm::dot(v1, v2);
    if (dot != 1)
    {
        glm::vec3 aa = glm::normalize(glm::cross(v1, v2));
        float w = sqrt(glm::length(v1)*glm::length(v1) * glm::length(v2)*glm::length(v2)) + dot;
        myQuat.x = aa.x;
        myQuat.y = aa.y;
        myQuat.z = aa.z;
        myQuat.w = w;
    }
    return myQuat;
}
Run Code Online (Sandbox Code Playgroud)

我从本页底部提取的内容:http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

然后我 :

glm::vec3 zaxis = glm::normalize( glm::vec3(0, 0, 1) );  // hardcoded but test orginal axis
glm::vec3 n1 = glm::normalize( glm::cross((p2 - p1), (p3 - …
Run Code Online (Sandbox Code Playgroud)

opengl math quaternions

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

SCNQuaternion乘法

我正在尝试使用Swift在SceneKit中执行SCNQuaternion Multiplication.以下代码在F#(Xamarin iOS开发)中.我正在尝试将该代码转换为Swift.

我陷入困境:让dqm = SCNQuaternion.Multiply ... SceneKit没有名为multiply的成员.

知道我怎么能这样做吗?

    let rr = CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical
    this.motion.DeviceMotionUpdateInterval <- float (1.0f / 30.0f)
    this.motion.StartDeviceMotionUpdates (rr,NSOperationQueue.CurrentQueue, (fun d e ->
        let a = this.motion.DeviceMotion.Attitude
        let q = a.Quaternion
        let dq = new SCNQuaternion(float32 q.x, float32 q.y, float32 q.z, float32 q.w)
        let dqm = SCNQuaternion.Multiply (dq, SCNQuaternion.FromAxisAngle(SCNVector3.UnitZ, piover2))
        camNode.Orientation <- dqm
        ()
    ))
Run Code Online (Sandbox Code Playgroud)

f# quaternions ios scenekit swift

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

四元数到旋转矩阵,使用特征库的值不正确

我正在尝试使用关于Y轴的四元数将对象旋转45度.指定四元数后我试图获得旋转矩阵.但我看到的价值不正确

Eigen::Quaterniond q;
q.x() = 0;
q.y() = 1;
q.z() = 0;
q.w() = PI/8;    // Half of the rotation angle must be specified, even IDK why

Eigen::Matrix3d R = q.normalized().toRotationMatrix();
std::cout << "R=" << std::endl << R << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

R=
-0.732    -0   -0.680
     0     1       -0
 0.680     0   -0.732
Run Code Online (Sandbox Code Playgroud)


由于沿Y轴的OpenGL旋转矩阵应该是:

在此输入图像描述

因此我的预期输出应该是:

R=
 0.707     0    0.707
     0     1        0
-0.707     0    0.707
Run Code Online (Sandbox Code Playgroud)

不仅价值偏低一小部分,价值上的错误符号也会导致一些意外的轮换.由于负号,我的立方体正在进行180度转弯加上指定的角度.这一整天都让我不知所措.有人可以告诉我我做错了什么吗?

c++ opengl rotation matrix quaternions

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

如何使用平移手势使用四元数在SceneKit中旋转相机

我正在使用iOS SceneKit框架构建360视频查看器.

我想使用UIPanGestureRecognizer来控制相机的方向.

SCNNode有几个属性我们可以用来指定它们的旋转:( rotation旋转矩阵),orientation(四元数),eulerAngles(每个轴角度).

我读过的所有内容都说避免使用欧拉角来避免万向节锁定.

我想使用四元数有几个原因,我不会在这里讨论.

我无法让它正常工作.相机控制几乎就是我想要的地方,但有些不对劲.尽管我试图仅影响X和Y轴,但看起来好像相机正绕着Z轴旋转.

我相信这个问题与我的四元数乘法逻辑有关.多年来我没有做过与四元数相关的任何事情:(我的平移手势处理程序在这里:

func didPan(recognizer: UIPanGestureRecognizer)
{
    switch recognizer.state
    {
    case .Began:
        self.previousPanTranslation = .zero

    case .Changed:
        guard let previous = self.previousPanTranslation else
        {
            assertionFailure("Attempt to unwrap previous pan translation failed.")

            return
        }

        // Calculate how much translation occurred between this step and the previous step
        let translation = recognizer.translationInView(recognizer.view)
        let translationDelta = CGPoint(x: translation.x - previous.x, y: translation.y - previous.y)

        // Use …
Run Code Online (Sandbox Code Playgroud)

quaternions ios scenekit swift

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

glm :: quat为什么x,y,z,w组件的顺序是混合的

我刚开始使用四元数,并注意到glm :: quat元素的顺序是混合的.这就是我的意思.如果我像这样声明一个glm :: quat

glm::quat quat = glm::quat(1, 2, 3, 4);
Run Code Online (Sandbox Code Playgroud)

然后像这样打印x,y,z,w

std::cout << quat.x << " " << quat.y << " " << quat.z << " " << quat.w;
Run Code Online (Sandbox Code Playgroud)

它打印2 3 4 1.这是预期的行为吗?如果是的话,背后的原因是什么?

c++ quaternions glm-math

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

标签 统计

quaternions ×10

c++ ×5

opengl ×4

math ×3

rotation ×3

euler-angles ×2

ios ×2

scenekit ×2

swift ×2

c# ×1

eigen ×1

f# ×1

glm-math ×1

matlab ×1

matrix ×1

sdl-opengl ×1

vector ×1