- Quaternion::Quaternion()
- {
- s = 1;
- x = y = z = 0;
- }
- Quaternion::~Quaternion(){}
- // Ich glaube hier
- void Quaternion::dir_vector(float pos[])
- {
- if(!pos) return;
- pos[0] = 2*(x*z + y*s);
- pos[1] = 2*(y*z - x*s );
- pos[2] = 1 - 2*(x*x + y*y);
- }
- Quaternion Quaternion::quat_mult(Quaternion p, Quaternion q)
- {
- Quaternion res;
- res.s = (p.s*q.s) - (p.x*q.x) - (p.y*q.y) - (p.z*q.z);
- res.x = (p.s*q.x) + (q.s*p.x) + (p.y*q.z) - (q.y*p.z);
- res.y = (p.s*q.y) + (q.s*p.y) + (p.z*q.x) - (q.z*p.x);
- res.z = (p.s*q.z) + (q.s*p.z) + (p.x*q.y) - (q.x*p.y);
- return res;
- }
- Quaternion Quaternion::quat_point(Vector p)
- {
- Quaternion res;
- res.s = 0;
- res.x = p.x;
- res.y = p.y;
- res.z = p.z;
- return res;
- }
- void Quaternion::quat_rotate(float degree, Vector p)
- {
- float angle = float((degree / 180.0f) * PI); // Man muss wohl in Opengl zu radian umrechnen
- float res = (float)sin( angle / 2.0f );
- s = (float)cos( angle / 2.0f );
- x = float(p.x * res);
- y = float(p.y * res);
- z = float(p.z * res);
- }
- void Quaternion::quat_rotate_inv(float degree, Vector p)
- {
- float angle = float((degree / 180.0f) * PI);
- float res = (float)(-sin( angle / 2.0f ));
- s = (float)cos( angle / 2.0f );
- x = float(p.x * res);
- y = float(p.y * res);
- z = float(p.z * res);
- }