CAMERA.C 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /****************************************************************************
  2. * camera.c
  3. *
  4. * This module implements methods for managing the viewpoint.
  5. *
  6. * from Persistence of Vision(tm) Ray Tracer
  7. * Copyright 1996,1999 Persistence of Vision Team
  8. *---------------------------------------------------------------------------
  9. * NOTICE: This source code file is provided so that users may experiment
  10. * with enhancements to POV-Ray and to port the software to platforms other
  11. * than those supported by the POV-Ray Team. There are strict rules under
  12. * which you are permitted to use this file. The rules are in the file
  13. * named POVLEGAL.DOC which should be distributed with this file.
  14. * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  15. * Team Coordinator by email to team-coord@povray.org or visit us on the web at
  16. * http://www.povray.org. The latest version of POV-Ray may be found at this site.
  17. *
  18. * This program is based on the popular DKB raytracer version 2.12.
  19. * DKBTrace was originally written by David K. Buck.
  20. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  21. *
  22. *****************************************************************************/
  23. #include "frame.h"
  24. #include "vector.h"
  25. #include "povproto.h"
  26. #include "camera.h"
  27. #include "matrices.h"
  28. #include "normal.h"
  29. /*****************************************************************************
  30. *
  31. * FUNCTION
  32. *
  33. * Translate_Camera
  34. *
  35. * INPUT
  36. *
  37. * OUTPUT
  38. *
  39. * RETURNS
  40. *
  41. * AUTHOR
  42. *
  43. * POV-Ray Team
  44. *
  45. * DESCRIPTION
  46. *
  47. * -
  48. *
  49. * CHANGES
  50. *
  51. * -
  52. *
  53. ******************************************************************************/
  54. void Translate_Camera(CAMERA *Camera, VECTOR Vector)
  55. {
  56. VAddEq(((CAMERA *)Camera)->Location, Vector);
  57. }
  58. /*****************************************************************************
  59. *
  60. * FUNCTION
  61. *
  62. * Rotate_Camera
  63. *
  64. * INPUT
  65. *
  66. * OUTPUT
  67. *
  68. * RETURNS
  69. *
  70. * AUTHOR
  71. *
  72. * POV-Ray Team
  73. *
  74. * DESCRIPTION
  75. *
  76. * -
  77. *
  78. * CHANGES
  79. *
  80. * -
  81. *
  82. ******************************************************************************/
  83. void Rotate_Camera(CAMERA *Camera, VECTOR Vector)
  84. {
  85. TRANSFORM Trans;
  86. Compute_Rotation_Transform(&Trans, Vector);
  87. Transform_Camera(Camera, &Trans);
  88. }
  89. /*****************************************************************************
  90. *
  91. * FUNCTION
  92. *
  93. * Scale_Camera
  94. *
  95. * INPUT
  96. *
  97. * OUTPUT
  98. *
  99. * RETURNS
  100. *
  101. * AUTHOR
  102. *
  103. * POV-Ray Team
  104. *
  105. * DESCRIPTION
  106. *
  107. * -
  108. *
  109. * CHANGES
  110. *
  111. * -
  112. *
  113. ******************************************************************************/
  114. void Scale_Camera(CAMERA *Camera, VECTOR Vector)
  115. {
  116. TRANSFORM Trans;
  117. Compute_Scaling_Transform(&Trans, Vector);
  118. Transform_Camera(Camera, &Trans);
  119. }
  120. /*****************************************************************************
  121. *
  122. * FUNCTION
  123. *
  124. * Transform_Camera
  125. *
  126. * INPUT
  127. *
  128. * OUTPUT
  129. *
  130. * RETURNS
  131. *
  132. * AUTHOR
  133. *
  134. * POV-Ray Team
  135. *
  136. * DESCRIPTION
  137. *
  138. * -
  139. *
  140. * CHANGES
  141. *
  142. * -
  143. *
  144. ******************************************************************************/
  145. void Transform_Camera(CAMERA *Camera, TRANSFORM *Trans)
  146. {
  147. MTransPoint(Camera->Location, Camera->Location, Trans);
  148. MTransPoint(Camera->Direction, Camera->Direction, Trans);
  149. MTransPoint(Camera->Up, Camera->Up, Trans);
  150. MTransPoint(Camera->Right, Camera->Right, Trans);
  151. }
  152. /*****************************************************************************
  153. *
  154. * FUNCTION
  155. *
  156. * Create_Camera
  157. *
  158. * INPUT
  159. *
  160. * OUTPUT
  161. *
  162. * RETURNS
  163. *
  164. * AUTHOR
  165. *
  166. * POV-Ray Team
  167. *
  168. * DESCRIPTION
  169. *
  170. * -
  171. *
  172. * CHANGES
  173. *
  174. * -
  175. *
  176. ******************************************************************************/
  177. CAMERA *Create_Camera()
  178. {
  179. CAMERA *New;
  180. New = (CAMERA *)POV_MALLOC(sizeof (CAMERA), "camera");
  181. Make_Vector(New->Location, 0.0, 0.0, 0.0);
  182. Make_Vector(New->Direction, 0.0, 0.0, 1.0);
  183. Make_Vector(New->Up, 0.0, 1.0, 0.0);
  184. Make_Vector(New->Right, 1.33, 0.0, 0.0);
  185. Make_Vector(New->Sky, 0.0, 1.0, 0.0);
  186. Make_Vector(New->Look_At, 0.0, 0.0, 1.0);
  187. /* Init focal blur stuff (not used by default). */
  188. New->Blur_Samples = 0;
  189. New->Confidence = 0.9;
  190. New->Variance = 1.0 / 128.0;
  191. New->Aperture = 0.0;
  192. New->Focal_Distance = -1.0;
  193. /* Set default camera type and viewing angle. [DB 7/94] */
  194. New->Type = PERSPECTIVE_CAMERA;
  195. New->Angle = 90.0;
  196. /* Do not perturb primary rays by default. [DB 7/94] */
  197. New->Tnormal = NULL;
  198. return (New);
  199. }
  200. /*****************************************************************************
  201. *
  202. * FUNCTION
  203. *
  204. * Copy_Camera
  205. *
  206. * INPUT
  207. *
  208. * OUTPUT
  209. *
  210. * RETURNS
  211. *
  212. * AUTHOR
  213. *
  214. * POV-Ray Team
  215. *
  216. * DESCRIPTION
  217. *
  218. * -
  219. *
  220. * CHANGES
  221. *
  222. * -
  223. *
  224. ******************************************************************************/
  225. CAMERA *Copy_Camera(CAMERA *Old)
  226. {
  227. CAMERA *New;
  228. if (Old != NULL)
  229. {
  230. New = Create_Camera();
  231. *New = *Old;
  232. }
  233. else
  234. {
  235. New = NULL;
  236. }
  237. return (New);
  238. }
  239. /*****************************************************************************
  240. *
  241. * FUNCTION
  242. *
  243. * Destroy_Camera
  244. *
  245. * INPUT
  246. *
  247. * OUTPUT
  248. *
  249. * RETURNS
  250. *
  251. * AUTHOR
  252. *
  253. * Dieter Bayer
  254. *
  255. * DESCRIPTION
  256. *
  257. * -
  258. *
  259. * CHANGES
  260. *
  261. * -
  262. *
  263. ******************************************************************************/
  264. void Destroy_Camera(CAMERA *Camera)
  265. {
  266. if (Camera != NULL)
  267. {
  268. Destroy_Tnormal(Camera->Tnormal);
  269. POV_FREE(Camera);
  270. }
  271. }