标签: quaternions

LWJGL - 使用四元数和平移矩阵在6DOF相机中实现'roll'的问题

我已经花了几个星期来解决这个问题,似乎找不到合适的解决方案,需要一些建议.

我正在使用LWJGL/Java创建一个Camera类,并使用Quaternions来处理轴承(偏航),俯仰和滚转.我希望这款相机可以处理3D空间中的所有6度移动,并且可以滚动.轴承,俯仰和滚动都是四元数.我将它们乘以"变化"四元数,并从中创建一个平移矩阵.我把它放在一个浮动缓冲区中,并将模型视图矩阵乘以包含旋转矩阵的缓冲区.

我可以让轴承和俯仰旋转正常工作,但是当我实施滚动时,我遇到了问题.主要是围绕Z轴旋转(滚动)似乎不起作用.当我"滚动"相机时,它似乎绕全局Z轴而不是本地相机方向轴滚动.我通常可以让3个中的2个工作,这取决于我乘以四元数的顺序,但我不能让它们一起工作.

因为它们都是独立工作的,所以我假设我的方向方法有问题,我将它们组合起来并构建一个旋转矩阵.我在整个课程中遇到了问题,所以这里有与轮换相关的方法和声明:

private final static float DEGTORAD = (float)(Math.PI/180);    

//Eye - position of the camera in the 3D world.
private Vector3f eye;

//Camera axis vectors, calculated each time reorient() is called.
//Initialized to global x, y, and z axis initially.
private Vector3f up;
private Vector3f right;
private Vector3f direction;

//Angles of rotation (in degrees)    
private float pitchAngle;
private float bearingAngle;
private float rollAngle;

private Quaternion pitch;
private Quaternion bearing;
private Quaternion roll;

private FloatBuffer viewMatrixBuffer = BufferUtils.createFloatBuffer(16);
private …
Run Code Online (Sandbox Code Playgroud)

java lwjgl quaternions matrix-multiplication rotational-matrices

5
推荐指数
1
解决办法
1447
查看次数

基于鼠标移动的旋转四元数(OpenGL和Java)

我正在使用OpenGL编写一个Java游戏(LWJGL绑定,具体而言).每个实体(包括相机)都有一个四元数,表示它的旋转.我已经想出如何将四元数应用于当前的OpenGL矩阵,一切都旋转得很好.我遇到的问题是让相机随鼠标旋转.

现在,每一帧,游戏都会抓取鼠标在一个轴上移动的数量,然后将该数量应用到四元数以便相机旋转.这是旋转四元数的代码,我会发布它,因为我认为这就是问题所在(尽管我对这类东西总是错的):

    public void rotateX(float amount){
        Quaternion rot = new Quaternion(1.0f, 0.0f, 0.0f, (float)Math.toRadians(amount));
        Quaternion.mul(rot, rotation, rotation);
        rotation.normalise();
    }
Run Code Online (Sandbox Code Playgroud)

该方法应该围绕X轴旋转四元数.'rotation'是表示实体旋转的四元数.'amount'是我想要旋转四元数的量(也就是鼠标移动的量).'rot'是沿X轴的标准化矢量,其中aw值转换为弧度(我猜这里的目标是给它一个角度 - 比方说,10度 - 让它沿着给定的轴旋转四元数角度).使用Quaternion.mul获取新的四元数,将其乘以旋转四元数,然后将结果存储为旋转四元数.我不知道是否有必要进行归一化,因为'rot'是正常的,'rotation'应该已经归一化.

rotateY和rotateZ方法执行相同的操作,除了更改'rot'的向量(y为0.0,1.0,0.0,z为0.0,0.0,1.0).

当游戏开始并且相机向下看负Z轴时,代码似乎工作正常.您可以在Y轴上一直旋转一直围绕X轴旋转.但是一旦你试图旋转相机而不是俯视Z轴,一切都变得非常棘手(我甚至无法描述它,它旋转非常奇怪).

我的最终目标是在没有向上矢量的空间中控制船只.因此,当您在Y轴上移动鼠标时,无论船舶处于什么角度,它都会改变船的俯仰角(沿X轴旋转).类似地,当您在X轴上移动鼠标时,它会改变偏航(沿Y轴旋转).我可能会以错误的方式解决这个问题,我可能只需要向正确的方向推(或推).

如果你需要更多关于任何事情的细节(我的渲染是如何完成的,我正在尝试做的任何其他数学)只是问,我会把它提出来.当我使用欧拉角时,我明白了一切(显然这对于​​3D应用程序开发来说是一个很大的禁忌...希望有人会告诉我,在我沉没了大量时间让他们去工作之前)但是我一见到切换到四元,我得到了我的头真的快.过去几个月我一直在玩这个代码并阅读四元数试图让它工作,但我还没有真正得到任何东西:'(

