Tag: 四元数

为什么四元数用于旋转?

我是一名物理学家,一直在学习一些编程知识,并且遇到了很多使用四元数旋转的人,而不是用matrix/vectorforms写东西。 在物理学中,我们没有使用四元数有很好的理由(尽pipe偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但是在某些技术方面远远超出了正常介绍类的教导,所以我不会详细讨论)。 事实certificate,四元数不具有这种好的行为,所以它们没有用,vector/matrix做,所以我们使用它们。 然而,受限于不使用任何分析结构的刚性旋转和描述,三维旋转可以用任何方式(或其他几种方式)等效描述。 通常,我们只需要一个点X =(x,y,z)到一个新的点X'=(x',y',z')的映射,受X 2 = X'2的限制。 还有很多事情是这样做的。 天真的方法是画出三angular形,并使用三angular函数,或者使用点(x,y,z)和vector(x,y,z)之间的同构和函数f(X)= X'和(x,y,z) T (a,b,c)(x',y',…)的matrixMX = X',或者使用四元数,或者沿着新的vector投影出旧vector的分量。 z')等 从math的angular度来看,这些描述在这个环境中是等价的(作为一个定理)。 他们都有相同数量的自由度,相同数量的限制等等。 那么,为什么四元数似乎更偏向于vector? 我看到的常见原因是没有万向节锁或数字问题。 没有万向节锁的说法似乎很奇怪,因为这只是一个欧拉angular的问题。 这也只是一个坐标问题(就像极坐标中r = 0的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或者使用两个重叠的坐标系。 我对数字问题不太确定,因为我不清楚这些(以及其他方法)是如何实施的。 我已经读过,重新归一化四元数比旋转matrix更容易,但这只适用于一般matrix; 一个旋转具有额外的约束,这个约束(这是四元数定义内置的)(事实上,这是必须的,因为它们具有相同的自由度)。 那么,四元数使用vector或其他select的原因是什么?

围绕一个轴的四元数旋转的分量

我无法find有关此主题的任何良好信息。 基本上我想find一个四元数旋转的分量,即围绕一个给定的轴(不一定是X,Y或Z–任何任意单位向量)。 有点像将四元数映射到vector上。 所以如果我要求绕与四元数轴平行的轴旋转,我会得到相同的四元数。 如果我要求围绕与四元数轴正交的轴旋转,我会得到一个身份四元数。 而在…之间……好吧,这就是我想知道如何解决的:)

随着时间的推移旋转游戏对象

我在这里一个新的,我尝试开始使用Unity引擎。 有人可以解释我,Quaternion.Sleep怎么工作? 因为我想旋转90,180和270不同angular度的一些对象。我的代码你可以看到下面。 不幸的是,当我添加180度的时候,物体做出了疯狂的事情,并且把这个游戏对象的旋转angular度设置为(0,180,180)。 我想得到(180,0,0) public float speed = 0.1F; private float rotation_x; void Update() { if (Input.GetButtonDown("Fire1")) { rotation_x = transform.rotation.eulerAngles.x; rotation_x += 180; } transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(rotation_x, transform.eulerAngles.y, transform.eulerAngles.z), Time.time * speed); }

寻找代表从一个向量到另一个向量的旋转的四元数

我有两个向量u和v有没有find一个四元数表示从u到v的旋转?

旋转一组vector

我正在试图将我采样的一组向量旋转到三angular形的法线上 如果这是正确的,随机抽样的半球将与三angular形alignment。 目前我在Z轴上生成它,并试图将所有样本旋转到三angular形的法线。 但它似乎是“刚刚closures” 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; } 我从这个页面底部拉出来的: http : //lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors […]