繁体   English   中英

四元数旋转不起作用

[英]Quaternion rotation does not work

我想制作一个基于四元数的相机。 在互联网上我发现了这个: https : //www.gamedev.net/resources/_/technical/math-and-physics/a-simple-quaternion-based-camera-r1997

我从中获取了代码:

typedef struct { float w, x, y, z; } quaternion;

double length(quaternion quat)
{
  return sqrt(quat.x * quat.x + quat.y * quat.y +
              quat.z * quat.z + quat.w * quat.w);
}

quaternion normalize(quaternion quat)
{
  double L = length(quat);

  quat.x /= L;
  quat.y /= L;
  quat.z /= L;
  quat.w /= L;

  return quat;
}

quaternion conjugate(quaternion quat)
{
  quat.x = -quat.x;
  quat.y = -quat.y;
  quat.z = -quat.z;
  return quat;
}

quaternion mult(quaternion A, quaternion B)
{
  quaternion C;

  C.x = A.w*B.x + A.x*B.w + A.y*B.z - A.z*B.y;
  C.y = A.w*B.y - A.x*B.z + A.y*B.w + A.z*B.x;
  C.z = A.w*B.z + A.x*B.y - A.y*B.x + A.z*B.w;
  C.w = A.w*B.w - A.x*B.x - A.y*B.y - A.z*B.z;
  return C;
}

void RotateCamera(double Angle, double x, double y, double z)
{
  quaternion temp, quat_view, result;

  temp.x = x * sin(Angle/2);
  temp.y = y * sin(Angle/2);
  temp.z = z * sin(Angle/2);
  temp.w = cos(Angle/2);

  quat_view.x = View.x;
  quat_view.y = View.y;
  quat_view.z = View.z;
  quat_view.w = 0;

  result = mult(mult(temp, quat_view), conjugate(temp));
  View.x = result.x;
  View.y = result.y;
  View.z = result.z;
}

但是我在尝试实现这一行时遇到了问题:

gluLookAt(Position.x, Position.y, Position.z,
      View.x, View.y, View.z, Up.x, Up.y, Up.z).

因为我不知道使用什么作为“向上”,我尝试使用 0,0,0,但它只显示黑屏。 任何帮助是极大的赞赏 !

编辑 :

在这个网站的某个地方,我发现了类似的东西,可以将四元数转换为矩阵。 我如何使用glMultMatrixf();来使用这个矩阵glMultMatrixf();

float *quat_to_matrix(quaternion quat) {
    float matrix[16];
    double qx=quat.x;
    double qy=quat.y;
    double qz=quat.z;
    double qw=quat.w;
    const double n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
    qx *= n;
    qy *= n;
    qz *= n;
    qw *= n;
    matrix={1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f,
    2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f,
    2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f};
    return matrix;
}

编辑 2:

我使用了glMultMatrixf()并且它起作用了。 但我终于发现, RotateCamera()的输出使我的四元数为零? 有谁知道这种方法有什么问题:

void RotateCamera(double Angle, double x, double y, double z)
{
  quaternion temp, quat_view, result;

  temp.x = x * sin(Angle/2);
  temp.y = y * sin(Angle/2);
  temp.z = z * sin(Angle/2);
  temp.w = cos(Angle/2);

  quat_view.x = View.x;
  quat_view.y = View.y;
  quat_view.z = View.z;
  quat_view.w = 0;

  result = mult(mult(temp, quat_view), conjugate(temp));
  View.x = result.x;
  View.y = result.y;
  View.z = result.z;
}

这对我来说没有意义,但无论如何我都会尝试回答:D ...为什么不使用 glRotatef(angle,0,0,1) 旋转它来旋转 z 轴,因为这个函数的定义如下:glRotatef(angle,x_axis,y_axis,z_axis) 最后3个参数钳制到[0,1]。

对于第二个问题,据我所知,您应该减小角度,无论如何您都可以尝试使用该函数来自己查看 ;) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM