-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatrix4x4.cpp
116 lines (84 loc) · 1.9 KB
/
Matrix4x4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "Matrix4x4.h"
#include <math.h>
Matrix4x4::Matrix4x4()
{
set(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1 );
}
Matrix4x4::~Matrix4x4()
{
}
void Matrix4x4::set( float _m00, float _m01, float _m02, float _m03,
float _m10, float _m11, float _m12, float _m13,
float _m20, float _m21, float _m22, float _m23,
float _m30, float _m31, float _m32, float _m33 ) {
m00 = _m00; m01 = _m01; m02 = _m02; m03 = _m03;
m10 = _m10; m11 = _m11; m12 = _m12; m13 = _m13;
m20 = _m20; m21 = _m21; m22 = _m22; m23 = _m23;
m30 = _m30; m31 = _m31; m32 = _m32; m33 = _m33;
}
void Matrix4x4::rotateX(float angle) {
float sx = sin(angle), cx = cos(angle);
Matrix4x4 rx;
rx.set(1, 0, 0, 0,
0, cx, sx, 0,
0, -sx, cx, 0,
0, 0, 0, 1);
multiply(rx);
}
void Matrix4x4::rotateY(float angle) {
float sy = sin(angle), cy = cos(angle);
Matrix4x4 ry;
ry.set(cy, 0, -sy, 0,
0, 1, 0, 0,
sy, 0, cy, 0,
0, 0, 0, 1);
multiply(ry);
}
void Matrix4x4::rotateZ(float angle) {
float sz = sin(angle), cz = cos(angle);
Matrix4x4 rz;
rz.set(cz, sz, 0, 0,
-sz, cz, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
multiply(rz);
}
void Matrix4x4::rotateXYZ(float rot_x, float rot_y, float rot_z) {
rotateX(rot_x);
rotateY(rot_y);
rotateZ(rot_z);
}
void Matrix4x4::translate(float tx, float ty, float tz) {
Matrix4x4 rt;
rt.set(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
tx, ty, tz, 1);
multiply(rt);
}
void Matrix4x4::multiply(Matrix4x4& mat) {
Matrix4x4 result;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
result.m[i * 4 + j] = 0;
for (int k = 0; k < 4; ++k) {
//m[i * 4 + j] * mat.m[]
result.m[i * 4 + j] += m[i * 4 + k] * mat.m[k * 4 + j];
}
}
}
*this = result;
}
void Matrix4x4::transponse() {
Matrix4x4 result;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
//result.m[i * 4 + j] = m[j*4+i];
result.m[j * 4 + i] = m[i * 4 + j];
}
}
*this = result;
}