我想制作一个基于四元数的相机。在互联网上我发现了这个: 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()
答案 0 :(得分:1)
它对我来说真的没有意义,但无论如何我都会尝试回答:D ...为什么不用旋转使用glRotatef(角度,0,0,1)进行旋转z轴的定义,因为这个函数的定义如下:glRotatef(angle,x_axis,y_axis,z_axis)最后3个参数钳位到[0,1]。
对于第二个问题,从我所知道你应该减少角度,无论如何你可以试验这个功能来自己看看;)。