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:
And I'm using:
To get the angle - works fine
And to try and get the rotated vector --- fail here
Help, solution, slapping with a wet fish appreciated.
[edit]
And here's pic of what I mean

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

About the author
One Bloke ... In His Bedroom ... Making Indie Games ...
#2
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 ...
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
I figured it was something like that. :)
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!
Torque Owner Ryan Mounts
CornerstoneViz
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 }