Jump to content

  • Log In with Google      Sign In   
  • Create Account


Zerratar

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

Posts I've Made

In Topic: Help with rotation issue

23 September 2013 - 01:44 PM

Well, if you simply want to rotate the arm around its shoulder. You can use the following:

var m = Mouse.GetState();
Vector2 mousePos = new Vector2(m.X, m.Y);

Vector2 distance = mousePos - p1;
// calculate angle to rotate
float angle =
(float)Math.Atan2(distance.Y, distance.X);


spriteBatch.Begin();
spriteBatch.Draw(armAndGunTexture, p1.X, p.Y, null, Color.White, angle, Vector2.Zero,1f, SpriteEffects.None, 0);
spriteBatch.End();

I hope this helped :)


 

In Topic: Making a 3D model face the direction it's moving

09 September 2013 - 06:08 AM

 It Worked!!!

 

Thanks Zerratar that worked perfectly!

 

code below is just a small sample of how I tested it

 

 

Vector3 NewPosition = new Vector3(55, 0, 77);

  if (currentKeyboardState.IsKeyDown(Keys.Left))
            {
               
                RotationQuat = GetRotation(NewPosition); 
            }

and Thanks again guys for responding to my post biggrin.png

Hurray! I'm glad it worked for you! :)


In Topic: Making a 3D model face the direction it's moving

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