Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Don't forget to read Tuesday's email newsletter for your chance to win a free copy of Construct 2!


Zerratar

Member Since 05 Sep 2013
Offline Last Active Nov 06 2013 07:12 AM

#5091764 Making a 3D model face the direction it's moving

Posted by Zerratar on 05 September 2013 - 04:09 AM

Hi football94!

You can calculate the rotation between the two world points (Vector3) 

This is what I used in my game:

	public Quaternion GetRotation(Vector3 targetPos)
		{
			return GetRotation(this.Position, targetPos);
		}

		public Quaternion GetRotation(Vector3 entityPos, Vector3 targetPos)
		{
			// the new forward vector, so the avatar faces the target
			Vector3 newForward = Vector3.Normalize(entityPos - targetPos);

			// calc the rotation so the avatar faces the target
			var src = Vector3.Forward;

			var dest = newForward;

			src.Normalize();
			dest.Normalize();

			float d = Vector3.Dot(src, dest);

			if (d >= 1f)
			{
				return Quaternion.Identity;
			}
			if (d < (1e-6f - 1.0f))
			{
				Vector3 axis = Vector3.Cross(Vector3.UnitX, src);

				if (axis.LengthSquared() == 0)
				{
					axis = Vector3.Cross(Vector3.UnitY, src);
				}

				axis.Normalize();
				return Quaternion.CreateFromAxisAngle(axis, MathHelper.Pi);
			}


			float s = (float)Math.Sqrt((1 + d) * 2);
			float invS = 1 / s;

			Vector3 c = Vector3.Cross(src, dest);
			Quaternion q = new Quaternion(invS * c, 0.5f * s);
			q.Normalize();

			return q;
		}

when drawing your model use:

NewPosition = should be the target (future) position that your model is moving towards.


Quaternion RotationQuat = GetRotation(NewPosition);

 

then you need to store your RotationQuat and do NOT update it until your new "future" position is changed.

otherwise the model will rotate back the moment you stop moving.

for (int i = 0; i < bones.Length; i++)
{
bones[i] *=
Matrix.CreateFromQuaternion(RotationQuat)
* Matrix.CreateTranslation(position)
* Matrix.CreateWorld(Translation, Vector3.Forward, Vector3.Up); //Move the models position
...

I hope this helped :)




PARTNERS