Followers 0

Rotating Weapon Gradually To Look at Target Point

6 posts in this topic

I have a weapon mesh, how do I make it rotate GRADUALLY to look at the player (target)?

I want to update pitch, yaw, roll gradually and find out when the rotation is done.

Edited by Medo3337
0

Share on other sites

@Buckeye: If I have the target point that the weapon mesh should look at, how do I calculate finalQuat?

0

Share on other sites

The easiest way is to use linear interpolation:

Vector3 CurrentDirection = /* Get current direction */

Vector3 TargetDirection = /* Get target direction */

float Alpha = 0.5f; // Use smaller values for slower rotations (e.g. based on the weapon weight).

Vector3 NewDirection = ( 1.0f - Alpha ) * CurrentDirection + Alpha * TargetDirection;

This method has exponential decay (e.g. you multiply by 0.5 * 0.5 * 0.5 * ...) and rotates pretty fast against the target direction. A value of Alpha = 0.5 is pretty responsive and snappy which is what you very likely look for. This formula works best with constant time steps. If you have varying time steps you would need to multiply by the ratio of the current and last time step.

I tested some methods lately for something similar and this discrete evolution worked best for me. Though there are other good methods and L. Spiro suggestion will work great as well. I personally liked the exponential decay better than linear error reduction, but this is a matter of personal choice I guess.

HTH,

-Dirk

PS:

In order to update your current rotation you can compute the shortest arc quaternion between the current and new direction:

Quaternion Rotation = ShortestArc( CurrentDirection, NewDirection );

Quaternion NewOrientation = Roation * CurrentOrientation;

Stan Melax wrote a good article about this in Game Programming Gems 1. Google for shortest arc quaternion and you will find some implementations.

Edited by Dirk Gregorius
0

Share on other sites

@L. Spiro: How do I get pitch, yaw, roll from vRight, vUp, vForward?

How do I calculate the current target based on the gun position and the final target so I can rotate gradually?

0

Share on other sites
Why do you need yaw, roll, and pitch? If you need these it generally means you are doing it wrong.
Anyway, I already gave you the rotation matrix, so:
http://planning.cs.uiuc.edu/node103.html

Updating currentTarget (as an example):
#define MAX_UPDATE_DIST 2.0f
Vector vToTarget = (target - currentTarget);
Vector vAmountToMove = vToTarget;
vAmountToMove.Normalize();
vAmountToMove *= fDeltaTime;       // * is NOT dot-product, it is a regular per-component scalar multiply.
vAmountToMove *= MAX_UPDATE_DIST;  // * is NOT dot-product, it is a regular per-component scalar multiply.
if ( vAmountToMove.LengthSquared() >= vToTarget.LengthSquared() ) {
currentTarget = target;
}
else {
currentTarget += vAmountToMove;
}

L. Spiro Edited by L. Spiro
0

Create an account

Register a new account