我想制作基于四元数的相机。在互联网上,我发现了这一点:
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();使用此矩阵

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]。

对于第二个问题,据我所知,您应该减小角度,无论如何,您都可以尝试使用该功能亲自观察;)。

关于c++ - 四元数旋转不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41908225/

10-11 21:29