2010-10-16 2 views
2

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

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

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

ответ

2

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