views:

71

answers:

1

Hello. I'm trying to point an entity to a 3D vector. (basically setting an entities angle so it points to a position in 3D space). At the moment, I'm stuck with getting an angle from a vector.

//Vectors in the bracket are 3D, first is the entity position, second is a position in space where I want to point at.
( myEntity.Pos - posToPointAt ).Angle

I'm currently stuck at transforming the direction vector into an angle. Help is much appreciated.

+2  A: 

That's not how it works, you are missing an essential bit of information: in stead of using the entity position, you need to figure out what way your entity is pointing right now? Acquiring that info might be as simple as using your current rotation matrix and multiplying it with a unit vector down the z-axis (or whatever the "neutral" direction of the entity is), but that all depends on your particular setup.

Once you have both direction vectors (your current direction, and the direction to the new desired location... the last one being the normalized "myEntity.Pos - posToPointAt"), you use a function like below to calculate the rotation between the directions. Notice I use quaternions here, you might be needing a rotation matrix.

function RotationBetweenVectors( const aV1, aV2: TVector3): TQuaternion;
const
  EPSILON = 0.000001;

var
  v1: TVector3;
  v2: TVector3;
  dot: FloatT;
  s: FloatT;
  invS: FloatT;
  c: TVector3;

begin
  v1 := aV1.normalize;
  v2 := aV2.normalize;

  dot := VectorDotProduct( v1, v2 );

  if dot >= 1 then
  begin
      // INFO: DotProduct = 1 -> vectors are the same
      result := QUATERNION_IDENTITY
  end
  else if ( dot < EPSILON - 1 ) then
  begin
      raise Exception.create( '180 degree rotation currently not supported.' );
  end
  else
  begin
      s := sqrt( 2 * ( 1 + dot ));
      invS := 1 / s;

      c := VectorCrossProduct( v1, v2 );

      result.x := c.x * invS;
      result.y := c.y * invS;
      result.z := c.z * invS;
      result.w := 0.5 * s;
      result := result.normalize;
  end;
end;
Paul-Jan