3dproject.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*
  2. Projekcni funkce - rene ja a rudolf, chodivame na golf
  3. spec podekovani -
  4. */
  5. #include "3d_all.h"
  6. int transf_3d_2d_word(float p_x, float p_y, float p_z,
  7. int *p_tx, int *p_ty, float *p_tz,
  8. GLMATRIX * p_cam, GLMATRIX * p_proj,
  9. int x_c, int y_c, int xs, int ys, float z_near, float z_far)
  10. {
  11. float x, y, z, w, w2;
  12. x_c >>= 1;
  13. y_c >>= 1;
  14. p_x -= xs;
  15. p_y -= ys;
  16. x = p_cam->_11 * p_x + p_cam->_21 * p_y + p_cam->_31 * p_z + p_cam->_41;
  17. y = p_cam->_12 * p_x + p_cam->_22 * p_y + p_cam->_32 * p_z + p_cam->_42;
  18. z = p_cam->_13 * p_x + p_cam->_23 * p_y + p_cam->_33 * p_z + p_cam->_43;
  19. w = p_cam->_14 * p_x + p_cam->_24 * p_y + p_cam->_34 * p_z + p_cam->_44;
  20. p_x = x;
  21. p_y = y;
  22. p_z = z;
  23. w2 = w;
  24. x =
  25. p_proj->_11 * p_x + p_proj->_21 * p_y + p_proj->_31 * p_z +
  26. p_proj->_41 * w2;
  27. y =
  28. p_proj->_12 * p_x + p_proj->_22 * p_y + p_proj->_32 * p_z +
  29. p_proj->_42 * w2;
  30. z =
  31. p_proj->_13 * p_x + p_proj->_23 * p_y + p_proj->_33 * p_z +
  32. p_proj->_43 * w2;
  33. w =
  34. p_proj->_14 * p_x + p_proj->_24 * p_y + p_proj->_34 * p_z +
  35. p_proj->_44 * w2;
  36. if (w == 0.0f)
  37. return (FALSE);
  38. if (-w <= z && z <= w && -w <= x && x <= w && -w < y && y <= w) {
  39. *p_tx = ftoi(x_c * (x / w + 1)) + xs;
  40. *p_ty = ftoi(y_c * (1 - y / w)) + ys;
  41. *p_tz = z_near + ((z / w + 1) * 0.5f) * (z_far - z_near);
  42. return (TRUE);
  43. }
  44. else {
  45. return (FALSE);
  46. }
  47. }
  48. int transf_3d_2d(float p_x, float p_y, float p_z,
  49. int *p_tx, int *p_ty, float *p_tz,
  50. GLMATRIX * p_word, GLMATRIX * p_cam, GLMATRIX * p_proj,
  51. int x_c, int y_c, int xs, int ys, float z_near, float z_far)
  52. {
  53. float x, y, z, w, w2;
  54. x_c >>= 1;
  55. y_c >>= 1;
  56. p_x -= xs;
  57. p_y -= ys;
  58. x = p_word->_11 * p_x + p_word->_21 * p_y + p_word->_31 * p_z + p_word->_41;
  59. y = p_word->_12 * p_x + p_word->_22 * p_y + p_word->_32 * p_z + p_word->_42;
  60. z = p_word->_13 * p_x + p_word->_23 * p_y + p_word->_33 * p_z + p_word->_43;
  61. w = p_word->_14 * p_x + p_word->_24 * p_y + p_word->_34 * p_z + p_word->_44;
  62. p_x = p_cam->_11 * x + p_cam->_21 * y + p_cam->_31 * z + p_cam->_41 * w;
  63. p_y = p_cam->_12 * x + p_cam->_22 * y + p_cam->_32 * z + p_cam->_42 * w;
  64. p_z = p_cam->_13 * x + p_cam->_23 * y + p_cam->_33 * z + p_cam->_43 * w;
  65. w2 = p_cam->_14 * x + p_cam->_24 * y + p_cam->_34 * z + p_cam->_44 * w;
  66. x =
  67. p_proj->_11 * p_x + p_proj->_21 * p_y + p_proj->_31 * p_z +
  68. p_proj->_41 * w2;
  69. y =
  70. p_proj->_12 * p_x + p_proj->_22 * p_y + p_proj->_32 * p_z +
  71. p_proj->_42 * w2;
  72. z =
  73. p_proj->_13 * p_x + p_proj->_23 * p_y + p_proj->_33 * p_z +
  74. p_proj->_43 * w2;
  75. w =
  76. p_proj->_14 * p_x + p_proj->_24 * p_y + p_proj->_34 * p_z +
  77. p_proj->_44 * w2;
  78. if (w == 0.0f)
  79. return (FALSE);
  80. if (-w <= z && z <= w && -w <= x && x <= w && -w < y && y <= w) {
  81. *p_tx = ftoi(x_c * (x / w + 1)) + xs;
  82. *p_ty = ftoi(y_c * (1 - y / w)) + ys;
  83. *p_tz = z_near + ((z / w + 1) * 0.5f) * (z_far - z_near);
  84. return (TRUE);
  85. }
  86. else {
  87. return (FALSE);
  88. }
  89. }
  90. void transf_2d_3d(float p_x, float p_y, float p_z,
  91. float *p_tx, float *p_ty, float *p_tz,
  92. GLMATRIX * p_cam, GLMATRIX * p_proj,
  93. dword x_c, dword y_c, dword xs, dword ys)
  94. {
  95. GLMATRIX m, mi;
  96. float x, y, z;
  97. float x3, y3, z3, w3;
  98. x_c >>= 1;
  99. y_c >>= 1;
  100. p_x -= xs;
  101. p_y -= ys;
  102. x = p_x / x_c - 1;
  103. y = 1 - p_y / y_c;
  104. z = 2 * p_z - 1;
  105. glu_invert_matrix(mat_mult(p_cam, p_proj, &mi), &m);
  106. x3 = m._11 * x + m._21 * y + m._31 * z + m._41;
  107. y3 = m._12 * x + m._22 * y + m._32 * z + m._42;
  108. z3 = m._13 * x + m._23 * y + m._33 * z + m._43;
  109. w3 = m._14 * x + m._24 * y + m._34 * z + m._44;
  110. *p_tx = x3 / w3;
  111. *p_ty = y3 / w3;
  112. *p_tz = z3 / w3;
  113. }
  114. /*
  115. Problem -> 2D ->3D
  116. */
  117. void transf_2d_3d_z(float p_x, float p_y, float p_z,
  118. float *p_tx, float *p_ty, float *p_tz,
  119. GLMATRIX * p_cam, GLMATRIX * p_proj,
  120. dword x_c, dword y_c, dword xs, dword ys, float z_near, float z_far)
  121. {
  122. GLMATRIX m, mi;
  123. float x, y, z, a, b, c;
  124. float x3, y3, z3, w3;
  125. x_c >>= 1;
  126. y_c >>= 1;
  127. p_x -= xs;
  128. p_y -= ys;
  129. x = p_x / x_c - 1;
  130. y = 1 - p_y / y_c;
  131. c = z_far - z_near;
  132. a = (z_near + z_far) / c;
  133. b = -(z_near * z_far) / c;
  134. z = a + b / p_z;
  135. glu_invert_matrix(mat_mult(p_cam, p_proj, &mi), &m);
  136. x3 = m._11 * x + m._21 * y + m._31 * z + m._41;
  137. y3 = m._12 * x + m._22 * y + m._32 * z + m._42;
  138. z3 = m._13 * x + m._23 * y + m._33 * z + m._43;
  139. w3 = m._14 * x + m._24 * y + m._34 * z + m._44;
  140. *p_tx = x3 / w3;
  141. *p_ty = y3 / w3;
  142. *p_tz = z3 / w3;
  143. }
  144. void transf_2d_3d_world(float p_x, float p_y, float p_z,
  145. float *p_tx, float *p_ty, float *p_tz,
  146. GLMATRIX * p_world, GLMATRIX * p_cam, GLMATRIX * p_proj,
  147. dword x_c, dword y_c, dword xs, dword ys)
  148. {
  149. GLMATRIX m, mi;
  150. float x, y, z, w;
  151. x_c >>= 1;
  152. y_c >>= 1;
  153. p_x -= xs;
  154. p_y -= ys;
  155. x = p_x / x_c - 1;
  156. y = 1 - p_y / y_c;
  157. z = 2 * p_z - 1;
  158. mat_mult(p_world, p_cam, &m);
  159. mat_mult(&m, p_proj, &mi);
  160. glu_invert_matrix(&mi, &m);
  161. w = m._14 * x + m._24 * y + m._34 * z + m._44;
  162. *p_tx = (m._11 * x + m._21 * y + m._31 * z + m._41) / w;
  163. *p_ty = (m._12 * x + m._22 * y + m._32 * z + m._42) / w;
  164. *p_tz = (m._13 * x + m._23 * y + m._33 * z + m._43) / w;
  165. }
  166. void transf_2d_3d_z_world(float p_x, float p_y, float p_z,
  167. float *p_tx, float *p_ty, float *p_tz,
  168. GLMATRIX * p_world, GLMATRIX * p_cam, GLMATRIX * p_proj,
  169. dword x_c, dword y_c, dword xs, dword ys, float z_near, float z_far)
  170. {
  171. GLMATRIX m, mi;
  172. float x, y, z;
  173. float a, b, c;
  174. float x3, y3, z3, w3;
  175. x_c >>= 1;
  176. y_c >>= 1;
  177. p_x -= xs;
  178. p_y -= ys;
  179. x = p_x / x_c - 1;
  180. y = 1 - p_y / y_c;
  181. c = z_far - z_near;
  182. a = (z_near + z_far) / c;
  183. b = -(z_near * z_far) / c;
  184. z = a + b / p_z;
  185. mat_mult(p_world, p_cam, &m);
  186. mat_mult(&m, p_proj, &mi);
  187. glu_invert_matrix(&mi, &m);
  188. x3 = m._11 * x + m._21 * y + m._31 * z + m._41;
  189. y3 = m._12 * x + m._22 * y + m._32 * z + m._42;
  190. z3 = m._13 * x + m._23 * y + m._33 * z + m._43;
  191. w3 = m._14 * x + m._24 * y + m._34 * z + m._44;
  192. *p_tx = x3 / w3;
  193. *p_ty = y3 / w3;
  194. *p_tz = z3 / w3;
  195. }