Это не так, как вы работаете, вам не хватает важной информации: вместо использования позиции сущности, вам нужно выяснить, как ваша сущность указывает прямо сейчас ? Получить эту информацию можно так же просто, как использовать текущую матрицу вращения и умножить ее на единичный вектор по оси 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;