fix: Transform->matrix conversion is now (more) correct
This commit is contained in:
parent
c74c006ae2
commit
0661622b9c
|
@ -1,4 +1,5 @@
|
||||||
#include "transformable.h"
|
#include "transformable.h"
|
||||||
|
#include "utils/debug.h"
|
||||||
|
|
||||||
Transform TransformIdentity() {
|
Transform TransformIdentity() {
|
||||||
return (Transform){
|
return (Transform){
|
||||||
|
@ -8,14 +9,10 @@ Transform TransformIdentity() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Matrix TransformGetMatrix(Transform self) {
|
Matrix TransformGetMatrix(Transform self) {
|
||||||
Matrix mat = MatrixScale(self.scale.x, self.scale.y, self.scale.z);
|
Matrix mat = MatrixScale(self.scale.x, self.scale.y, self.scale.z);
|
||||||
mat = MatrixMultiply(mat, QuaternionToMatrix(self.rotation));
|
mat = MatrixMultiply(mat, QuaternionToMatrix(self.rotation));
|
||||||
mat.m12 = self.translation.x;
|
return MatrixMultiply(mat, MatrixTranslate(self.translation.x, self.translation.y, self.translation.z));
|
||||||
mat.m13 = self.translation.y;
|
|
||||||
mat.m14 = self.translation.z;
|
|
||||||
return mat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 TransformPosition(Transform self, Vector3 local_pos) {
|
Vector3 TransformPosition(Transform self, Vector3 local_pos) {
|
||||||
|
@ -61,7 +58,7 @@ Vector3 InverseTransformScale(Transform self, Vector3 global_scale) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion InverseTransformRotation(Transform self, Quaternion global_rotation) {
|
Quaternion InverseTransformRotation(Transform self, Quaternion global_rotation) {
|
||||||
return QuaternionMultiply(QuaternionInvert(self.rotation), global_rotation);
|
return QuaternionDivide(self.rotation, global_rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform InverseTransformTransform(Transform self, Transform other) {
|
Transform InverseTransformTransform(Transform self, Transform other) {
|
||||||
|
|
|
@ -42,8 +42,8 @@ extern Vector3 InverseTransformScale(Transform self, Vector3 global_scale);
|
||||||
extern Quaternion InverseTransformRotation(Transform self, Quaternion quat);
|
extern Quaternion InverseTransformRotation(Transform self, Quaternion quat);
|
||||||
extern Transform InverseTransformTransform(Transform self, Transform other);
|
extern Transform InverseTransformTransform(Transform self, Transform other);
|
||||||
|
|
||||||
#define MATRIX_UP(self_) ((Vector3){self_.m0, self_.m1, self_.m2})
|
#define MATRIX_RIGHT(self_) ((Vector3){self_.m0, self_.m1, self_.m2})
|
||||||
#define MATRIX_RIGHT(self_) ((Vector3){self_.m4, self_.m5, self_.m6})
|
#define MATRIX_UP(self_) ((Vector3){self_.m4, self_.m5, self_.m6})
|
||||||
#define MATRIX_FORWARD(self_) ((Vector3){self_.m8, self_.m9, self_.m10})
|
#define MATRIX_FORWARD(self_) ((Vector3){self_.m8, self_.m9, self_.m10})
|
||||||
|
|
||||||
#define VECTOR3_RIGHT ((Vector3){1.f, 0.f, 0.f})
|
#define VECTOR3_RIGHT ((Vector3){1.f, 0.f, 0.f})
|
||||||
|
|
21
src/main.c
21
src/main.c
|
@ -10,26 +10,19 @@
|
||||||
|
|
||||||
Scene *CreateInitialScene() {
|
Scene *CreateInitialScene() {
|
||||||
SceneNode *root = CreateTransformNode();
|
SceneNode *root = CreateTransformNode();
|
||||||
SceneNode *camera_parent_parent = CreateTransformNode();
|
|
||||||
// create parent of camera parent to test transform hierarchy
|
|
||||||
Transformable transformable = TC_CAST(camera_parent_parent->entity, Transformable);
|
|
||||||
Transform transform = transformable.tc->get_transform(transformable.data);
|
|
||||||
transform.translation = (Vector3){10.f, 0.f, 0.f};
|
|
||||||
transform.rotation = QuaternionFromEuler(0.f, -10.f * DEG2RAD, 0.f);
|
|
||||||
transformable.tc->set_transform(transformable.data, transform);
|
|
||||||
// create camera with a transform parent
|
|
||||||
SceneNodeAddChild(root, camera_parent_parent);
|
|
||||||
SceneNode *camera_parent = CreateTransformNode();
|
SceneNode *camera_parent = CreateTransformNode();
|
||||||
// set camera parent location
|
// set camera parent location
|
||||||
transformable = TC_CAST(camera_parent->entity, Transformable);
|
Transformable transformable = TC_CAST(camera_parent->entity, Transformable);
|
||||||
transform = transformable.tc->get_transform(transformable.data);
|
Transform transform = transformable.tc->get_transform(transformable.data);
|
||||||
transform.translation = (Vector3){0.f, 10.f, -10.f};
|
transform.translation = (Vector3){0.f, 10.f, -10.f};
|
||||||
transform.rotation = QuaternionFromEuler(45.f * DEG2RAD, 0.f, 0.f);
|
transform.rotation = QuaternionFromEuler(45.f * DEG2RAD, 0.f, 0.f);
|
||||||
transformable.tc->set_transform(transformable.data, transform);
|
transformable.tc->set_transform(transformable.data, transform);
|
||||||
SceneNodeAddChild(camera_parent_parent, camera_parent);
|
|
||||||
SceneNodeAddChild(camera_parent, CreateCameraNode());
|
SceneNodeAddChild(camera_parent, CreateCameraNode());
|
||||||
SceneNodeAddChild(camera_parent, CreateTestObject());
|
SceneNode *model_parent = CreateTransformNode();
|
||||||
SceneNodeAddChild(root, CreateMeshRenderEntity("spacefighter.glb"));
|
SceneNodeAddChild(root, model_parent);
|
||||||
|
SceneNodeAddChild(model_parent, camera_parent);
|
||||||
|
SceneNodeAddChild(model_parent, CreateMeshRenderEntity("spacefighter.glb"));
|
||||||
|
SceneNodeAddChild(model_parent, CreateTestObject());
|
||||||
return CreateScene(root);
|
return CreateScene(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,10 @@ void TestObjectDraw(TestObject *self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestObjectTick(TestObject *self, double delta) {
|
void TestObjectTick(TestObject *self, double delta) {
|
||||||
Transform local_transform = self->transform.tc->get_transform(self->transform.data);
|
Transform global_transform = self->transform.tc->get_global_transform(self->transform.data);
|
||||||
local_transform.rotation = QuaternionMultiply(QuaternionFromEuler(0.f, 0.01f, 0.f), local_transform.rotation);
|
Matrix global_matrix = TransformGetMatrix(global_transform);
|
||||||
self->transform.tc->set_transform(self->transform.data, local_transform);
|
global_transform.rotation = QuaternionMultiply(global_transform.rotation, QuaternionFromAxisAngle(MATRIX_UP(global_matrix), 0.01f));
|
||||||
|
global_matrix = TransformGetMatrix(global_transform);
|
||||||
|
global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), 0.1f));
|
||||||
|
self->transform.tc->set_global_transform(self->transform.data, global_transform);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue