summaryrefslogtreecommitdiff
path: root/src/extend/transform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/extend/transform.c')
-rw-r--r--src/extend/transform.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/extend/transform.c b/src/extend/transform.c
index e69de29..7724614 100644
--- a/src/extend/transform.c
+++ b/src/extend/transform.c
@@ -0,0 +1,37 @@
+#include "transform.h"
+
+void transform_getpositionandrotation(Transform* trans, Vec3* pos, Quat* rot) {
+ *pos = trans->localposition;
+ *rot = trans->localrotation;
+ Transform* cur = trans->parent;
+ while (cur) {
+ /*按照srt的顺序计算pos*/
+ vec3_scale3(pos, &cur->localscale, pos);
+ quat_applytovec3(&cur->localrotation, pos, pos);
+ vec3_plus(pos, &cur->localposition, pos);
+ /*计算旋转*/
+ quat_multiply(&cur->localrotation, rot, rot);
+
+ cur = cur->parent;
+ }
+}
+
+void transform_getinvmatrixnoscale(Transform* trans, Mat4* worldToLocal) {
+ Vec3 pos; Quat rot;
+ transform_getpositionandrotation(trans, &pos, &rot);
+ quat_invert(&rot, &rot);
+ /*(TR)^-1 = R^-1T^-1*/
+ quat_tomat4(&rot, worldToLocal);
+ vec3_scale(&pos, -1, &pos);
+ mat4_translate(worldToLocal, &pos, worldToLocal);
+}
+
+void transform_getrotation(Transform* trans, Quat* rot) {
+ *rot = trans->localrotation;
+ Transform* cur = trans->parent;
+ while (cur) {
+ quat_multiply(&cur->localrotation, rot, rot);
+ }
+}
+
+