|
3 | 3 | #include "Frustum.h"
|
4 | 4 |
|
5 | 5 | #include <Rcpp.h>
|
| 6 | +#include <cmath> |
6 | 7 |
|
7 | 8 | #include <GL/glu.h>
|
8 | 9 |
|
9 |
| -#include <cmath> |
| 10 | +static bool InvertMatrix(const GLfloat m[16], GLfloat invOut[16]) |
| 11 | +{ |
| 12 | + GLfloat inv[16], det; |
| 13 | + int i; |
| 14 | + |
| 15 | + inv[0] = m[5] * m[10] * m[15] - |
| 16 | + m[5] * m[11] * m[14] - |
| 17 | + m[9] * m[6] * m[15] + |
| 18 | + m[9] * m[7] * m[14] + |
| 19 | + m[13] * m[6] * m[11] - |
| 20 | + m[13] * m[7] * m[10]; |
| 21 | + |
| 22 | + inv[4] = -m[4] * m[10] * m[15] + |
| 23 | + m[4] * m[11] * m[14] + |
| 24 | + m[8] * m[6] * m[15] - |
| 25 | + m[8] * m[7] * m[14] - |
| 26 | + m[12] * m[6] * m[11] + |
| 27 | + m[12] * m[7] * m[10]; |
| 28 | + |
| 29 | + inv[8] = m[4] * m[9] * m[15] - |
| 30 | + m[4] * m[11] * m[13] - |
| 31 | + m[8] * m[5] * m[15] + |
| 32 | + m[8] * m[7] * m[13] + |
| 33 | + m[12] * m[5] * m[11] - |
| 34 | + m[12] * m[7] * m[9]; |
| 35 | + |
| 36 | + inv[12] = -m[4] * m[9] * m[14] + |
| 37 | + m[4] * m[10] * m[13] + |
| 38 | + m[8] * m[5] * m[14] - |
| 39 | + m[8] * m[6] * m[13] - |
| 40 | + m[12] * m[5] * m[10] + |
| 41 | + m[12] * m[6] * m[9]; |
| 42 | + |
| 43 | + inv[1] = -m[1] * m[10] * m[15] + |
| 44 | + m[1] * m[11] * m[14] + |
| 45 | + m[9] * m[2] * m[15] - |
| 46 | + m[9] * m[3] * m[14] - |
| 47 | + m[13] * m[2] * m[11] + |
| 48 | + m[13] * m[3] * m[10]; |
| 49 | + |
| 50 | + inv[5] = m[0] * m[10] * m[15] - |
| 51 | + m[0] * m[11] * m[14] - |
| 52 | + m[8] * m[2] * m[15] + |
| 53 | + m[8] * m[3] * m[14] + |
| 54 | + m[12] * m[2] * m[11] - |
| 55 | + m[12] * m[3] * m[10]; |
| 56 | + |
| 57 | + inv[9] = -m[0] * m[9] * m[15] + |
| 58 | + m[0] * m[11] * m[13] + |
| 59 | + m[8] * m[1] * m[15] - |
| 60 | + m[8] * m[3] * m[13] - |
| 61 | + m[12] * m[1] * m[11] + |
| 62 | + m[12] * m[3] * m[9]; |
| 63 | + |
| 64 | + inv[13] = m[0] * m[9] * m[14] - |
| 65 | + m[0] * m[10] * m[13] - |
| 66 | + m[8] * m[1] * m[14] + |
| 67 | + m[8] * m[2] * m[13] + |
| 68 | + m[12] * m[1] * m[10] - |
| 69 | + m[12] * m[2] * m[9]; |
| 70 | + |
| 71 | + inv[2] = m[1] * m[6] * m[15] - |
| 72 | + m[1] * m[7] * m[14] - |
| 73 | + m[5] * m[2] * m[15] + |
| 74 | + m[5] * m[3] * m[14] + |
| 75 | + m[13] * m[2] * m[7] - |
| 76 | + m[13] * m[3] * m[6]; |
| 77 | + |
| 78 | + inv[6] = -m[0] * m[6] * m[15] + |
| 79 | + m[0] * m[7] * m[14] + |
| 80 | + m[4] * m[2] * m[15] - |
| 81 | + m[4] * m[3] * m[14] - |
| 82 | + m[12] * m[2] * m[7] + |
| 83 | + m[12] * m[3] * m[6]; |
10 | 84 |
|
11 |
| -#include <glm/glm.hpp> |
12 |
| -#include <glm/gtc/matrix_inverse.hpp> |
13 |
| -#include <glm/gtc/type_ptr.hpp> |
| 85 | + inv[10] = m[0] * m[5] * m[15] - |
| 86 | + m[0] * m[7] * m[13] - |
| 87 | + m[4] * m[1] * m[15] + |
| 88 | + m[4] * m[3] * m[13] + |
| 89 | + m[12] * m[1] * m[7] - |
| 90 | + m[12] * m[3] * m[5]; |
| 91 | + |
| 92 | + inv[14] = -m[0] * m[5] * m[14] + |
| 93 | + m[0] * m[6] * m[13] + |
| 94 | + m[4] * m[1] * m[14] - |
| 95 | + m[4] * m[2] * m[13] - |
| 96 | + m[12] * m[1] * m[6] + |
| 97 | + m[12] * m[2] * m[5]; |
| 98 | + |
| 99 | + inv[3] = -m[1] * m[6] * m[11] + |
| 100 | + m[1] * m[7] * m[10] + |
| 101 | + m[5] * m[2] * m[11] - |
| 102 | + m[5] * m[3] * m[10] - |
| 103 | + m[9] * m[2] * m[7] + |
| 104 | + m[9] * m[3] * m[6]; |
| 105 | + |
| 106 | + inv[7] = m[0] * m[6] * m[11] - |
| 107 | + m[0] * m[7] * m[10] - |
| 108 | + m[4] * m[2] * m[11] + |
| 109 | + m[4] * m[3] * m[10] + |
| 110 | + m[8] * m[2] * m[7] - |
| 111 | + m[8] * m[3] * m[6]; |
| 112 | + |
| 113 | + inv[11] = -m[0] * m[5] * m[11] + |
| 114 | + m[0] * m[7] * m[9] + |
| 115 | + m[4] * m[1] * m[11] - |
| 116 | + m[4] * m[3] * m[9] - |
| 117 | + m[8] * m[1] * m[7] + |
| 118 | + m[8] * m[3] * m[5]; |
| 119 | + |
| 120 | + inv[15] = m[0] * m[5] * m[10] - |
| 121 | + m[0] * m[6] * m[9] - |
| 122 | + m[4] * m[1] * m[10] + |
| 123 | + m[4] * m[2] * m[9] + |
| 124 | + m[8] * m[1] * m[6] - |
| 125 | + m[8] * m[2] * m[5]; |
| 126 | + |
| 127 | + det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12]; |
| 128 | + |
| 129 | + if (det == 0) |
| 130 | + return false; |
| 131 | + |
| 132 | + det = 1.0 / det; |
| 133 | + |
| 134 | + for (i = 0; i < 16; i++) |
| 135 | + invOut[i] = inv[i] * det; |
| 136 | + |
| 137 | + return true; |
| 138 | +} |
14 | 139 |
|
15 | 140 | Camera::Camera()
|
16 | 141 | {
|
@@ -255,13 +380,22 @@ void Camera::look()
|
255 | 380 | GLfloat viewMatrix[16];
|
256 | 381 | glGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
|
257 | 382 |
|
258 |
| - glm::mat4 ConversionMatrix = glm::make_mat4(viewMatrix); |
259 |
| - glm::vec4 cameraPos4 = glm::inverse(ConversionMatrix) * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); |
260 |
| - glm::vec3 CameraPos = glm::vec3(cameraPos4); |
| 383 | + /*glm::mat4 ConversionMatrix = glm::make_mat4(viewMatrix); |
| 384 | + glm::vec4 cameraPos4 = glm::inverse(ConversionMatrix) * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); |
| 385 | + glm::vec3 CameraPos = glm::vec3(cameraPos4);*/ |
| 386 | + |
| 387 | + /*GLfloat CameraPos[4]; |
| 388 | + CameraPos[0] = invMatrix[0] * 0.0f + invMatrix[4] * 0.0f + invMatrix[8] * 0.0f + invMatrix[12] * 1.0f; |
| 389 | + CameraPos[1] = invMatrix[1] * 0.0f + invMatrix[5] * 0.0f + invMatrix[9] * 0.0f + invMatrix[13] * 1.0f; |
| 390 | + CameraPos[2] = invMatrix[2] * 0.0f + invMatrix[6] * 0.0f + invMatrix[10] * 0.0f + invMatrix[14] * 1.0f; |
| 391 | + CameraPos[3] = invMatrix[3] * 0.0f + invMatrix[7] * 0.0f + invMatrix[11] * 0.0f + invMatrix[15] * 1.0f;*/ |
| 392 | + |
| 393 | + GLfloat invMatrix[16]; |
| 394 | + InvertMatrix(viewMatrix, invMatrix); |
261 | 395 |
|
262 |
| - x = CameraPos[0]; |
263 |
| - y = CameraPos[1]; |
264 |
| - z = CameraPos[2]; |
| 396 | + x = invMatrix[12]; |
| 397 | + y = invMatrix[13]; |
| 398 | + z = invMatrix[14]; |
265 | 399 | }
|
266 | 400 |
|
267 | 401 | bool Camera::see(float px, float py, float pz, float hsize)
|
|
0 commit comments