Normand Briere
2019-09-17 d248db5fc21c4b0ab24968974e5e590f413ef8fc
Camera.java
....@@ -334,19 +334,29 @@
334334
335335 void RotateInterest(float dx, float dy)
336336 {
337
+ right.mul(-1);
338
+
337339 cStatic.point1.set(location);
338340 location.set(lookAt);
339341 lookAt.set(cStatic.point1);
340
- right.mul(-1);
342
+
343
+ cStatic.point1.set(locationBuf);
344
+ locationBuf.set(lookAtBuf);
345
+ lookAtBuf.set(cStatic.point1);
341346 // UP.mul(-1);
342347
343348 RotatePosition(dx,-dy);
344349
345350 // UP.mul(-1);
346351 right.mul(-1);
352
+
347353 cStatic.point1.set(location);
348354 location.set(lookAt);
349355 lookAt.set(cStatic.point1);
356
+
357
+ cStatic.point1.set(locationBuf);
358
+ locationBuf.set(lookAtBuf);
359
+ lookAtBuf.set(cStatic.point1);
350360
351361 computeTransform();
352362 }
....@@ -361,17 +371,52 @@
361371 fromScreen = LA.newMatrix();
362372 }
363373
374
+ if (locationBuf == null)
375
+ {
376
+ locationBuf = new cVector();
377
+ locationBuf.set(location);
378
+ lookAtBuf = new cVector();
379
+ lookAtBuf.set(lookAt);
380
+ upBuf = new cVector();
381
+ upBuf.set(UP);
382
+// up2Buf = new cVector();
383
+// up2Buf.set(UP2);
384
+ }
385
+ else
386
+ {
387
+ double K = 0.25;
388
+
389
+ locationBuf.y = location.y * K + locationBuf.y * (1 - K);
390
+ lookAtBuf.y = lookAt.y * K + lookAtBuf.y * (1 - K);
391
+
392
+ upBuf.x = UP.x * K + upBuf.x * (1 - K);
393
+ upBuf.y = UP.y * K + upBuf.y * (1 - K);
394
+ upBuf.z = UP.z * K + upBuf.z * (1 - K);
395
+ upBuf.normalize();
396
+// up2Buf.x = UP2.x * K + up2Buf.x * (1 - K);
397
+// up2Buf.y = UP2.y * K + up2Buf.y * (1 - K);
398
+// up2Buf.z = UP2.z * K + up2Buf.z * (1 - K);
399
+
400
+ K = 1;
401
+
402
+ locationBuf.x = location.x * K + locationBuf.x * (1 - K);
403
+ locationBuf.z = location.z * K + locationBuf.z * (1 - K);
404
+ lookAtBuf.x = lookAt.x * K + lookAtBuf.x * (1 - K);
405
+ lookAtBuf.z = lookAt.z * K + lookAtBuf.z * (1 - K);
406
+ }
407
+
364408 cVector up2 = up;
365409 cVector right2 = right;
366410
367
- up2.x = UP.x;
368
- up2.y = UP.y;
369
- up2.z = UP.z;
370
- LA.vecSub(lookAt, location, away);
411
+ up2.x = upBuf.x;
412
+ up2.y = upBuf.y;
413
+ up2.z = upBuf.z;
414
+ LA.vecSub(lookAtBuf, locationBuf, away);
371415 LA.vecNormalize(away);
372416 LA.vecCross(away, up2, right2);
373417 if (right2.length2() < 0.0001)
374418 {
419
+ //System.out.println("right2.length2() < 0.0001");
375420 // UP failed
376421 up2.x = UP2.x;
377422 up2.y = UP2.y;
....@@ -381,6 +426,7 @@
381426 LA.vecCross(away, up2, right2);
382427 if (!(right2.length2() > 0))
383428 {
429
+ System.exit(0);
384430 // old problem...
385431 assert (right2.length2() <= 0 || right2.length2() > 0); // weirdest thing ever
386432 up2.x = UP.x = 0;
....@@ -410,10 +456,10 @@
410456 }
411457
412458 for (int i=0; i < 3; i++)
413
- fromScreen[3][i] = location.get(i);
459
+ fromScreen[3][i] = locationBuf.get(i);
414460
415461 for (int i=0; i < 3; i++)
416
- temp[3][i] = -location.get(i);
462
+ temp[3][i] = -locationBuf.get(i);
417463
418464 LA.matConcat(temp, toScreen, toScreen);
419465
....@@ -500,11 +546,20 @@
500546 static final int viewFront = 2;
501547 static final int viewSide = 3;
502548 int viewCode;
549
+
503550 cVector location;
504551 cVector lookAt;
552
+
553
+ transient cVector locationBuf;
554
+ transient cVector lookAtBuf;
555
+ transient cVector upBuf;
556
+ //transient cVector up2Buf;
557
+
505558 cVector direction;
559
+
506560 double[][] toScreen;
507561 double[][] fromScreen;
562
+
508563 boolean perspective;
509564 int hAspect = 0; // Free camera
510565 int vAspect;