jPCT-AE - a 3d engine for Android => Support => Topic started by: dfix on May 02, 2017, 04:13:53 am

Title: calcAngle returns "NaN"
Post by: dfix on May 02, 2017, 04:13:53 am
Hi, Can someone help me?

I am trying to calculate the angle between two vectors, but the only results I get are "NaN". I am sure it is something I am doing wrong...

Code: [Select]
 v=new SimpleVector(0,0,0);
ov=new SimpleVector(1,1,10);
float angle = v.calcAngle(ov);

The Android Monitor just outputs:

I/jPCT-AE: angle:NaN

Title: Re: calcAngle returns "NaN"
Post by: dfix on May 02, 2017, 04:24:16 am
Changing the first vector's Z value from 0 to a negative number returns a correct value;

Code: [Select]
                v=new SimpleVector(0f,0f,-10f);
                ov=new SimpleVector(0f,0f,10f);
Now I get:

I/jPCT-AE: angle:3.1415927

which I was expecting from 0 also

Is it impossible to calculate an angle with one vector having an absolute value of 0?
Title: Re: calcAngle returns "NaN"
Post by: EgonOlsen on May 02, 2017, 08:28:27 am
That method calculates the angle between two direction vectors starting at the origin. (0,0,0) is the origin. You can't calculate an angle between the origin (which is a point) and some direction vector. What is this supposed to even be?
Title: Re: calcAngle returns "NaN"
Post by: dfix on May 02, 2017, 12:05:14 pm
Yes, that makes sense,

I have an array of "jellyfish" that randomly move around the world, however, once they are a certain distance away, I need them to come back into the centre of the camera view.  I'm struggling to see how I can derive the correct rotation that points to the centre of the camera view.(the camera is static)

Code: [Select]
private void animate()
        if (aniFrame > 0)
            ind += INC_FRACTION * aniFrame;

            if (ind > 1) {
                ind -= 1;
                aniFrame = 0;
            for (int i = 0; i < jellyFishAmount; i++)
                jellyFishClones[i].animate(ind);                //apply the new animation frame
                movedDistance[i] += MOVE_SPEED;                 //increase the directional change
                if (roam[i]&&aniFrame%2==0)                     //only change direction every second call and if the jellyfish hasn't left the "safe area"
                if (centerVec.distance(jellyFishClones[i].getTranslation()) > 200f)
                    if (roam[i])
                        movedDistance[i] = 0;     
                    roam[i] = false;
                    if (centerVec.distance(jellyFishClones[i].getTranslation()) < 10f)
                        roam[i] = true;                         //set the jellyfish back to randomly roaming
                directionalVec[i] = jellyFishClones[i].getZAxis();         
Title: Re: calcAngle returns "NaN"
Post by: EgonOlsen on May 02, 2017, 12:21:07 pm
I think the best approach in this case is you keep track of the rotation angle yourself, if that's feasible, and then undo them for turning the fish. If that's not an option, you can calculate the angle between a fish's direction (most likely the z-axis) and the (0,0,-1) vector and use that angle.