四元数旋转不起作用

时间:2017-01-28 09:28:41

标签: c++ c opengl 3d rotation

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

我从中获取了代码:

$product = $data->with('productimages')->with('categories')->where('id', $id)->first();

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

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;
}

因为我不知道要使用什么作为' Up',我尝试使用0,0,0,但它只显示黑屏。非常感谢任何帮助!

编辑:

在这个网站的某个地方,我发现了一个将四元数转换为矩阵的东西。如何使用gluLookAt(Position.x, Position.y, Position.z, View.x, View.y, View.z, Up.x, Up.y, Up.z).

来使用此矩阵
glMultMatrixf();

编辑2:

我使用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; } 并且它有效。但我终于发现,glMultMatrixf()的输出使我的四元数为零? 有人知道这种方法有什么问题:

RotateCamera()

1 个答案:

答案 0 :(得分:1)

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

对于第二个问题,从我所知道你应该减少角度,无论如何你可以试验这个功能来自己看看;)。