非常,非常令人沮丧...开始后悔尝试在3D> _ <做一些事情

java opengl lwjgl quaternions

5
推荐指数
1
解决办法
4198
查看次数

如何将连接关节的位置转换为相对三角形旋转

我目前正在实现一个C++解决方案来跟踪多个对象的运动.因为我在帧序列中跟踪了这些对象的点,使得每帧中有多个点.结果,我有整个帧序列的那些点的x,y,z坐标.通过研究已经生成的模型,我理解它包括相对于彼此移动的关节系统.每个关节都有一个父母,他们的动作是以四元数格式相对于父母的.因此,我想将相对于同一原点在3D空间中的x,y,z坐标转换为相对于其父级写入的四元数格式.然后我可以使用四元数来动画它们.

我不明白如何计算它所需的角度.能否请您提供示例代码(用c ++)或任何有用的资源来解决这个问题.

c++ quaternions

5
推荐指数
1
解决办法
1810
查看次数

是否有一个包含所有标准操作的四元数和矩阵的库?

是否有一个java库可以处理所有标准操作的四元数和矩阵(四元数矩阵乘法)?

(我之前搜索谷歌和这里 - 但没有找到任何适当的解决方案)

java jar quaternions

5
推荐指数
1
解决办法
1954
查看次数

Yaw,Pitch和Roll分别与Heading,Pitch和Bank相同吗?

我有两个不同的系统(引擎A,引擎B).引擎A(动力跟踪软件)生成(Yaw,Pitch,Roll)和引擎B(Cinema 4D)期望(Heading,Pitch,Bank).

我的研究结果表明,这两个系统之间没有区别.

Yaw     Pitch   Roll
Heading Pitch   Bank
Y       X       Z
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,当我导入值时,我得到了不匹配.

我的输入值如下.

Frame, Yaw, Pitch, Roll 

0,  179.98199463, 5.58994007, 20.91039276

1,  -0.02482126, 0.21532322, -0.06678514

2,  -0.03007862, 0.24067645, -0.12998220
Run Code Online (Sandbox Code Playgroud)

但是当我导入值时,我得到了奇怪的数字:

Frame, Heading, Pitch, Bank

0, 119.383, -16.126, 72.529

1, -1.422, 12.337, -3.827

2, -1.723, 13.79, -7.447
Run Code Online (Sandbox Code Playgroud)

如果您能给我一个提示,或者如果这些系统之间存在差异,那么您可以为我提供正确的计算.

rotation quaternions cinema-4d

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

从Android陀螺仪获取四元数?

官方开发文档提出了以下从3D旋转速率向量获取四元数的方法(wx, wy, wz).

// Create a constant to convert nanoseconds to seconds.
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;

public void onSensorChanged(SensorEvent event) {
  // This timestep's delta rotation to be multiplied by the current rotation
  // after computing it from the gyro sample data.
  if (timestamp != 0) {
    final float dT = (event.timestamp - timestamp) * NS2S;
    // Axis of the rotation sample, …
Run Code Online (Sandbox Code Playgroud)

android quaternions gyroscope

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

将Eigen中的多个变换组合成一个变换矩阵

我在Eigen中有几个转换,以translate(Eigen::Vector3f)和rotations(Eigen::Quaternionf)的形式.我想按照我选择的顺序将所有这些变换组合成一个4x4变换矩阵Eigen::Matrix4f.

例如,我想按照A,B,C,D,E的顺序应用以下转换:

Eigen::Vector3f translation_A;
Eigen::Quaternionf rotation_B;
Eigen::Quaternionf rotation_C;
Eigen::Quaternionf rotation_D;
Eigen::Vector3f translation_E;
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最简单方法是什么?到目前为止,我已将它们单独应用于我的最终数据,如下所示:

pcl::transformPointCloud(*cloud_in, *cloud_out, translation_A, IDENTITY_QUATERNION);
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_B);
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_C);
pcl::transformPointCloud(*cloud_out, *cloud_out, ZERO_TRANSLATION, rotation_D);
pcl::transformPointCloud(*cloud_out, *cloud_out, translation_E, IDENTITY_QUATERNION);
Run Code Online (Sandbox Code Playgroud)

...但是必须有一种简单的(内置?)方法,将这些使用Eigen的变换组合成最终的4x4变换矩阵.

c++ transformation quaternions affinetransform eigen

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

四元数平滑旋转

四元数不仅可以描述旋转,还可以描述方向,即从初始(零)位置旋转.

我希望模拟从一个方向到另一个方向的平滑旋转.余计算开始定向startOrientation和结束定向endOrientation,并希望描述中间取向为startOrientation*(1-argument) + endOrientation*argument同时argument从变化01.

猴子引擎更新功能的代码如下:

@Override
    public void simpleUpdate(float tpf) {

        if( endOrientation != null ) {

            if( !started ) {
                started = true;
            }
            else {

                fraction += tpf * speed;
                argument = (float) ((1 - Math.cos(fraction * Math.PI)) / 2);

                orientation = startOrientation.mult(1-argument).add(endOrientation.mult(argument));
                //orientation = startOrientation.mult(1-fraction).add(endOrientation.mult(fraction));
                log.debug("tpf = {}, fraction = {}, argument = {}", tpf, fraction, argument);
                //log.debug("orientation = {}", orientation);

                rootNode.setLocalRotation(orientation);

                if( fraction >= …
Run Code Online (Sandbox Code Playgroud)

java 3d rotation quaternions jmonkeyengine

5
推荐指数
1
解决办法
1134
查看次数

OpenGL中的3轴四元数旋转

我正在尝试创建一个OpenGL程序,其中鸟的模型应该遵循Seiffert的球形螺旋所描述的球体表面的定义路径.但是,我一直坚持让旋转正确一段时间.

作为第一步,我让鸟只跟随xz平面中的圆形路径:

// 1. Circle in x-z plane
float phi =  TWO_PI * t; // t = [0..1]

float x = boundingSphereRadius * cos(phi);
float y = 0.0f;
float z = boundingSphereRadius * sin(phi);

float rotationAngle = glm::orientedAngle(glm::vec3(0.0f, 0.0f, 1.0f),    
                                         glm::normalize(glm::vec3(x, 0, z)),
                                         glm::vec3(0.0f, 1.0f, 0.0f)) - HALF_PI;
glm::fquat rotation = glm::angleAxis(rotationAngle, glm::vec3(0.0f, 1.0f, 0.0f));
Run Code Online (Sandbox Code Playgroud)

固定-HALF_PI是必要的,以便鸟正确对齐.这非常好,同样我可以在xy和yz平面上实现圆形旋转.

当我尝试累积所有不同的旋转时会出现问题.我想要遵循的路径如下所示:

在此输入图像描述 在此输入图像描述

作为要求,鸟的腹部应该始终面向球体的表面,鸟应该向前飞行.

我目前的方法看起来像这样,它只包含三个方向四元数:

glm::fquat rotationX  = glm::angleAxis(glm::orientedAngle(glm::normalize(glm::vec3(0.0f, 0.0f, 1.0f)), glm::normalize(glm::vec3(x, 0, z)), glm::vec3(0.0f, 1.0f, 0.0f)) - HALF_PI, glm::vec3(0.0f, 1.0f, 0.0f));
glm::fquat rotationY1 …
Run Code Online (Sandbox Code Playgroud)

c++ opengl geometry rotation quaternions

5
推荐指数
1
解决办法
828
查看次数

如何抵消要在局部轴上应用的全局方向力?

我想对物体的局部轴施加向前力,但我使用的引擎只允许我在全局轴上施加力.

我可以作为四元数访问对象的全局旋转.然而,我不熟悉使用quats(通常未经过高级数学训练).是否有足够的信息来抵消沿所需轴施加的力?怎么样?

例如,为了全球化,我会这样做:

this.entity.rigidbody.applyForce(0, 0, 5);
Run Code Online (Sandbox Code Playgroud)

但为了保持沿物体的局部轴施加力,我需要根据物体的旋转量子以轴的不同方式分配施加的力,例如:

w:0.5785385966300964
x:0
y:-0.815654993057251
z:0
Run Code Online (Sandbox Code Playgroud)

我已经研究了四元数试图解决这个问题,但观看一个关于它们是什么以及为什么它们被使用的视频并没有帮助我弄清楚如何与它们实际合作甚至开始弄清楚如何应用所需的偏移量这里.

到目前为止我尝试过的是对如何做到这一点的猜测,但这是错误的:

Math.degrees = function(radians) {
    return radians * 180 / Math.PI;
};

//converted this from a python func on wikipedia, 
//not sure if it's working properly or not
function convertQuatToEuler(w, x, y, z){ 
    ysqr = y * y;
    t0 = 2 * (w * x + y * z);
    t1 = 1 - 2 * (x * x + ysqr);
    X = Math.degrees(Math.atan2(t0, t1));
    t2 = 2 * …
Run Code Online (Sandbox Code Playgroud)

javascript algorithm quaternions

5
推荐指数
1
解决办法
217
查看次数