Упростите вещи.
Создайте 3 метода, которые инициализируют масштаб, сдвиг и матрицу вращения:
struct Matrix4 {
// ...
void SetScale( Vector3 v ) {
identity();
m[0] = v.x; m[5] = v.y; m[10] = v.z;
}
void SetTranslate( Vector3 v ) {
identity();
m[12] = v.x; m[13] = v.y; m[14] = v.z;
}
void SetRotate( Vector3 v, float rad ) {
identity();
float c = cosf(rad);
float s = sinf(rad);
float x = v.x, y = v.x, z = v.z;
m[0] = x*x*(1.0f-c)+c; m[1] = x*y*(1.0f-c)-z*s; m[2] = x*z*(1.0f-c)+y*s;
m[4] = y*x*(1.0f-c)+z*s; m[5] = y*y*(1.0f-c)+c; m[6] = y*z*(1.0f-c)-x*s;
m[8] = z*x*(1.0f-c)-y*s; m[9] = z*y*(1.0f-c)+x*s; m[10] = z*z*(1.0f-c)+c;
}
// ...
}
Далее создайте метод, который умножает матрицу на текущую матрицу:
struct Matrix4 {
// ...
void Multiply( const Matrix4 &b ) {
Matrix4 a;
a.Set( m );
for ( int k = 0; k < 4; ++ k ) {
for ( int j = 0; j < 4; ++ j ) {
m[k*4+j] =
a.m[0*4+j] * b.m[k*4+0] +
a.m[1*4+j] * b.m[k*4+1] +
a.m[2*4+j] * b.m[k*4+2] +
a.m[3*4+j] * b.m[k*4+3];
}
}
}
// ...
}
Основываясь на этих методах, методы, которые масштабируют, переводят и поворачивают существующую матрицу, могут быть легко реализованы:
struct Matrix4 {
// ...
void Scale(Vector3 v) {
Matrix4 s;
s.SetScale( v );
Multiply( s );
}
void Translate(Vector3 v) {
Matrix4 t;
t.SetTranslate( v );
Multiply( t );
}
void Rotate(Vector3 axis, float rad) {
Matrix4 r;
r.SetRotate( axis, rad );
Multiply( r );
}
// ...
}
Выполните этот запуск.После этого вы можете попробовать оптимизировать методы, но у вас будет рабочая база для сравнения результатов.
Обратите внимание, что в transform.Rotate(Vector3(0.0f, 0.0f, 1.0f), ToRadians(g));
угол преобразуется из градусов в лучистую.g+=0.01
- очень маленький шаг вперед (в градусах).Вероятно, вы должны изменить это значение на g+=1.0
, чтобы получить заметное изменение в каждом кадре.
Наконец, вы должны инициализировать матрицу модема (transform
), используя единичную матрицу, перед тем каквы делаете преобразования.В противном случае новые преобразования будут выполнены поверх преобразований предыдущих кадров.Это приведет к быстрому уменьшению сетки и переводу некуда:
float g = 0, t = 0;
void OnUserUpdate() override {
transform = Matrix4();
transform.Translate(Vector3(t, t, 0.0f));
transform.Rotate(Vector3(0.0f, 0.0f, 1.0f), ToRadians(g));
transform.Scale(Vector3(0.5f, 0.5f, 0.5f));
t += 0.1 * DeltaTime;
g += 5;
Shaders.SetMat4(shader, "transform", transform);
}