我见过很多关于欧拉角和四元数之间转换的问题,但我从未找到任何可行的解决方案。也许你可以帮助我为什么这没有返回正确的值。我需要四元数(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) 在我们的软件中,我们有一个基于鼠标移动的摄像头,其核心是四分之一.
我们想要从这个位置发射射弹,我们可以做,但是我们想用相机来瞄准.射弹采用一个矢量,它将在每个游戏帧中添加到它的位置.
我们如何从给定的相机/四元数中获取这样的矢量?
我有一个四元数的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个向量的函数)或者我是否必须编写一些代码来为每个时间步进行转换?提前致谢.
我一直在尝试使用在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) 我试图使用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.
我试图将我采样的一组矢量旋转到三角形的法线
如果这是正确的,随机抽样的半球将与三角形对齐.
目前我在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) 我正在尝试使用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) 我正在尝试使用关于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度转弯加上指定的角度.这一整天都让我不知所措.有人可以告诉我我做错了什么吗?
我正在使用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) 我刚开始使用四元数,并注意到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.这是预期的行为吗?如果是的话,背后的原因是什么?