Угол направления или направление трехмерного угла в положение в пространстве - PullRequest
2 голосов
/ 16 октября 2010

Я пытаюсь указать сущность на трехмерный вектор. (в основном установка угла объекта, чтобы он указывал на положение в трехмерном пространстве). На данный момент я застрял с получением угла от вектора.

//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

В настоящее время я застрял в преобразовании вектора направления в угол. Помощь очень ценится.

1 Ответ

2 голосов
/ 16 октября 2010

Это не так, как вы работаете, вам не хватает важной информации: вместо использования позиции сущности, вам нужно выяснить, как ваша сущность указывает прямо сейчас ? Получить эту информацию можно так же просто, как использовать текущую матрицу вращения и умножить ее на единичный вектор по оси z (или каково бы ни было «нейтральное» направление объекта), но все это зависит от вашей конкретной установки.

Когда у вас есть оба вектора направления (ваше текущее направление и направление к новому желаемому местоположению ... последним является нормализованный "myEntity.Pos - posToPointAt"), вы используете функцию как ниже, чтобы вычислить вращение между направлениями. Обратите внимание, что здесь я использую кватернионы, возможно, вам нужна матрица вращения.

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;
...