Hello,
I’m trying to use the setWalkDirection method for moving my Character in my game.
What I want to do is : Making one of my character move from point A to point B in an exact amount of time.
For what I’ve understood, the speed of the character will depends of the direction vector given in argument to the method setWalkDirection(…).
But I dont know how this speed is calculated.
I’ve tried several things and the one which seem the nearest to what I want is :
[java]
float timeInSecond = (float)timeNeeded / 1000f;
Vector3f direction = new Vector3f( ( step.getDestination().getX() - currentPos.getX() ) / timeInSecond / 60.0f,
( step.getDestination().getY() - currentPos.getY() ) / timeInSecond / 60.0f ,
( step.getDestination().getZ() - currentPos.getZ() ) / timeInSecond / 60.0f ); // Why 60 ? Still asking myself !! TODO
physicNode.setWalkDirection( direction );
//Look at correct direction
Quaternion modelRotation = new Quaternion();
Vector3f look = new Vector3f( direction.getX() * 100000,
0 ,
direction.getZ() * 100000 ); //In order to look to the horizon
modelRotation.lookAt( look, Vector3f.UNIT_Y);
character.getSpatialNode().setLocalRotation( modelRotation );
if( moveAnimationChannel == null || moveAnimationChannel.getAnimationName() == null || ! moveAnimationChannel.getAnimationName().equals( “Walk” ) )
{
moveAnimationChannel.setAnim( “Walk” );
moveAnimationChannel.setLoopMode( LoopMode.Loop );
moveAnimationChannel.setSpeed( 0.5f );
}
[/java]
Can someone explain me how this speed is calculated ?
Thanks in advance
PS :
I’m trying to create a method like moveFromPointToPoint( origin, destination, timeToReachDestination )
If someone know a method in the API that do the same thing. Well, please don’t hide it
The speed should be m/s where 1m=1unit in the physics.
And how does it works?
[java]
physicNode.setWalkDirection( new Vector3f( 1, 1, 1 ) );
[/java]
Each second, it goes 1 meter on the X, Y and Z coordinates?
Edit :
It is more like meter / minute
Here is a test I’ve done :
Move : From : 14.5, 0.055692673, 14.5
Move : To : 14.5, 0.0, 15.5
Move : Direction : (0.0, -9.282112E-4, 0.016666668)
It takes 1 second to reach ( 14.5, 0.0, 15.5 ).
I you go downwards its surely gonna take some time (0/-9/0.01)?? The length of the vector is the speed in m/s.
Well int fact, it is ( 0, 0.0009, 0.0166 ).
So nearly ( 0, 0, 1/60 )
length ~= 1/60 → 1 unit done in one second
Uhm, I dont know, when I set the vector to 1,0,0 it pretty much moves with one unit per second I think…
Erf!!
Can there be other parameters that need to be taken into account when calculating this ?
Like the
[java]
character.setGravity(…)
[/java]
or a
[java]
character.setCcdMotionThreshold(…)
[/java]
My physics nodes where build from scaled Model. Does that impact something ?
Dont think so, no
Strange.
Well it works with a factor ( 1 / 60 ) on my computer. I will stay with that for the moment.
I’m not working with the last nighly build ( 11 / 16 / 2010 ) so I will se if it changes on my next update.
Thank you for your answers
You say a vector of 0,0,1/60 moves your character 1 unit per second?
Edit: I saw I scale the vector down afterwards in the test, so it might be the vector is physics-fps dependent, explaining the factor.
Yes.
I’ve calculated it with the tpf of the method ‘simpleUpdate’ or via an external timer.
I will print you a log.
Current position : (14.5, 0.055692673, 14.5)
Walk direction : (0.0, -9.282112E-4, 0.016666668)
Time since last action : 0.1038125
Time since last action : 0.20265624
Time since last action : 0.29384375
Time since last action : 0.39371875
Time since last action : 0.49712503
Time since last action : 0.5951562
Time since last action : 0.695375
Time since last action : 0.7963126
Time since last action : 0.8960937
Time since last action : 0.9948126
Current position : (14.499998, 0.0, 15.48332)
Walk direction : (3.1789146E-8, 0.0, 0.016944664)
Time since last action : 0.10309376
Time since last action : 0.20193751
Time since last action : 0.301
Time since last action : 0.40021864
Time since last action : 0.49940616
Time since last action : 0.6012811
Time since last action : 0.69921875
Time since last action : 0.8005626
Time since last action : 0.9012812
Time since last action : 1.0004374
Current position : (14.499998, 0.0, 16.499737)
So each second, the character has moved 1 unit on Z coordinate. So walkDirection is nearly ( 0, 0, 1/60 )
Ok, cool so you solved the mystery of the Character speed (see my edit above)
Cool, I will stick with that then.