camera.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * 3D Engine
  3. * camera.c:
  4. * Based on pikuma.com 3D software renderer in C
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 11/03/2021.
  8. */
  9. #include <camera.h>
  10. #include <vector.h>
  11. #include <matrix.h>
  12. void createCamera(camera_t *camera)
  13. {
  14. camera->position = vec3(0, 0, 0);
  15. camera->direction = vec3(0, 0, 1 );
  16. camera->target = vec4FromVec3(vec3(0, 0, 1));
  17. camera->up = vec3(0, 1, 0);
  18. camera->yawAngle = 0;
  19. camera->pitchAngle = 0;
  20. }
  21. void cameraSetDirection(camera_t *camera, vec3_t direction)
  22. {
  23. camera->direction = direction;
  24. }
  25. void cameraMoveForward(camera_t *camera, double distance)
  26. {
  27. vec3_t velocity = vec3ScalarMult(camera->direction, distance);
  28. camera->position = vec3AddVectors(camera->position, velocity);
  29. }
  30. void cameraMoveBackward(camera_t *camera, double distance)
  31. {
  32. vec3_t velocity = vec3ScalarMult(camera->direction, distance);
  33. camera->position = vec3SubVectors(camera->position, velocity);
  34. }
  35. void cameraMoveRelative (camera_t *camera, double x, double y, double z)
  36. {
  37. camera->position.x += x;
  38. camera->position.y += y;
  39. camera->position.z += z;
  40. }
  41. void cameraRotateBy(camera_t *camera, double yaw, double pitch)
  42. {
  43. camera->yawAngle += yaw;
  44. camera->pitchAngle += pitch;
  45. matrix4_t rotationMatrix = mat4ProdMat4(mat4RotationY(camera->yawAngle),
  46. mat4RotationX(camera->pitchAngle));
  47. camera->direction = vec3FromVec4(mat4ProdVec4(rotationMatrix, camera->target));
  48. }
  49. void cameraSetTarget(camera_t *camera, vec3_t target)
  50. {
  51. camera->target = vec4FromVec3(target);
  52. }
  53. void cameraSetUp(camera_t *camera, vec3_t up)
  54. {
  55. camera->up = up;
  56. }
  57. matrix4_t cameraGetViewMatrix(camera_t *camera)
  58. {
  59. return mat4LookAt(camera->position,
  60. vec3AddVectors(camera->position, camera->direction),
  61. camera->up);
  62. }