FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Patch for fixing camera "spasms"

Post new topic   Reply to topic     Forum Index -> Yage
View previous topic :: View next topic  
Author Message

Joined: 21 Mar 2008
Posts: 2

PostPosted: Fri Mar 21, 2008 5:34 am    Post subject: Patch for fixing camera "spasms" Reply with quote

I've observed that when ever your view passes through the "south" line (i.e. 180degree turn from the start view) it would "spasm".

I traced the problem to the Spring class. My first impression is that it was going the long way around the circle line up the tail's angle(camera) and the head's angle(ship). However when added a fix for this I found that it still spasmed, although differently.

Looking closer I found that when it crossed the south the angle the angles produced by Matrix.toAxis() were widely different. Although the two angles are widely different, they are functionally very similar to a viewer but when interpolated between the difference becomes very obvious.

The solution I came up with was to convert the facing to Euler angles and do interpolation with those and convert them back into the transform.

This works well as far as I've tested but I can't help but feel there is a better solution to this.


Index: src/yage/util/spring.d
--- src/yage/util/spring.d      (revision 61)
+++ src/yage/util/spring.d      (working copy)
@@ -7,6 +7,7 @@
 module yage.util.spring;

 import std.stdio;
+import std.math;
 import yage.core.all;
 import yage.node.all;

@@ -54,10 +55,33 @@

        /// Update the position of the floater relative to what it's attached to.
        void update(float delta){
-               Vec3f h = head.getAbsoluteRotation();
-               Vec3f t = tail.getAbsoluteRotation();
-               tail.setRotation(Vec3f((t.x+h.x)/2, (t.y+h.y)/2, (t.z+h.z)/2));
+               float dt = delta * stiffness;
+               if(dt > 1) {
+                       dt = 1;
+               } else if (dt < 0) {
+                       dt = 0;
+               }

+               //This may break if h passes straight through directly "up" or "down"
+               Vec3f h = head.getAbsoluteTransform().toEuler();
+               Vec3f t = tail.getAbsoluteTransform().toEuler();
+               //Gets an angle that is amt ratio from angle a to angle b.
+               //Assumes a and b are 2*PI at most apart.
+               float midangle(float a, float b, float amt) {
+                       float d = b - a;
+                       if(d > PI) {
+                               d -= 2 * PI;
+                       } else if(d < -PI) {
+                               d += 2 * PI;
+                       }
+                       return a + d * amt;
+               }
+               Vec3f m = Vec3f(midangle(t.x, h.x, dt), midangle(t.y, h.y, dt), midangle(t.z, h.z, dt));
+               Matrix n;
+               n.setEuler(m);
+               tail.setRotation(n.toAxis());
                Vec3f dist = head.getAbsolutePosition() - tail.getAbsolutePosition() + distance.rotate(head.getAbsoluteTransform());
                Vec3f vel = dist.scale(min(stiffness, 1/delta)); // scale by 1/delta when framerate is low to prevent jerkiness.

Back to top
View user's profile Send private message

Joined: 29 Oct 2005
Posts: 294

PostPosted: Wed Apr 02, 2008 11:04 am    Post subject: Reply with quote

I noticed that also. It's actually a regression that came up when Deformative was converting the input system to a better implementation, a few revisions ago. Unfortunately my life's circumstances have made me busy every hour of every day and I don't have time for fun projects any more. I definitely want to continue Yage again someday though.

Didn't want to cast Deformative in a bad light, despite that one regression he's made significant contributions.
Back to top
View user's profile Send private message

Joined: 29 Oct 2005
Posts: 294

PostPosted: Tue May 13, 2008 7:25 pm    Post subject: Reply with quote

This is now fixed. You can check out my change in the Spring class in the repo. It's basically just reverting back to rev56 of the file, which has no angular interpolation for the tail of the spring, but I've found that things look just fine without it (at least to me).

I'm hoping I'll start having more time in the future to start working on Yage again, but time will tell.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic     Forum Index -> Yage All times are GMT - 6 Hours
Page 1 of 1

Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

Powered by phpBB © 2001, 2005 phpBB Group