Advertisement
Guest User

transform.c

a guest
Jul 1st, 2015
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.19 KB | None | 0 0
  1. #include "transform.h"
  2.  
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <stdio.h>
  6.  
  7. transform *create_tranform(vec3 translate, vec3 rotate, vec3 scale)
  8. {
  9.     transform *my_transform = (transform*)malloc(sizeof(transform));
  10.    
  11.     my_transform->position = translate;
  12.     my_transform->rotation = rotate;
  13.     my_transform->scale = scale;
  14.    
  15.     my_transform->right.x = 1.0f; my_transform->right.y = 0.0f; my_transform->right.z = 0.0f;
  16.     my_transform->up.x = 0.0f; my_transform->up.y = 1.0f; my_transform->up.z = 0.0f;
  17.     my_transform->forward.x = 0.0f; my_transform->forward.y = 0.0f; my_transform->forward.z = -1.0f;
  18.    
  19.     my_transform->is_trans = 1;
  20.     my_transform->is_rot = 1;
  21.     my_transform->is_scale = 1;
  22.    
  23.     return my_transform;
  24. }
  25.  
  26. void move_obj(transform *my_transform, vec3 trans_val)
  27. {
  28.     my_transform->position.x += trans_val.x;
  29.     my_transform->position.y += trans_val.y;
  30.     my_transform->position.z += trans_val.z;
  31.     my_transform->is_trans = 1;
  32. }
  33.  
  34. void calc_transmat(transform *my_transform)
  35. {
  36.     vec4 p = {.x = 1.0f, .y = 0.0f, .z = 0.0f, .w = my_transform->position.x};
  37.     vec4 q = {.x = 0.0f, .y = 1.0f, .z = 0.0f, .w = my_transform->position.y};
  38.     vec4 r = {.x = 0.0f, .y = 0.0f, .z = 1.0f, .w = my_transform->position.z};
  39.     vec4 s = {.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f};
  40.    
  41.     mat4 temp_mat = {.p = p, .q = q, .r = r, .s = s};
  42.    
  43.     my_transform->trans_mat = temp_mat;
  44.     my_transform->is_trans = 0;
  45. }
  46.  
  47. void rot_obj(transform *my_transform, vec3 rot_val)
  48. {
  49.     my_transform->rotation.x += rot_val.x;
  50.     my_transform->rotation.y += rot_val.y;
  51.     my_transform->rotation.z += rot_val.z;
  52.     my_transform->is_rot = 1;
  53. }
  54.  
  55. void calc_rotmat(transform *my_transform)
  56. {
  57.     float p = my_transform->rotation.x * M_PI / 180.0;
  58.     float y = my_transform->rotation.y * M_PI / 180.0;
  59.     float r = my_transform->rotation.z * M_PI / 180.0;
  60.    
  61.     printf("Rot in rad\n");
  62.     printf("%f %f %f\n", p, y, r);
  63.    
  64.     // Since all quat calculations and on half of angles
  65.     p *= 0.5f;
  66.     y *= 0.5f;
  67.     r *= 0.5f;
  68.    
  69.     float sinp = sin(p);
  70.     float siny = sin(y);
  71.     float sinr = sin(r);
  72.     float cosp = cos(p);
  73.     float cosy = cos(y);
  74.     float cosr = cos(r);
  75.    
  76.     // Rotation in x axis
  77.     quat x_quat = {.x = my_transform->right.x * sinp, .y = my_transform->right.y * sinp, .z = my_transform->right.z * sinp, .w = cosp};
  78.     // Rotation in y axis
  79.     quat y_quat = {.x = my_transform->up.x * siny, .y = my_transform->up.y * siny, .z = my_transform->up.z * siny, .w = cosy};
  80.    
  81.     // Rotation in z axis
  82.     quat z_quat = {.x = my_transform->forward.x * sinr, .y = my_transform->forward.y * sinr, .z = my_transform->forward.z * sinr, .w = cosr};
  83.    
  84.     printf("Rotation quaternion in x axis.\n");
  85.     printf("%f %f %f %f\n", x_quat.x, x_quat.y, x_quat.z, x_quat.w);
  86.    
  87.     printf("Rotation quaternion in y axis.\n");
  88.     printf("%f %f %f %f\n", y_quat.x, y_quat.y, y_quat.z, y_quat.w);
  89.    
  90.     printf("Rotation quaternion in z axis.\n");
  91.     printf("%f %f %f %f\n", z_quat.x, z_quat.y, z_quat.z, z_quat.w);
  92.    
  93.     // multiplying three quaternions: trying out orders for now first y - z - x
  94.     quat zx = quat_mul(z_quat, x_quat);
  95.     quat yzx = quat_mul(y_quat, zx);
  96.    
  97.     printf("Final rotation quaternion. Muultiplication of above in order y * z * x\n");
  98.     printf("%f %f %f %f\n", yzx.x, yzx.y, yzx.z, yzx.w);
  99.  
  100.     // Vector to be rotated
  101.     quat forward_quat = {.x = my_transform->forward.x, .y = my_transform->forward.y, .z = my_transform->forward.z, .w = 0.0f};
  102.  
  103.     printf("Vector to be rotated, forward vector of object.\n");
  104.     printf("%f %f %f %f\n", forward_quat.x, forward_quat.y, forward_quat.z, forward_quat.w);
  105.    
  106.     printf("Conjuagte.\n");
  107.     printf("%f %f %f %f\n", quat_neg(yzx).x, quat_neg(yzx).y, quat_neg(yzx).z, quat_neg(yzx).w);
  108.    
  109.     printf("Quaternion into forward vector.\n");
  110.     quat final_zquat = quat_mul(yzx, forward_quat);
  111.     printf("%f %f %f %f\n", final_zquat.x, final_zquat.y, final_zquat.z, final_zquat.w);
  112.    
  113.     final_zquat = quat_mul(final_zquat, quat_neg(yzx));
  114.     printf("final quat after multiplying with conjugate.\n");
  115.     printf("%f %f %f %f\n", final_zquat.x, final_zquat.y, final_zquat.z, final_zquat.w);
  116.    
  117.     my_transform->rot_mat = quat_tomat4(final_zquat);
  118.    
  119.     printf("Rot mat\n");
  120.     printf("%f %f %f %f\n", my_transform->rot_mat.p.x, my_transform->rot_mat.p.y, my_transform->rot_mat.p.z, my_transform->rot_mat.p.w);
  121.     printf("%f %f %f %f\n", my_transform->rot_mat.q.x, my_transform->rot_mat.q.y, my_transform->rot_mat.q.z, my_transform->rot_mat.q.w);
  122.     printf("%f %f %f %f\n", my_transform->rot_mat.r.x, my_transform->rot_mat.r.y, my_transform->rot_mat.r.z, my_transform->rot_mat.r.w);
  123.     printf("%f %f %f %f\n", my_transform->rot_mat.s.x, my_transform->rot_mat.s.y, my_transform->rot_mat.s.z, my_transform->rot_mat.s.w);
  124.    
  125.     printf("Old orientations.\n");
  126.     printf("Forward: %f %f %f\n", my_transform->forward.x, my_transform->forward.y, my_transform->forward.z);
  127.     printf("Right: %f %f %f\n", my_transform->right.x, my_transform->right.y, my_transform->right.z);
  128.     printf("Up: %f %f %f\n", my_transform->up.x, my_transform->up.y, my_transform->up.z);
  129.    
  130.     // update all three vectors
  131.     vec4 fd = {.x = 0.0f, .y = 0.0f, .z = -1.0f, .w = 0.0f};
  132.     vec4 rt = {.x = 1.0f, .y = 0.0f, .z = 0.0f, .w = 0.0f};
  133.     vec4 up = {.x= 0.0f, .y = 1.0f, .z = 0.0f, .w = 0.0f};
  134.    
  135.     fd = vec4_mat4mul(fd, my_transform->rot_mat);
  136.     rt = vec4_mat4mul(rt, my_transform->rot_mat);
  137.     up = vec4_mat4mul(up, my_transform->rot_mat);
  138.    
  139.     my_transform->forward.x = fd.x; my_transform->forward.y = fd.y; my_transform->forward.z = fd.z;
  140.    
  141.     my_transform->right.x = rt.x; my_transform->right.y = rt.y; my_transform->right.z = rt.z;
  142.    
  143.     my_transform->up.x = up.x; my_transform->up.y = up.y; my_transform->up.z = up.z;
  144.    
  145.     printf("New orientations.\n");
  146.     printf("Forward: %f %f %f\n", my_transform->forward.x, my_transform->forward.y, my_transform->forward.z);
  147.     printf("Right: %f %f %f\n", my_transform->right.x, my_transform->right.y, my_transform->right.z);
  148.     printf("Up: %f %f %f\n", my_transform->up.x, my_transform->up.y, my_transform->up.z);
  149.    
  150.     my_transform->is_rot = 0;
  151. }
  152.  
  153. void scale_obj(transform *my_transform, vec3 scale_val)
  154. {
  155.     my_transform->scale = scale_val;
  156.     my_transform->is_scale = 1;
  157. }
  158.  
  159. void calc_scalemat(transform *my_transform)
  160. {
  161.     vec4 p = {.x = my_transform->scale.x, .y = 0.0f, .z = 0.0f, .w = 0.0f};
  162.     vec4 q = {.x = 0.0f, .y = my_transform->scale.y, .z = 0.0f, .w = 0.0f};
  163.     vec4 r = {.x = 0.0f, .y = 0.0f, .z = my_transform->scale.z, .w = 0.0f};
  164.     vec4 s = {.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f};
  165.    
  166.     mat4 temp_mat = {.p = p, .q = q, .r = r, .s = s};
  167.    
  168.     my_transform->scale_mat = temp_mat;
  169.     my_transform->is_scale = 0;
  170. }
  171.  
  172. void calc_modmat(transform *my_transform)
  173. {
  174.     if(my_transform->is_trans) calc_transmat(my_transform);
  175.     if(my_transform->is_rot) calc_rotmat(my_transform);
  176.     if(my_transform->is_scale) calc_scalemat(my_transform);
  177.    
  178.     my_transform->model_mat = mat4_mul(mat4_mul(my_transform->scale_mat, my_transform->rot_mat) , my_transform->trans_mat);
  179. }
  180.  
  181. void destroy_transform(transform *my_transform)
  182. {
  183.     free(my_transform);
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement