- Loesil::LGE::Matrix::Matrix(Vector _axis, GLdouble _angle)
- {
- GLdouble sine = sin(_angle);
- GLdouble cosine = cos(_angle);
- GLdouble oneMinusCosine = 1 - cosine;
- _axis.normalize();
- this->matrix[0][0] = (oneMinusCosine * _axis.x * _axis.x) + cosine;
- this->matrix[0][1] = (oneMinusCosine * _axis.x * _axis.y) - (_axis.z * sine);
- this->matrix[0][2] = (oneMinusCosine * _axis.z * _axis.x) + (_axis.y * sine);
- this->matrix[0][3] = 0.0;
- this->matrix[1][0] = (oneMinusCosine * _axis.x * _axis.y) + (_axis.z * sine);
- this->matrix[1][1] = (oneMinusCosine * _axis.y *_axis.y) + cosine;
- this->matrix[1][2] = (oneMinusCosine * _axis.y * _axis.z) - (_axis.x * sine);
- this->matrix[1][3] = 0.0;
- this->matrix[2][0] = (oneMinusCosine * _axis.z * _axis.x) - (_axis.y * sine);
- this->matrix[2][1] = (oneMinusCosine * _axis.y * _axis.z) + (_axis.x * sine);
- this->matrix[2][2] = (oneMinusCosine * _axis.z * _axis.z) + cosine;
- this->matrix[2][3] = 0.0;
- this->matrix[3][0] = 0.0;
- this->matrix[3][1] = 0.0;
- this->matrix[3][2] = 0.0;
- this->matrix[3][3] = 1.0;
- }
- Vector4 transformVector(Vector4 _vector, Matrix _matrix)
- {
- Vector4 ret;
- GLdouble ** transMatrix = _matrix.getMatrix();
- ret.x = _vector.x * transMatrix[0][0] + _vector.y * transMatrix[1][0] + _vector.z * transMatrix[2][0] + _vector.w * transMatrix[3][0];
- ret.y = _vector.x * transMatrix[0][1] + _vector.y * transMatrix[1][1] + _vector.z * transMatrix[2][1] + _vector.w * transMatrix[3][1];
- ret.z = _vector.x * transMatrix[0][2] + _vector.y * transMatrix[1][2] + _vector.z * transMatrix[2][2] + _vector.w * transMatrix[3][2];
- ret.w = _vector.x * transMatrix[0][3] + _vector.y * transMatrix[1][3] + _vector.z * transMatrix[2][3] + _vector.w * transMatrix[3][3];
- delete transMatrix;
- return ret;
- }
- Vector4 rotateVector(Vector _vector, Vector _axis, GLdouble _angle)
- {
- Matrix matrix = Matrix(_axis, _angle);
- return transformVector(Vector4(_vector.x, _vector.y, _vector.z, 0.0), matrix);
- }
- void rotateObject(LGE::PolygonObject * _objects, double _pitch, double _yaw)
- {
- LGE::Vector localX = LGE::Vector(1.0, 0.0, 0.0);
- LGE::Vector localY = LGE::Vector(0.0, -10.0, 0.0); //-10 ist nru die diztanz zum ursprung um den gedreht werden soll
- LGE::Vector startX = localY;
- localX = LGE::rotateVector(localX, localY, LGE::degree2Radian(_yaw));
- localY = LGE::rotateVector(localY, localX, LGE::degree2Radian(_pitch));
- _objects->setDirection(LGE::Point3D(_pitch, _yaw, 0.0)); //_yaw ist hier korrekt, doch _pitch nicht...
- _objects->setPosition(localY); //Position ist korrekt, also scheint die berechnung zu stimmen ;)
- }
- void Loesil::LGE::PolygonObject::drawObject()
- {
- glPushMatrix();
- glTranslated(this->position.x, this->position.y, this->position.z);
- if (this->direction.y > 0.0) //Rotationen werden nacheinander ausgeführt
- {
- glRotated(this->direction.y, 0.0, 1.0, 0.0);
- }
- if (this->direction.x > 0.0)
- {
- glRotated(this->direction.x, 1.0, 0.0, 0.0);
- }
- if (this->direction.z > 0.0)
- {
- glRotated(this->direction.z, 0.0, 0.0, 1.0);
- }
- glScaled(this->scale.x, this->scale.y, this->scale.z);
- this->polygon->draw();
- glPopMatrix();
- }