Rev 215 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 200 | chris | 1 | package com.gebauz.Bauzoid.math; |
| 2 | |||
| 205 | chris | 3 | import java.nio.FloatBuffer; |
| 4 | |||
| 215 | chris | 5 | import com.badlogic.gdx.utils.BufferUtils; |
| 214 | chris | 6 | |
| 200 | chris | 7 | public class Matrix4 |
| 8 | { |
||
| 9 | /* OpenGL Colum Major: |
||
| 10 | * m[0] m[4] m[8] m[12] |
||
| 11 | * m[1] m[5] m[9] m[13] |
||
| 12 | * m[2] m[6] m[10] m[14] |
||
| 13 | * m[3] m[7] m[11] m[15] |
||
| 14 | */ |
||
| 15 | public float m11; |
||
| 16 | public float m21; |
||
| 17 | public float m31; |
||
| 18 | public float m41; |
||
| 19 | public float m12; |
||
| 20 | public float m22; |
||
| 21 | public float m32; |
||
| 22 | public float m42; |
||
| 23 | public float m13; |
||
| 24 | public float m23; |
||
| 25 | public float m33; |
||
| 26 | public float m43; |
||
| 27 | public float m14; |
||
| 28 | public float m24; |
||
| 29 | public float m34; |
||
| 30 | public float m44; |
||
| 31 | |||
| 32 | static public final int MATRIX_SIZE = 4; |
||
| 33 | |||
| 34 | public Matrix4() |
||
| 35 | { |
||
| 36 | } |
||
| 37 | |||
| 38 | public Matrix4(float[] m) |
||
| 39 | { |
||
| 40 | fromGLMatrix(m); |
||
| 41 | } |
||
| 42 | |||
| 43 | public float get(int row, int col) |
||
| 44 | { |
||
| 45 | switch (row) |
||
| 46 | { |
||
| 47 | case 0: |
||
| 48 | switch (col) |
||
| 49 | { |
||
| 50 | case 0: return m11; |
||
| 51 | case 1: return m12; |
||
| 52 | case 2: return m13; |
||
| 53 | case 3: return m14; |
||
| 54 | } |
||
| 55 | break; |
||
| 56 | case 1: |
||
| 57 | switch (col) |
||
| 58 | { |
||
| 59 | case 0: return m21; |
||
| 60 | case 1: return m22; |
||
| 61 | case 2: return m23; |
||
| 62 | case 3: return m24; |
||
| 63 | } |
||
| 64 | break; |
||
| 65 | case 2: |
||
| 66 | switch (col) |
||
| 67 | { |
||
| 68 | case 0: return m31; |
||
| 69 | case 1: return m32; |
||
| 70 | case 2: return m33; |
||
| 71 | case 3: return m34; |
||
| 72 | } |
||
| 73 | break; |
||
| 74 | case 3: |
||
| 75 | switch (col) |
||
| 76 | { |
||
| 77 | case 0: return m41; |
||
| 78 | case 1: return m42; |
||
| 79 | case 2: return m43; |
||
| 80 | case 3: return m44; |
||
| 81 | } |
||
| 82 | break; |
||
| 83 | } |
||
| 84 | // should never reach here -> TODO: assert |
||
| 85 | return 0.0f; |
||
| 86 | } |
||
| 87 | |||
| 88 | public void set(int row, int col, float value) |
||
| 89 | { |
||
| 90 | switch (row) |
||
| 91 | { |
||
| 92 | case 0: |
||
| 93 | switch (col) |
||
| 94 | { |
||
| 95 | case 0: |
||
| 96 | m11 = value; |
||
| 97 | break; |
||
| 98 | case 1: |
||
| 99 | m12 = value; |
||
| 100 | break; |
||
| 101 | case 2: |
||
| 102 | m13 = value; |
||
| 103 | break; |
||
| 104 | case 3: |
||
| 105 | m14 = value; |
||
| 106 | break; |
||
| 107 | } |
||
| 108 | break; |
||
| 109 | case 1: |
||
| 110 | switch (col) |
||
| 111 | { |
||
| 112 | case 0: |
||
| 113 | m21 = value; |
||
| 114 | break; |
||
| 115 | case 1: |
||
| 116 | m22 = value; |
||
| 117 | break; |
||
| 118 | case 2: |
||
| 119 | m23 = value; |
||
| 120 | break; |
||
| 121 | case 3: |
||
| 122 | m24 = value; |
||
| 123 | break; |
||
| 124 | } |
||
| 125 | break; |
||
| 126 | case 2: |
||
| 127 | switch (col) |
||
| 128 | { |
||
| 129 | case 0: |
||
| 130 | m31 = value; |
||
| 131 | break; |
||
| 132 | case 1: |
||
| 133 | m32 = value; |
||
| 134 | break; |
||
| 135 | case 2: |
||
| 136 | m33 = value; |
||
| 137 | break; |
||
| 138 | case 3: |
||
| 139 | m34 = value; |
||
| 140 | break; |
||
| 141 | } |
||
| 142 | break; |
||
| 143 | case 3: |
||
| 144 | switch (col) |
||
| 145 | { |
||
| 146 | case 0: |
||
| 147 | m41 = value; |
||
| 148 | break; |
||
| 149 | case 1: |
||
| 150 | m42 = value; |
||
| 151 | break; |
||
| 152 | case 2: |
||
| 153 | m43 = value; |
||
| 154 | break; |
||
| 155 | case 3: |
||
| 156 | m44 = value; |
||
| 157 | break; |
||
| 158 | } |
||
| 159 | break; |
||
| 160 | } |
||
| 161 | } |
||
| 162 | |||
| 163 | public void zero() |
||
| 164 | { |
||
| 165 | m11 = 0.0f; m12 = 0.0f; m13 = 0.0f; m14 = 0.0f; |
||
| 166 | m21 = 0.0f; m22 = 0.0f; m23 = 0.0f; m24 = 0.0f; |
||
| 167 | m31 = 0.0f; m32 = 0.0f; m33 = 0.0f; m34 = 0.0f; |
||
| 168 | m41 = 0.0f; m42 = 0.0f; m43 = 0.0f; m44 = 0.0f; |
||
| 169 | } |
||
| 170 | |||
| 171 | public void identity() |
||
| 172 | { |
||
| 173 | zero(); |
||
| 174 | m11 = 1.0f; m22 = 1.0f; m33 = 1.0f; m44 = 1.0f; |
||
| 175 | } |
||
| 176 | |||
| 177 | public boolean equals(Matrix4 other) |
||
| 178 | { |
||
| 179 | return ((m11 == other.m11) && (m12 == other.m12) && (m13 == other.m13) && (m14 == other.m14) && |
||
| 180 | (m21 == other.m21) && (m22 == other.m22) && (m23 == other.m23) && (m24 == other.m24) && |
||
| 181 | (m31 == other.m31) && (m32 == other.m32) && (m33 == other.m33) && (m34 == other.m34) && |
||
| 182 | (m41 == other.m41) && (m42 == other.m42) && (m43 == other.m43) && (m44 == other.m44)); |
||
| 183 | } |
||
| 184 | |||
| 185 | public boolean isSingular() |
||
| 186 | { |
||
| 187 | float determinant = getDeterminant(); |
||
| 188 | return ((float)Math.abs(determinant) < MathUtil.EPSILON); |
||
| 189 | } |
||
| 190 | |||
| 191 | public Matrix4 getTranspose() |
||
| 192 | { |
||
| 193 | Matrix4 result = new Matrix4(); |
||
| 194 | result.m11 = m11; |
||
| 195 | result.m12 = m21; |
||
| 196 | result.m13 = m31; |
||
| 197 | result.m14 = m41; |
||
| 198 | result.m21 = m12; |
||
| 199 | result.m22 = m22; |
||
| 200 | result.m23 = m32; |
||
| 201 | result.m24 = m42; |
||
| 202 | result.m31 = m13; |
||
| 203 | result.m32 = m23; |
||
| 204 | result.m33 = m33; |
||
| 205 | result.m34 = m43; |
||
| 206 | result.m41 = m14; |
||
| 207 | result.m42 = m24; |
||
| 208 | result.m43 = m34; |
||
| 209 | result.m44 = m44; |
||
| 210 | return result; |
||
| 211 | } |
||
| 212 | |||
| 213 | public float getDeterminant() |
||
| 214 | { |
||
| 215 | float result = |
||
| 216 | m14 * m23 * m32 * m41 - |
||
| 217 | m13 * m24 * m32 * m41 - |
||
| 218 | m14 * m22 * m33 * m41 + |
||
| 219 | m12 * m24 * m33 * m41 + |
||
| 220 | m13 * m22 * m34 * m41 - |
||
| 221 | m12 * m23 * m34 * m41 - |
||
| 222 | m14 * m23 * m31 * m42 + |
||
| 223 | m13 * m24 * m31 * m42 + |
||
| 224 | m14 * m21 * m33 * m42 - |
||
| 225 | m11 * m24 * m33 * m42 - |
||
| 226 | m13 * m21 * m34 * m42 + |
||
| 227 | m11 * m23 * m34 * m42 + |
||
| 228 | m14 * m22 * m31 * m43 - |
||
| 229 | m12 * m24 * m31 * m43 - |
||
| 230 | m14 * m21 * m32 * m43 + |
||
| 231 | m11 * m24 * m32 * m43 + |
||
| 232 | m12 * m21 * m34 * m43 - |
||
| 233 | m11 * m22 * m34 * m43 - |
||
| 234 | m13 * m22 * m31 * m44 + |
||
| 235 | m12 * m23 * m31 * m44 + |
||
| 236 | m13 * m21 * m32 * m44 - |
||
| 237 | m11 * m23 * m32 * m44 - |
||
| 238 | m12 * m21 * m33 * m44 + |
||
| 239 | m11 * m22 * m33 * m44; |
||
| 240 | return result; |
||
| 241 | } |
||
| 242 | |||
| 243 | public Matrix4 getInverse() |
||
| 244 | { |
||
| 245 | Matrix4 result = new Matrix4(); |
||
| 246 | |||
| 247 | float determinant = getDeterminant(); |
||
| 248 | if (determinant == 0.0f) |
||
| 249 | { |
||
| 250 | // singular matrix cannot be inverted |
||
| 251 | return this; |
||
| 252 | } |
||
| 253 | |||
| 254 | result.m11 = m23 * m34 * m42 |
||
| 255 | - m24 * m33 * m42 |
||
| 256 | + m24 * m32 * m43 |
||
| 257 | - m22 * m34 * m43 |
||
| 258 | - m23 * m32 * m44 |
||
| 259 | + m22 * m33 * m44; |
||
| 260 | result.m12 = m14 * m33 * m42 |
||
| 261 | - m13 * m34 * m42 |
||
| 262 | - m14 * m32 * m43 |
||
| 263 | + m12 * m34 * m43 |
||
| 264 | + m13 * m32 * m44 |
||
| 265 | - m12 * m33 * m44; |
||
| 266 | result.m13 = m13 * m24 * m42 |
||
| 267 | - m14 * m23 * m42 |
||
| 268 | + m14 * m22 * m43 |
||
| 269 | - m12 * m24 * m43 |
||
| 270 | - m13 * m22 * m44 |
||
| 271 | + m12 * m23 * m44; |
||
| 272 | result.m14 = m14 * m23 * m32 |
||
| 273 | - m13 * m24 * m32 |
||
| 274 | - m14 * m22 * m33 |
||
| 275 | + m12 * m24 * m33 |
||
| 276 | + m13 * m22 * m34 |
||
| 277 | - m12 * m23 * m34; |
||
| 278 | result.m21 = m24 * m33 * m41 |
||
| 279 | - m23 * m34 * m41 |
||
| 280 | - m24 * m31 * m43 |
||
| 281 | + m21 * m34 * m43 |
||
| 282 | + m23 * m31 * m44 |
||
| 283 | - m21 * m33 * m44; |
||
| 284 | result.m22 = m13 * m34 * m41 |
||
| 285 | - m14 * m33 * m41 |
||
| 286 | + m14 * m31 * m43 |
||
| 287 | - m11 * m34 * m43 |
||
| 288 | - m13 * m31 * m44 |
||
| 289 | + m11 * m33 * m44; |
||
| 290 | result.m23 = m14 * m23 * m41 |
||
| 291 | - m13 * m24 * m41 |
||
| 292 | - m14 * m21 * m43 |
||
| 293 | + m11 * m24 * m43 |
||
| 294 | + m13 * m21 * m44 |
||
| 295 | - m11 * m23 * m44; |
||
| 296 | result.m24 = m13 * m24 * m31 |
||
| 297 | - m14 * m23 * m31 |
||
| 298 | + m14 * m21 * m33 |
||
| 299 | - m11 * m24 * m33 |
||
| 300 | - m13 * m21 * m34 |
||
| 301 | + m11 * m23 * m34; |
||
| 302 | result.m31 = m22 * m34 * m41 |
||
| 303 | - m24 * m32 * m41 |
||
| 304 | + m24 * m31 * m42 |
||
| 305 | - m21 * m34 * m42 |
||
| 306 | - m22 * m31 * m44 |
||
| 307 | + m21 * m32 * m44; |
||
| 308 | result.m32 = m14 * m32 * m41 |
||
| 309 | - m12 * m34 * m41 |
||
| 310 | - m14 * m31 * m42 |
||
| 311 | + m11 * m34 * m42 |
||
| 312 | + m12 * m31 * m44 |
||
| 313 | - m11 * m32 * m44; |
||
| 314 | result.m33 = m12 * m24 * m41 |
||
| 315 | - m14 * m22 * m41 |
||
| 316 | + m14 * m21 * m42 |
||
| 317 | - m11 * m24 * m42 |
||
| 318 | - m12 * m21 * m44 |
||
| 319 | + m11 * m22 * m44; |
||
| 320 | result.m34 = m14 * m22 * m31 |
||
| 321 | - m12 * m24 * m31 |
||
| 322 | - m14 * m21 * m32 |
||
| 323 | + m11 * m24 * m32 |
||
| 324 | + m12 * m21 * m34 |
||
| 325 | - m11 * m22 * m34; |
||
| 326 | result.m41 = m23 * m32 * m41 |
||
| 327 | - m22 * m33 * m41 |
||
| 328 | - m23 * m31 * m42 |
||
| 329 | + m21 * m33 * m42 |
||
| 330 | + m22 * m31 * m43 |
||
| 331 | - m21 * m32 * m43; |
||
| 332 | result.m42 = m12 * m33 * m41 |
||
| 333 | - m13 * m32 * m41 |
||
| 334 | + m13 * m31 * m42 |
||
| 335 | - m11 * m33 * m42 |
||
| 336 | - m12 * m31 * m43 |
||
| 337 | + m11 * m32 * m43; |
||
| 338 | result.m43 = m13 * m22 * m41 |
||
| 339 | - m12 * m23 * m41 |
||
| 340 | - m13 * m21 * m42 |
||
| 341 | + m11 * m23 * m42 |
||
| 342 | + m12 * m21 * m43 |
||
| 343 | - m11 * m22 * m43; |
||
| 344 | result.m44 = m12 * m23 * m31 |
||
| 345 | - m13 * m22 * m31 |
||
| 346 | + m13 * m21 * m32 |
||
| 347 | - m11 * m23 * m32 |
||
| 348 | - m12 * m21 * m33 |
||
| 349 | + m11 * m22 * m33; |
||
| 350 | |||
| 351 | float multiply = 1.0f / determinant; |
||
| 352 | result.m11 *= multiply; |
||
| 353 | result.m21 *= multiply; |
||
| 354 | result.m31 *= multiply; |
||
| 355 | result.m41 *= multiply; |
||
| 356 | result.m12 *= multiply; |
||
| 357 | result.m22 *= multiply; |
||
| 358 | result.m32 *= multiply; |
||
| 359 | result.m42 *= multiply; |
||
| 360 | result.m13 *= multiply; |
||
| 361 | result.m23 *= multiply; |
||
| 362 | result.m33 *= multiply; |
||
| 363 | result.m43 *= multiply; |
||
| 364 | result.m14 *= multiply; |
||
| 365 | result.m24 *= multiply; |
||
| 366 | result.m34 *= multiply; |
||
| 367 | result.m44 *= multiply; |
||
| 368 | |||
| 369 | return result; |
||
| 370 | } |
||
| 371 | |||
| 372 | public void copyTo(Matrix4 target) |
||
| 373 | { |
||
| 374 | target.m11 = m11; target.m12 = m12; target.m13 = m13; target.m14 = m14; |
||
| 375 | target.m21 = m21; target.m22 = m22; target.m23 = m23; target.m24 = m24; |
||
| 376 | target.m31 = m31; target.m32 = m32; target.m33 = m33; target.m34 = m34; |
||
| 377 | target.m41 = m41; target.m42 = m42; target.m43 = m43; target.m44 = m44; |
||
| 378 | } |
||
| 379 | |||
| 380 | public void copyFrom(Matrix4 source) |
||
| 381 | { |
||
| 382 | m11 = source.m11; m12 = source.m12; m13 = source.m13; m14 = source.m14; |
||
| 383 | m21 = source.m21; m22 = source.m22; m23 = source.m23; m24 = source.m24; |
||
| 384 | m31 = source.m31; m32 = source.m32; m33 = source.m33; m34 = source.m34; |
||
| 385 | m41 = source.m41; m42 = source.m42; m43 = source.m43; m44 = source.m44; |
||
| 386 | } |
||
| 387 | |||
| 388 | public void postMultiply(Matrix4 v) |
||
| 389 | { |
||
| 390 | multiply(this, this, v); |
||
| 391 | } |
||
| 392 | |||
| 393 | public void preMultiply(Matrix4 v) |
||
| 394 | { |
||
| 395 | multiply(this, v, this); |
||
| 396 | } |
||
| 397 | |||
| 398 | static public void multiply(Matrix4 result, Matrix4 a, Matrix4 b) |
||
| 399 | { |
||
| 400 | float result11 = a.m11 * b.m11 + a.m21 * b.m12 + a.m31 * b.m13 + a.m41 * b.m14; |
||
| 401 | float result21 = a.m11 * b.m21 + a.m21 * b.m22 + a.m31 * b.m23 + a.m41 * b.m24; |
||
| 402 | float result31 = a.m11 * b.m31 + a.m21 * b.m32 + a.m31 * b.m33 + a.m41 * b.m34; |
||
| 403 | float result41 = a.m11 * b.m41 + a.m21 * b.m42 + a.m31 * b.m43 + a.m41 * b.m44; |
||
| 404 | float result12 = a.m12 * b.m11 + a.m22 * b.m12 + a.m32 * b.m13 + a.m42 * b.m14; |
||
| 405 | float result22 = a.m12 * b.m21 + a.m22 * b.m22 + a.m32 * b.m23 + a.m42 * b.m24; |
||
| 406 | float result32 = a.m12 * b.m31 + a.m22 * b.m32 + a.m32 * b.m33 + a.m42 * b.m34; |
||
| 407 | float result42 = a.m12 * b.m41 + a.m22 * b.m42 + a.m32 * b.m43 + a.m42 * b.m44; |
||
| 408 | float result13 = a.m13 * b.m11 + a.m23 * b.m12 + a.m33 * b.m13 + a.m43 * b.m14; |
||
| 409 | float result23 = a.m13 * b.m21 + a.m23 * b.m22 + a.m33 * b.m23 + a.m43 * b.m24; |
||
| 410 | float result33 = a.m13 * b.m31 + a.m23 * b.m32 + a.m33 * b.m33 + a.m43 * b.m34; |
||
| 411 | float result43 = a.m13 * b.m41 + a.m23 * b.m42 + a.m33 * b.m43 + a.m43 * b.m44; |
||
| 412 | float result14 = a.m14 * b.m11 + a.m24 * b.m12 + a.m34 * b.m13 + a.m44 * b.m14; |
||
| 413 | float result24 = a.m14 * b.m21 + a.m24 * b.m22 + a.m34 * b.m23 + a.m44 * b.m24; |
||
| 414 | float result34 = a.m14 * b.m31 + a.m24 * b.m32 + a.m34 * b.m33 + a.m44 * b.m34; |
||
| 415 | float result44 = a.m14 * b.m41 + a.m24 * b.m42 + a.m34 * b.m43 + a.m44 * b.m44; |
||
| 416 | result.m11 = result11; |
||
| 417 | result.m21 = result21; |
||
| 418 | result.m31 = result31; |
||
| 419 | result.m41 = result41; |
||
| 420 | result.m12 = result12; |
||
| 421 | result.m22 = result22; |
||
| 422 | result.m32 = result32; |
||
| 423 | result.m42 = result42; |
||
| 424 | result.m13 = result13; |
||
| 425 | result.m23 = result23; |
||
| 426 | result.m33 = result33; |
||
| 427 | result.m43 = result43; |
||
| 428 | result.m14 = result14; |
||
| 429 | result.m24 = result24; |
||
| 430 | result.m34 = result34; |
||
| 431 | result.m44 = result44; |
||
| 432 | } |
||
| 433 | |||
| 434 | static public Matrix4 multiply(Matrix4 a, Matrix4 b) |
||
| 435 | { |
||
| 436 | Matrix4 result = new Matrix4(); |
||
| 437 | multiply(result, a, b); |
||
| 438 | return result; |
||
| 439 | } |
||
| 440 | |||
| 441 | static public Matrix4 createIdentity() |
||
| 442 | { |
||
| 443 | return createScale(1.0f, 1.0f, 1.0f); |
||
| 444 | } |
||
| 445 | |||
| 446 | static public Matrix4 createScale(float sx, float sy, float sz) |
||
| 447 | { |
||
| 448 | Matrix4 result = new Matrix4(); |
||
| 449 | |||
| 450 | result.m11 = sx; |
||
| 451 | result.m22 = sy; |
||
| 452 | result.m33 = sz; |
||
| 453 | result.m44 = 1.0f; |
||
| 454 | |||
| 455 | return result; |
||
| 456 | } |
||
| 457 | |||
| 458 | static public Matrix4 createScale(Vector3 scale) |
||
| 459 | { |
||
| 460 | return createScale(scale.x, scale.y, scale.z); |
||
| 461 | } |
||
| 462 | |||
| 463 | static public Matrix4 createScale(float s) |
||
| 464 | { |
||
| 465 | return createScale(s, s, s); |
||
| 466 | } |
||
| 467 | |||
| 468 | static public Matrix4 createRotationX(float degrees) |
||
| 469 | { |
||
| 470 | float degreesrad = MathUtil.degToRad(degrees); |
||
| 471 | float sinvalue = (float)Math.sin(degreesrad); |
||
| 472 | float cosvalue = (float)Math.cos(degreesrad); |
||
| 473 | |||
| 474 | Matrix4 matrix = createIdentity(); |
||
| 475 | matrix.m22 = cosvalue; |
||
| 476 | matrix.m32 = -sinvalue; |
||
| 477 | matrix.m23 = sinvalue; |
||
| 478 | matrix.m33 = cosvalue; |
||
| 479 | return matrix; |
||
| 480 | } |
||
| 481 | |||
| 482 | static public Matrix4 createRotationY(float degrees) |
||
| 483 | { |
||
| 484 | float degreesrad = MathUtil.degToRad(degrees); |
||
| 485 | float sinvalue = (float)Math.sin(degreesrad); |
||
| 486 | float cosvalue = (float)Math.cos(degreesrad); |
||
| 487 | |||
| 488 | Matrix4 matrix = createIdentity(); |
||
| 489 | matrix.m11 = cosvalue; |
||
| 490 | matrix.m31 = sinvalue; |
||
| 491 | matrix.m13 = -sinvalue; |
||
| 492 | matrix.m33 = cosvalue; |
||
| 493 | return matrix; |
||
| 494 | } |
||
| 495 | |||
| 496 | static public Matrix4 createRotationZ(float degrees) |
||
| 497 | { |
||
| 498 | float degreesrad = MathUtil.degToRad(degrees); |
||
| 499 | float sinvalue = (float)Math.sin(degreesrad); |
||
| 500 | float cosvalue = (float)Math.cos(degreesrad); |
||
| 501 | |||
| 502 | Matrix4 matrix = createIdentity(); |
||
| 503 | matrix.m11 = cosvalue; |
||
| 504 | matrix.m21 = -sinvalue; |
||
| 505 | matrix.m12 = sinvalue; |
||
| 506 | matrix.m22 = cosvalue; |
||
| 507 | return matrix; |
||
| 508 | } |
||
| 509 | |||
| 510 | static public Matrix4 createRotation(Vector3 axis, float degrees) |
||
| 511 | { |
||
| 512 | float radangle = MathUtil.degToRad(degrees); |
||
| 513 | float radcos = (float)Math.cos(radangle); |
||
| 514 | float radsin = (float)Math.sin(radangle); |
||
| 515 | |||
| 516 | Matrix4 matrix = createIdentity(); |
||
| 517 | matrix.m11 = radcos + axis.x * axis.x * (1 - radcos); |
||
| 518 | matrix.m21 = axis.z * radsin + axis.y * axis.x * (1 - radcos); |
||
| 519 | matrix.m31 = -axis.y * radsin + axis.z * axis.x * (1 - radcos); |
||
| 520 | matrix.m12 = -axis.z * radsin + axis.x * axis.y * (1 - radcos); |
||
| 521 | matrix.m22 = radcos + axis.y * axis.y * (1 - radcos); |
||
| 522 | matrix.m32 = axis.x * radsin + axis.z * axis.y * (1 - radcos); |
||
| 523 | matrix.m13 = axis.y * radsin + axis.x * axis.z * (1 - radcos); |
||
| 524 | matrix.m23 = -axis.x * radsin + axis.y * axis.z * (1 - radcos); |
||
| 525 | matrix.m33 = radcos + axis.z * axis.z * (1 - radcos); |
||
| 526 | matrix.m44 = 1.0f; |
||
| 527 | return matrix; |
||
| 528 | } |
||
| 529 | |||
| 530 | static public Matrix4 createTranslation(float x, float y, float z) |
||
| 531 | { |
||
| 532 | Matrix4 result = new Matrix4(); |
||
| 230 | chris | 533 | /*result.m11 = 1.0f; result.m21 = 0.0f; result.m31 = 0.0f; result.m41 = x; |
| 534 | result.m12 = 0.0f; result.m22 = 1.0f; result.m32 = 0.0f; result.m42 = y; |
||
| 535 | result.m13 = 0.0f; result.m23 = 0.0f; result.m33 = 1.0f; result.m43 = z; |
||
| 536 | result.m14 = 0.0f; result.m24 = 0.0f; result.m34 = 0.0f; result.m44 = 1.0f;*/ |
||
| 537 | result.m11 = 1.0f; result.m21 = 0.0f; result.m31 = 0.0f; result.m41 = 0.0f; |
||
| 538 | result.m12 = 0.0f; result.m22 = 1.0f; result.m32 = 0.0f; result.m42 = 0.0f; |
||
| 539 | result.m13 = 0.0f; result.m23 = 0.0f; result.m33 = 1.0f; result.m43 = 0.0f; |
||
| 540 | result.m14 = x; result.m24 = y; result.m34 = z; result.m44 = 1.0f; |
||
| 200 | chris | 541 | return result; |
| 542 | } |
||
| 543 | |||
| 544 | static public Matrix4 createTranslation(Vector3 translate) |
||
| 545 | { |
||
| 546 | return createTranslation(translate.x, translate.y, translate.z); |
||
| 547 | } |
||
| 548 | |||
| 549 | static public Matrix4 createFromVectors(Vector3 forward, Vector3 up, Vector3 right) |
||
| 550 | { |
||
| 551 | forward.normalize(); |
||
| 552 | up.normalize(); |
||
| 553 | right.normalize(); |
||
| 554 | |||
| 555 | Matrix4 result = createIdentity(); |
||
| 556 | |||
| 557 | result.m11 = right.x; |
||
| 558 | result.m12 = right.y; |
||
| 559 | result.m13 = right.z; |
||
| 560 | result.m21 = up.x; |
||
| 561 | result.m22 = up.y; |
||
| 562 | result.m23 = up.z; |
||
| 563 | result.m31 = -forward.x; |
||
| 564 | result.m32 = -forward.y; |
||
| 565 | result.m33 = -forward.z; |
||
| 566 | result.m44 = 1.0f; |
||
| 567 | |||
| 568 | return result; |
||
| 569 | } |
||
| 570 | |||
| 571 | static public Matrix4 createPerspective(float fovDegreesY, float aspect, float zNear, float zFar) |
||
| 572 | { |
||
| 573 | float f = 1.0f / (float) Math.tan(fovDegreesY * (Math.PI / 360.0)); |
||
| 574 | float rangeReciprocal = 1.0f / (zNear - zFar); |
||
| 575 | |||
| 576 | Matrix4 result = new Matrix4(); |
||
| 577 | |||
| 578 | result.m11 = f / aspect; |
||
| 579 | result.m21 = 0.0f; |
||
| 580 | result.m31 = 0.0f; |
||
| 581 | result.m41 = 0.0f; |
||
| 582 | |||
| 583 | result.m12 = 0.0f; |
||
| 584 | result.m22 = f; |
||
| 585 | result.m32 = 0.0f; |
||
| 586 | result.m42 = 0.0f; |
||
| 587 | |||
| 588 | result.m13 = 0.0f; |
||
| 589 | result.m23 = 0.0f; |
||
| 590 | result.m33 = (zFar + zNear) * rangeReciprocal; |
||
| 591 | result.m43 = -1.0f; |
||
| 592 | |||
| 593 | result.m14 = 0.0f; |
||
| 594 | result.m24 = 0.0f; |
||
| 595 | result.m34 = 2.0f * zFar * zNear * rangeReciprocal; |
||
| 596 | result.m44 = 0.0f; |
||
| 597 | |||
| 598 | return result; |
||
| 599 | } |
||
| 600 | |||
| 601 | static public Matrix4 createFrustum(float left, float right, float bottom, float top, float near, float far) |
||
| 602 | { |
||
| 603 | if (left == right) |
||
| 604 | { |
||
| 605 | throw new IllegalArgumentException("left == right"); |
||
| 606 | } |
||
| 607 | if (top == bottom) |
||
| 608 | { |
||
| 609 | throw new IllegalArgumentException("top == bottom"); |
||
| 610 | } |
||
| 611 | if (near == far) |
||
| 612 | { |
||
| 613 | throw new IllegalArgumentException("near == far"); |
||
| 614 | } |
||
| 615 | if (near <= 0.0f) |
||
| 616 | { |
||
| 617 | throw new IllegalArgumentException("near <= 0.0f"); |
||
| 618 | } |
||
| 619 | if (far <= 0.0f) |
||
| 620 | { |
||
| 621 | throw new IllegalArgumentException("far <= 0.0f"); |
||
| 622 | } |
||
| 623 | |||
| 624 | final float r_width = 1.0f / (right - left); |
||
| 625 | final float r_height = 1.0f / (top - bottom); |
||
| 626 | final float r_depth = 1.0f / (near - far); |
||
| 627 | final float x = 2.0f * (near * r_width); |
||
| 628 | final float y = 2.0f * (near * r_height); |
||
| 629 | final float A = 2.0f * ((right + left) * r_width); |
||
| 630 | final float B = (top + bottom) * r_height; |
||
| 631 | final float C = (far + near) * r_depth; |
||
| 632 | final float D = 2.0f * (far * near * r_depth); |
||
| 633 | |||
| 634 | Matrix4 r = new Matrix4(); |
||
| 635 | |||
| 636 | r.m11 = x; |
||
| 637 | r.m21 = 0.0f; |
||
| 638 | r.m31 = 0.0f; |
||
| 639 | r.m41 = 0.0f; |
||
| 640 | |||
| 641 | r.m12 = 0.0f; |
||
| 642 | r.m22 = y; |
||
| 643 | r.m32 = 0.0f; |
||
| 644 | r.m42 = 0.0f; |
||
| 645 | |||
| 646 | r.m13 = A; |
||
| 647 | r.m23 = B; |
||
| 648 | r.m33 = C; |
||
| 649 | r.m43 = -1.0f; |
||
| 650 | |||
| 651 | r.m14 = 0.0f; |
||
| 652 | r.m24 = 0.0f; |
||
| 653 | r.m34 = D; |
||
| 654 | r.m44 = 0.0f; |
||
| 655 | |||
| 656 | return r; |
||
| 230 | chris | 657 | } |
| 200 | chris | 658 | |
| 230 | chris | 659 | |
| 660 | static public Matrix4 createOrtho(float left, float right, float bottom, float top, float near, float far) |
||
| 661 | { |
||
| 662 | Matrix4 r = new Matrix4(); |
||
| 200 | chris | 663 | |
| 230 | chris | 664 | if (left == right) |
| 665 | throw new IllegalArgumentException("left and right must not be identical!"); |
||
| 200 | chris | 666 | |
| 230 | chris | 667 | if (bottom == top) |
| 668 | throw new IllegalArgumentException("bottom and top must not be identical!"); |
||
| 200 | chris | 669 | |
| 230 | chris | 670 | if (near == far) |
| 671 | throw new IllegalArgumentException("near and far must not be identical!"); |
||
| 672 | |||
| 673 | final float r_width = 1.0f / (right - left); |
||
| 674 | final float r_height = 1.0f / (top - bottom); |
||
| 675 | final float r_depth = 1.0f / (far - near); |
||
| 676 | final float x = 2.0f * (r_width); |
||
| 677 | final float y = 2.0f * (r_height); |
||
| 678 | final float z = -2.0f * (r_depth); |
||
| 679 | final float tx = -(right + left) * r_width; |
||
| 680 | final float ty = -(top + bottom) * r_height; |
||
| 681 | final float tz = -(far + near) * r_depth; |
||
| 682 | |||
| 683 | |||
| 684 | /* m[mOffset + 0] = x; |
||
| 685 | m[mOffset + 5] = y; |
||
| 686 | m[mOffset +10] = z; |
||
| 687 | m[mOffset +12] = tx; |
||
| 688 | m[mOffset +13] = ty; |
||
| 689 | m[mOffset +14] = tz; |
||
| 690 | m[mOffset +15] = 1.0f; |
||
| 691 | m[mOffset + 1] = 0.0f; |
||
| 692 | m[mOffset + 2] = 0.0f; |
||
| 693 | m[mOffset + 3] = 0.0f; |
||
| 694 | m[mOffset + 4] = 0.0f; |
||
| 695 | m[mOffset + 6] = 0.0f; |
||
| 696 | m[mOffset + 7] = 0.0f; |
||
| 697 | m[mOffset + 8] = 0.0f; |
||
| 698 | m[mOffset + 9] = 0.0f; |
||
| 699 | m[mOffset + 11] = 0.0f;*/ |
||
| 700 | |||
| 701 | r.m11 = x; r.m21 = 0.0f; r.m31 = 0.0f; r.m41 = 0.0f; |
||
| 702 | r.m12 = 0.0f; r.m22 = y; r.m32 = 0.0f; r.m42 = 0.0f; |
||
| 703 | r.m13 = 0.0f; r.m23 = 0.0f; r.m33 = z; r.m43 = 0.0f; |
||
| 704 | r.m14 = tx; r.m24 = ty; r.m34 = tz; r.m44 = 1.0f; |
||
| 705 | |||
| 706 | return r; |
||
| 707 | } |
||
| 200 | chris | 708 | /* m[0] = m11; m[1] = m21; m[2] = m31; m[3] = m41; |
| 230 | chris | 709 | m[4] = m12; m[5] = m22; m[6] = m32; m[7] = m42; |
| 710 | m[8] = m13; m[9] = m23; m[10] = m33; m[11] = m43; |
||
| 711 | m[12] = m14; m[13] = m24; m[14] = m34; m[15] = m44;*/ |
||
| 200 | chris | 712 | |
| 713 | static public Matrix4 createLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) |
||
| 714 | { |
||
| 715 | float fx = centerX - eyeX; |
||
| 716 | float fy = centerY - eyeY; |
||
| 717 | float fz = centerZ - eyeZ; |
||
| 718 | |||
| 719 | // Normalize f |
||
| 720 | float rlf = 1.0f / Vector3.length(fx, fy, fz); |
||
| 721 | fx *= rlf; |
||
| 722 | fy *= rlf; |
||
| 723 | fz *= rlf; |
||
| 724 | |||
| 725 | // compute s = f x up (x means "cross product") |
||
| 726 | float sx = fy * upZ - fz * upY; |
||
| 727 | float sy = fz * upX - fx * upZ; |
||
| 728 | float sz = fx * upY - fy * upX; |
||
| 729 | |||
| 730 | // and normalize s |
||
| 731 | float rls = 1.0f / Vector3.length(sx, sy, sz); |
||
| 732 | sx *= rls; |
||
| 733 | sy *= rls; |
||
| 734 | sz *= rls; |
||
| 735 | |||
| 736 | // compute u = s x f |
||
| 737 | float ux = sy * fz - sz * fy; |
||
| 738 | float uy = sz * fx - sx * fz; |
||
| 739 | float uz = sx * fy - sy * fx; |
||
| 740 | |||
| 741 | Matrix4 r = new Matrix4(); |
||
| 742 | |||
| 743 | r.m11 = sx; |
||
| 744 | r.m21 = ux; |
||
| 745 | r.m31 = -fx; |
||
| 746 | r.m41 = 0.0f; |
||
| 747 | |||
| 748 | r.m12 = sy; |
||
| 749 | r.m22 = uy; |
||
| 750 | r.m32 = -fy; |
||
| 751 | r.m42 = 0.0f; |
||
| 752 | |||
| 753 | r.m13 = sz; |
||
| 754 | r.m23 = uz; |
||
| 755 | r.m33 = -fz; |
||
| 756 | r.m43 = 0.0f; |
||
| 757 | |||
| 758 | r.m14 = 0.0f; |
||
| 759 | r.m24 = 0.0f; |
||
| 760 | r.m34 = 0.0f; |
||
| 761 | r.m44 = 1.0f; |
||
| 762 | |||
| 763 | r.m14 = r.m11 * -eyeX + r.m12 * -eyeY + r.m13 * -eyeZ + r.m14; |
||
| 764 | r.m24 = r.m21 * -eyeX + r.m22 * -eyeY + r.m23 * -eyeZ + r.m24; |
||
| 765 | r.m34 = r.m31 * -eyeX + r.m32 * -eyeY + r.m33 * -eyeZ + r.m34; |
||
| 766 | r.m44 = r.m41 * -eyeX + r.m42 * -eyeY + r.m43 * -eyeZ + r.m44; |
||
| 767 | |||
| 768 | return r; |
||
| 769 | } |
||
| 770 | |||
| 771 | public Vector3 transform(Vector3 vector) |
||
| 772 | { |
||
| 773 | |||
| 774 | return new Vector3( |
||
| 775 | m11 * vector.x + m21 * vector.y + m31 * vector.z + m41, |
||
| 776 | m12 * vector.x + m22 * vector.y + m32 * vector.z + m42, |
||
| 777 | m13 * vector.x + m23 * vector.y + m33 * vector.z + m43); |
||
| 778 | } |
||
| 779 | |||
| 780 | public Vector4 transform(Vector4 vector) |
||
| 781 | { |
||
| 782 | return new Vector4( |
||
| 783 | m11 * vector.x + m21 * vector.y + m31 * vector.z + m41 * vector.w, |
||
| 784 | m12 * vector.x + m22 * vector.y + m32 * vector.z + m42 * vector.w, |
||
| 785 | m13 * vector.x + m23 * vector.y + m33 * vector.z + m43 * vector.w, |
||
| 786 | m14 * vector.x + m24 * vector.y + m34 * vector.z + m44 * vector.w); |
||
| 787 | } |
||
| 788 | |||
| 789 | static public void interpolate(Matrix4 result, Matrix4 a, Matrix4 b, float ratio) |
||
| 790 | { |
||
| 791 | result.m11 = a.m11 + (b.m11 - a.m11) * ratio; |
||
| 792 | result.m21 = a.m21 + (b.m21 - a.m21) * ratio; |
||
| 793 | result.m31 = a.m31 + (b.m31 - a.m31) * ratio; |
||
| 794 | result.m41 = a.m41 + (b.m41 - a.m41) * ratio; |
||
| 795 | result.m12 = a.m12 + (b.m12 - a.m12) * ratio; |
||
| 796 | result.m22 = a.m22 + (b.m22 - a.m22) * ratio; |
||
| 797 | result.m32 = a.m32 + (b.m32 - a.m32) * ratio; |
||
| 798 | result.m42 = a.m42 + (b.m42 - a.m42) * ratio; |
||
| 799 | result.m13 = a.m13 + (b.m13 - a.m13) * ratio; |
||
| 800 | result.m23 = a.m23 + (b.m23 - a.m23) * ratio; |
||
| 801 | result.m33 = a.m33 + (b.m33 - a.m33) * ratio; |
||
| 802 | result.m43 = a.m43 + (b.m43 - a.m43) * ratio; |
||
| 803 | result.m14 = a.m14 + (b.m14 - a.m14) * ratio; |
||
| 804 | result.m24 = a.m24 + (b.m24 - a.m24) * ratio; |
||
| 805 | result.m34 = a.m34 + (b.m34 - a.m34) * ratio; |
||
| 806 | result.m44 = a.m44 + (b.m44 - a.m44) * ratio; |
||
| 807 | } |
||
| 808 | |||
| 809 | static public Matrix4 interpolate(Matrix4 a, Matrix4 b, float ratio) |
||
| 810 | { |
||
| 811 | Matrix4 result = createIdentity(); |
||
| 812 | interpolate(result, a, b, ratio); |
||
| 813 | return result; |
||
| 814 | } |
||
| 815 | |||
| 816 | public Vector3 getForwardVector() |
||
| 817 | { |
||
| 818 | Vector3 forward = new Vector3(-m31, -m32, -m33); |
||
| 819 | forward.normalize(); |
||
| 820 | return forward; |
||
| 821 | } |
||
| 822 | |||
| 823 | public Vector3 getUpVector() |
||
| 824 | { |
||
| 825 | Vector3 up = new Vector3(m21, m22, m23); |
||
| 826 | up.normalize(); |
||
| 827 | return up; |
||
| 828 | } |
||
| 829 | |||
| 830 | public Vector3 getRightVector() |
||
| 831 | { |
||
| 832 | Vector3 right = new Vector3(m11, m12, m13); |
||
| 833 | right.normalize(); |
||
| 834 | return right; |
||
| 835 | } |
||
| 836 | |||
| 837 | public float[] toGLMatrix() |
||
| 838 | { |
||
| 839 | float[] m = new float[16]; |
||
| 840 | |||
| 841 | m[0] = m11; m[1] = m21; m[2] = m31; m[3] = m41; |
||
| 842 | m[4] = m12; m[5] = m22; m[6] = m32; m[7] = m42; |
||
| 843 | m[8] = m13; m[9] = m23; m[10] = m33; m[11] = m43; |
||
| 844 | m[12] = m14; m[13] = m24; m[14] = m34; m[15] = m44; |
||
| 845 | |||
| 846 | return m; |
||
| 847 | } |
||
| 848 | |||
| 849 | public void fromGLMatrix(float[] m) |
||
| 850 | { |
||
| 851 | m11 = m[0]; m21 = m[1]; m31 = m[2]; m41 = m[3]; |
||
| 852 | m12 = m[4]; m22 = m[5]; m32 = m[6]; m42 = m[7]; |
||
| 853 | m13 = m[8]; m23 = m[9]; m33 = m[10]; m43 = m[11]; |
||
| 854 | m14 = m[12]; m24 = m[13]; m34 = m[14]; m44 = m[15]; |
||
| 855 | } |
||
| 856 | |||
| 205 | chris | 857 | public FloatBuffer toFloatBuffer() |
| 858 | { |
||
| 215 | chris | 859 | FloatBuffer buffer = BufferUtils.newFloatBuffer(16); |
| 205 | chris | 860 | |
| 861 | buffer.put(m11); buffer.put(m21); buffer.put(m31); buffer.put(m41); |
||
| 862 | buffer.put(m12); buffer.put(m22); buffer.put(m32); buffer.put(m42); |
||
| 863 | buffer.put(m13); buffer.put(m23); buffer.put(m33); buffer.put(m43); |
||
| 864 | buffer.put(m14); buffer.put(m24); buffer.put(m34); buffer.put(m44); |
||
| 865 | |||
| 866 | return buffer; |
||
| 867 | } |
||
| 200 | chris | 868 | } |
| 869 | |||
| 870 |