2016-05-20 2 views
2

Я постараюсь быть очень описательным с этим. Сейчас я редактирую игру, и сценарий представляет собой 3D-область.Движение медленно начального угла до достижения конечного угла

У меня есть начальный угол, записан как вектор направления и другой вектор, который имеет разные координаты. Как известно, угол между 2 векторами определяется по формуле: Theta = ACos (DotProduct (vec1, vec2)/(VectorLength (vec1) * VectorLength (vec2)))

Итак, давайте описать сценарий: Я в настоящее время программирую какое-то стационарное оружие, часовой пистолет, эта вещь медленно двигается своей «головой», стреляя в пули врагам. Эта проблема вращения угла - моя проблема.

Давайте представим это: у меня есть мое ружье на пустой 3D-области, и там появляется «враг». В настоящее время я могу получить вектор направления моего угла зрения часового и вектор направления между моим часовым и игроком. Предположим, используя описанную формулу, его угол разделения составляет 45 градусов. Мой часовой пистолет думает (вызывает функцию) каждые 0,1 секунды, и я хочу переместить его голову 5 градусов при каждой функции мышления, пока не достигнет игрока (т. Е. Оба вектора почти равны), а это означает, что он будет (если игрок держится на своем месте ...) через 0,9 секунды (5 градусов от 45)

Как я могу медленно перемещать угол зрения часового до достижения цели? В 2D легко, но знаю, что я сражаюсь с 3D-сценарием, и в настоящее время я потерял это.

Любая помощь будет оценена, и о кодировании я буду признателен за псевдокод. Благодаря! (И простите за мой английский)

+0

Если вы можете решить это в 2D, вы можете решить его в 3D, игнорируя 3-ей координаты для использования в ваших 2D-формулах, если она не вращается в 3-х направлениях. – rcdmk

+0

Чтобы сделать это медленно, вы можете использовать некоторую формулу ослабления, например: 'position = currentPosition + (finalPosition - currentPosition)/easingFactor', где' easingFactor' - целое число, определяющее замедление. – rcdmk

+0

Вам нужно будет вычислить векторный нормаль к плоскости, содержащей ** vec1 ** и ** vec2 ** - это определяет ось, вокруг которой вы будете вращать вектор прямой видимости сторожевого пистолета. Формула для выполнения вращения (скажем, ** 5 ° **) вокруг произвольного трехмерного вектора несколько сложна и объясняется по всему Интернету. Например: [здесь] (http://inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/). Однако, если вам не нужен угол, который может варьироваться между ** vec1 ** и ** vec2 **, то линейное решение, такое как @ rcdmk, было бы достаточным, вместо линейного изменения координат. –

ответ

1

Что вам нужно, это называется SLERP - сферическая линейная интерполяция

Ваше Отправной направление вектор p0 есть, направление целью является p1, Omega ваш Theta, а параметр т изменяется в диапазоне от 0 до ..1 с необходимым шагом

Delphi пример для 2D случая (легко управлять)

var 
    p0, p1: TPoint; 
    i, xx, yy: Integer; 
    omega, InvSinOmega, t, a0, a1: Double; 
begin 
    P0 := Point(0, 200); 
    P1 := Point(200, 0); 
    omega := -Pi/2; 
    InvSinOmega := 1.0/Sin(omega); 
    Canvas.Brush.Color := clRed; 
    Canvas.Ellipse(120 + P0.X, 120 + P0.Y, 120 + P0.X + 7, 120 + P0.Y + 7); 
    Canvas.Ellipse(120 + P1.X, 120 + P1.Y, 120 + P1.X + 7, 120 + P1.Y + 7); 

    for i := 1 to 9 do begin 
    t := i/10; 

    a0 := sin((1 - t) * omega) * InvSinOmega; 
    a1 := sin(t * omega) * InvSinOmega; 
    xx := Round(P0.X * a0 + P1.X * a1); 
    yy := Round(P0.Y * a0 + P1.Y * a1); 

    Canvas.Brush.Color := RGB(25 * i, 25 * i, 25 * i); 
    Canvas.Ellipse(120 + xx, 120 + yy, 120 + xx + 9, 120 + yy + 9); 
    end; 

enter image description here

+0

Иисус, это замечательно. Раньше этого не замечал. Плохо, я немного смущен. Я должен применять Slerp() для каждой координаты? Значение .. что-то вроде ReturnVector.x = Slerp (Start.x, End.x, 0.5/* example * /) ReturnVector.y = Slerp (Start.y, End.y, 0.5) ReturnVector.z = Slerp (Start.z, End.z, 0.5) ? – PM32

+0

Да, вы правы. Но лучше вычислить коэффициенты один раз для данного t и применить их ко всем координатам – MBo

Смежные вопросы