diff options
-rw-r--r-- | src/v/D3.java | 80 | ||||
-rw-r--r-- | src/v/VMaths.java | 5 |
2 files changed, 75 insertions, 10 deletions
diff --git a/src/v/D3.java b/src/v/D3.java index dabffec..92c8cfe 100644 --- a/src/v/D3.java +++ b/src/v/D3.java @@ -37,9 +37,9 @@ public class D3 static final float DEGREES_PER_SECOND = 50f / 1000f; static final float DEGREES_PER_SECOND_PER_SECOND = DEGREES_PER_SECOND; - static float[] xs = new float[8 + 6]; - static float[] ys = new float[8 + 6]; - static float[] zs = new float[8 + 6]; + static float[] xs = new float[8 + 6 + 3]; + static float[] ys = new float[8 + 6 + 3]; + static float[] zs = new float[8 + 6 + 3]; static float[] normal_xs = {0f, 0f, 1f, -1f, 0f, 0f}; static float[] normal_ys = {1f, 0f, 0f, 0f, 0f, -1f}; @@ -60,15 +60,12 @@ public class D3 static float[][] Pm = UNIT; static boolean sreset = false; + static boolean camera_to_rotation = false; + static boolean rotation_to_camera = false; public static void main(String... args) throws InterruptedException { - for (int i = 0; i < 8; i++) - { - xs[i] = ((i & 1) != 0 ? 1f : 0f) - 0.5f; - ys[i] = ((i & 2) != 0 ? 1f : 0f) - 0.5f; - zs[i] = ((i & 4) != 0 ? 1f : 0f) - 0.5f; - } + resetRotation(); xs[8] = +1; xs[11] = -1; ys[9] = +1; ys[12] = -1; @@ -277,6 +274,10 @@ public class D3 case KeyEvent.VK_F: rg = +1; break; case KeyEvent.VK_C: rg = -1; break; + case KeyEvent.VK_X: + rotation_to_camera = true; + break; + case KeyEvent.VK_R: rotation_speed = 0; break; @@ -291,6 +292,10 @@ public class D3 case KeyEvent.VK_E: srxy = +v; break; case KeyEvent.VK_Q: srxy = -v; break; + case KeyEvent.VK_X: + camera_to_rotation = true; + break; + case KeyEvent.VK_R: sreset = true; break; @@ -302,10 +307,17 @@ public class D3 { Thread.sleep(50); + if (camera_to_rotation) + { + transform(on_inv(Pm)); + camera_to_rotation = false; + sreset = true; + } + if (sreset) { Pm = UNIT; - for (int i = 8; i < 8 + 12; i++) + for (int i = 8; i < 8 + 6; i++) xs[i] = ys[i] = zs[i] = 0; xs[8] = +1; xs[11] = -1; ys[9] = +1; ys[12] = -1; @@ -313,6 +325,12 @@ public class D3 sreset = false; } + if (rotation_to_camera) + { + stransform(resetRotation()); + rotation_to_camera = false; + } + if (rx * rx == 1) { float[] v = mul(rx * SPEED, createRotation("x", Pm)); @@ -368,6 +386,40 @@ public class D3 } + public static float[][] resetRotation() + { + float[][] r = new float[3][3]; + + r[0][0] = xs[14]; + r[1][0] = ys[14]; + r[2][0] = zs[14]; + + r[0][1] = xs[15]; + r[1][1] = ys[15]; + r[2][1] = zs[15]; + + r[0][2] = xs[16]; + r[1][2] = ys[16]; + r[2][2] = zs[16]; + + for (int i = 0; i < 8; i++) + { + xs[i] = ((i & 1) != 0 ? 1f : 0f) - 0.5f; + ys[i] = ((i & 2) != 0 ? 1f : 0f) - 0.5f; + zs[i] = ((i & 4) != 0 ? 1f : 0f) - 0.5f; + } + xs[14] = xs[15] = xs[16] = 0; + ys[14] = ys[15] = ys[16] = 0; + zs[14] = zs[15] = zs[16] = 0; + xs[14] = ys[15] = zs[16] = 1; + + normal_xs = new float[] {0f, 0f, 1f, -1f, 0f, 0f}; + normal_ys = new float[] {1f, 0f, 0f, 0f, 0f, -1f}; + normal_zs = new float[] {0f, 1f, 0f, 0f, -1f, 0f}; + + return r; + } + public static void transform(float[][] m) { /* This is not a transformation of the object, but @@ -382,6 +434,14 @@ public class D3 zs[i] = v[2]; } + for (int i = 8 + 6; i < 8 + 6 + 3; i++) + { + float[] v = mul(m, xs[i], ys[i], zs[i]); + xs[i] = v[0]; + ys[i] = v[1]; + zs[i] = v[2]; + } + for (int i = 0; i < 6; i++) { float[] v = mul(m, normal_xs[i], normal_ys[i], normal_zs[i]); diff --git a/src/v/VMaths.java b/src/v/VMaths.java index d52c12a..6e60af5 100644 --- a/src/v/VMaths.java +++ b/src/v/VMaths.java @@ -226,6 +226,11 @@ public class VMaths return rc; } + public static float[][] on_inv(float[][] m) + { + return trans(m); + } + public static float[][] inv(float[][] m) { return mul(1f / det(m), trans(m)); |