Game Development Community

Get New Position From Rotated Vector ? -- brain is mush

by Steve Acaster · in Technical Issues · 03/11/2011 (9:16 am) · 4 replies

No matter how much caffine I add - my brain still isn't working...

I'm trying to get a position 2 units behind a Target object, at a vector from Object1.

Here's my logic:

1. get Angle of Target from Object1 and get Distance - okay.
2. getVector of Angle at Object1 - possible fail
3. scale vector to Distance plus 2 units - utter fail

And here's my practise:

function Player::getSpecialPos(%this, %tgt)
{
//part1 starts
	%dist = VectorDist(%this.getTransform(), %tgt.getTransform());
	echo(%dist);
	%dist = %dist + 2;
	echo(%dist);
	
	%angle = %this.getAngleofVector(%tgt);
	echo(%angle);
//part1 ends okay

	%pos = %this.getScriptedVector(%angle, %dist);//part2 fail
	
	%spec = VectorAdd(%this.getPosition(), VectorScale(%pos, %dist));//part 3 goes bad
	
	echo(%spec);
}

And I'm using:

To get the angle - works fine
function player::get2DAngle(%this, %tgt)
{
	//%eyeVec = VectorNormalize(%this.getEyeVector());
	%eyeVec = VectorNormalize(%this.getForwardVector());
	%eyeangle = %this.getAngleofVector(%eyeVec);
	
	if(getwordcount(%tgt) == 1)
	{
		%posVec = VectorSub(%tgt.getPosition(), %this.getPosition());
	//	echo("------------------------------ getposition for angle");
	}
	else
	{
		%posVec = VectorSub(%tgt, %this.getPosition());
	//	echo("++++++++++++++++++++++ angle");
	}
	%posangle = %this.getAngleofVector(%posVec);
	%angle = %posangle - %eyeAngle;
	%angle = %angle ? %angle : %angle * -1;
  if (%angle < 0)  %angle = %angle + 360;
	return %angle;
}

function player::getAngleofVector(%this, %vec)
{
	%vector = VectorNormalize(%vec);
	%vecx = getWord(%vector,0);
	%vecy = getWord(%vector,1);
	if(%vecx >= 0 && %vecy >= 0)
		%quad = 1;
	else
		if(%vecx >= 0 && %vecy < 0)
	  	%quad = 2;
	  else
	  	if(%vecx < 0 && %vecy < 0)
	    	%quad = 3;
	    else 
	    	%quad = 4;
	%angle = mATan(%vecy/%vecx, -1);
	%degangle = mRadToDeg(%angle);
	switch(%quad)
	{
		case 1:
	  	%angle = %degangle-90;
	  case 2:
	  	%angle = %degangle+270;
	  case 3:
	  	%angle = %degangle+90;
	  case 4:
	  	%angle = %degangle+450;
	}
  if (%angle < 0)  %angle = %angle + 360;
  return %angle;
}

// Return angle between two vectors
function Player::getAngle(%vec1, %vec2)
{
  %vec1n = VectorNormalize(%vec1);
  %vec2n = VectorNormalize(%vec2);

  %vdot = VectorDot(%vec1n, %vec2n);
  %angle = mACos(%vdot);

  // convert to degrees and return
  %degangle = mRadToDeg(%angle);
  return %degangle;
}


And to try and get the rotated vector --- fail here

// Rotate a vector in the XY plane (i.e., around Z-axis)
// (%angle is in degrees)
function Player::vecRotateAz(%vec, %angle)
{
  %rot = MatrixCreateFromEuler("0 0 " @ mDegToRad(%angle));
  return MatrixMulVector(%rot, %vec);
}

function Player::getScriptedVector(%this, %angle, %dist)
{
	//angle is 0-359 degrees
  %vec = %this.vecRotateAz(%this.getForwardVector(),0 - %angle);
  %pos = VectorAdd(%this.getTransform(), VectorScale(%vec, %dist));
	echo(%vec);
	echo(%pos);

//these 2 are the same - pretty sure they shouldn't be
//also they're the position of the player but I don't see how

    return %pos;
}

Help, solution, slapping with a wet fish appreciated.

[edit]
And here's pic of what I mean
img858.imageshack.us/img858/176/vectorissue.jpg

#1
03/11/2011 (10:29 am)
Unless I'm really misunderstanding what you're trying to do...

function Player::getSpecialPos(%this, %tgt) 
{
   // Get the vector from the player to the target
   %vec = VectorSub(%tgt.getPosition(), %this.getPosition());

   // Normalize the vector
   %vec = VectorNormalize(%vec);
   
   // Scale the vector by 2 units
   %vec = VectorScale(%vec, 2.0);

   // Add this offset to the target's position to get special position
   %spec = VectorAdd(%tgt.getPosition(), %vec);

   // TODO: other stuff
}
#2
03/11/2011 (11:33 am)
... can't stop laughing ...

Thanks Ryan!

Bafflingly, I'd got it into my head that I needed to get Object1's vector, rotate it, and then scale it ... Boy was I trying to overcomplicate things!

I'll blame it on waking up to find out I was out of tea ...
#3
03/11/2011 (12:07 pm)
Quote:I'll blame it on waking up to find out I was out of tea...

I figured it was something like that. :)
#4
01/03/2013 (11:44 am)
Thanks for this thread. Helped me out greatly!