This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/math/Matrix4.h
2018-10-25 11:50:12 +02:00

125 lines
3.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* © Copyright 2014 Urheberrechtshinweis
* Alle Rechte vorbehalten / All Rights Reserved
*
* Programmcode ist urheberrechtlich geschuetzt.
* Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner.
* Keine Verwendung ohne explizite Genehmigung.
* (vgl. § 106 ff UrhG / § 97 UrhG)
*/
#ifndef MATRIX4_H
#define MATRIX4_H
#include <initializer_list>
#include <cmath>
class Matrix4 {
private:
float data[16];
public:
Matrix4(std::initializer_list<float> lst) {
int idx = 0;
for (float f : lst) {
data[idx] = f; ++idx;
}
}
static Matrix4 identity() {
return Matrix4( {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1} );
}
static Matrix4 getRotationDeg(const float degX, const float degY, const float degZ) {
return getRotationRad(degX/180.0f*M_PI, degY/180.0f*M_PI, degZ/180.0f*M_PI);
}
static Matrix4 getRotationRad(const float radX, const float radY, const float radZ) {
const float g = radX; const float b = radY; const float a = radZ;
const float a11 = std::cos(a)*std::cos(b);
const float a12 = std::cos(a)*std::sin(b)*std::sin(g)-std::sin(a)*std::cos(g);
const float a13 = std::cos(a)*std::sin(b)*std::cos(g)+std::sin(a)*std::sin(g);
const float a21 = std::sin(a)*std::cos(b);
const float a22 = std::sin(a)*std::sin(b)*std::sin(g)+std::cos(a)*std::cos(g);
const float a23 = std::sin(a)*std::sin(b)*std::cos(g)-std::cos(a)*std::sin(g);
const float a31 = -std::sin(b);
const float a32 = std::cos(b)*std::sin(g);
const float a33 = std::cos(b)*std::cos(g);
return Matrix4({
a11, a12, a13, 0,
a21, a22, a23, 0,
a31, a32, a33, 0,
0, 0, 0, 1
});
}
static Matrix4 getTranslation(const float x, const float y, const float z) {
return Matrix4({
1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1
});
}
static Matrix4 getScale(const float x, const float y, const float z) {
return Matrix4({
x, 0, 0, 0,
0, y, 0, 0,
0, 0, z, 0,
0, 0, 0, 1
});
}
float operator [] (const int idx) const {return data[idx];}
bool operator == (const Matrix4& o) const {
for (int i = 0; i < 16; ++i) {
if (data[i] != o.data[i]) {return false;}
}
return true;
}
};
struct Vector4 {
float x,y,z,w;
Vector4() : x(0), y(0), z(0), w(0) {;}
Vector4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {;}
bool operator == (const Vector4 o) const {
return (x==o.x) && (y==o.y) && (z==o.z) && (w==o.w);
}
};
inline Vector4 operator * (const Matrix4& mat, const Vector4& vec) {
return Vector4(
(mat[ 0]*vec.x + mat[ 1]*vec.y + mat[ 2]*vec.z + mat[ 3]*vec.w),
(mat[ 4]*vec.x + mat[ 5]*vec.y + mat[ 6]*vec.z + mat[ 7]*vec.w),
(mat[ 8]*vec.x + mat[ 9]*vec.y + mat[10]*vec.z + mat[11]*vec.w),
(mat[12]*vec.x + mat[13]*vec.y + mat[14]*vec.z + mat[15]*vec.w)
);
}
inline Matrix4 operator * (const Matrix4& m1, const Matrix4& m2) {
return Matrix4({
m1[ 0]*m2[ 0] + m1[ 1]*m2[ 4] + m1[ 2]*m2[ 8] + m1[ 3]*m2[12], m1[ 0]*m2[ 1] + m1[ 1]*m2[ 5] + m1[ 2]*m2[ 9] + m1[ 3]*m2[13], m1[ 0]*m2[ 2] + m1[ 1]*m2[ 6] + m1[ 2]*m2[10] + m1[ 3]*m2[14], m1[ 0]*m2[ 3] + m1[ 1]*m2[ 7] + m1[ 2]*m2[11] + m1[ 3]*m2[15],
m1[ 4]*m2[ 0] + m1[ 5]*m2[ 4] + m1[ 6]*m2[ 8] + m1[ 7]*m2[12], m1[ 4]*m2[ 1] + m1[ 5]*m2[ 5] + m1[ 6]*m2[ 9] + m1[ 7]*m2[13], m1[ 4]*m2[ 2] + m1[ 5]*m2[ 6] + m1[ 6]*m2[10] + m1[ 7]*m2[14], m1[ 4]*m2[ 3] + m1[ 5]*m2[ 7] + m1[ 6]*m2[11] + m1[ 7]*m2[15],
m1[ 8]*m2[ 0] + m1[ 9]*m2[ 4] + m1[10]*m2[ 8] + m1[11]*m2[12], m1[ 8]*m2[ 1] + m1[ 9]*m2[ 5] + m1[10]*m2[ 9] + m1[11]*m2[13], m1[ 8]*m2[ 2] + m1[ 9]*m2[ 6] + m1[10]*m2[10] + m1[11]*m2[14], m1[ 8]*m2[ 3] + m1[ 9]*m2[ 7] + m1[10]*m2[11] + m1[11]*m2[15],
m1[12]*m2[ 0] + m1[13]*m2[ 4] + m1[14]*m2[ 8] + m1[15]*m2[12], m1[12]*m2[ 1] + m1[13]*m2[ 5] + m1[14]*m2[ 9] + m1[15]*m2[13], m1[12]*m2[ 2] + m1[13]*m2[ 6] + m1[14]*m2[10] + m1[15]*m2[14], m1[12]*m2[ 3] + m1[13]*m2[ 7] + m1[14]*m2[11] + m1[15]*m2[15]
});
}
#endif // MATRIX4_H