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