Это чисто формулы, пример полного алгоритма такой (это Common Lisp)
Code:
(setq Xbase (nth 0(getobjectlocation Follower 1))) ; Позиция объекта который будит двигается за курсором
(setq Ybase (nth 1(getobjectlocation Follower 1)))
(setobjectlocation "CamTracker" Xbase Ybase 0) ; это фиксация камеры
получение положения курсора в пиксилях
Code:
(setq x (nth 0 (getcursorpos)))
(setq y (nth 1 (getcursorpos)))
Ниже различные варианты проигрывания анимации, в зависимости от условий
Code:
(if (/= (pickobjectatpoint x y ) MeshName)(progn
(animationonoff FollowerControls Run 1 2)
(triggeranimation Leader "Set as Cursor01") ; use cheese wedge as cursor
(objectshowhide Leader 0)
)
(progn
(animationonoff FollowerControls Stand 1 2)
(triggeranimation Leader "Set as Cursor01" 1) ; stop cheese wedge as cursor
(objectshowhide Leader 1)
)
)
Получаем координаты куда кликнул пользователь
Code:
(setq worldPoint (pickpointonplane x y '( 0 0 1 0)))
Считываем эти координаты в переменные
Code:
(setq Xpos1 (nth 0 worldPoint)) ; cursor position
(setq Ypos1 (nth 1 worldPoint))
;we know z is 0
Здесь какой то объект переносится в точку куда щелкнул пользователь
Code:
(setobjectlocation Leader Xpos1 Ypos1 0) ; set cursor position object
вот определении координат вектора где Xpos1 Ypos1 координаты щелчка
Code:
Xbase Ybase координаты следящего объекта
(setq Xvector1 (- Xpos1 Xbase)) ; get vector displacement using the planar position with base point (0,0)
(setq Yvector1 (- Ypos1 Ybase)) ;
Определении между ними дистанции
Code:
(setq mag1 (sqrt (+ (pow Xvector1 2)(pow Yvector1 2)))) ; get magnatude/length of vector
ну это движение объекта в зависимости от его удаления от места щелчка
Code:
(if (< mag1 12) ;if teapot is getting close to the cursor, slow it down (using the distance + 2), else keep it fast
(setanimationvarbydesc Follower "Object Key Move01" "X Dist Per Sec" (+ mag1 2))
(setanimationvarbydesc Follower "Object Key Move01" "X Dist Per Sec" 12)
)
вот вычисление угла поправки, результат в радианах
Code:
(setq dir (atan (/ Yvector1 Xvector1))) ; get direction in radians
; figure out which quadrant it's in to correct direction in radians
вот тут не понятно, это что вроде в какую четверть попадает точка но черт его знает
Code:
(if (and (< Xbase Xpos1)(> Ybase Ypos1))(progn
;(princ "quad 1\n")
(setq Quad 0)
)
) ; quad1
(if (and (< Xbase Xpos1)(< Ybase Ypos1))(progn
;(princ "quad 4\n")
(setq Quad 0)
)
); quad 4
(if (and (> Xbase Xpos1)(< Ybase Ypos1))(progn
;(princ "quad 3\n")
(setq Quad pi)
)
) ; quad 3
(if (and (> Xbase Xpos1)(> Ybase Ypos1))(progn
;(princ "quad 2\n")
(setq Quad pi)
)
); quad 2
вот собственно окончательная поправка
Code:
(setq CorrectedRadian (+ quad dir))
; try to slow rotation when too close
это замедление ротации, но почему то оно отключено
Code:
;(if (and (< mag1 3)(> mag1 1.5))(setq CorrectedRadian (min (abs(+ OldRadian 1)) (abs CorrectedRadian))))
Вот собственно сама функция ротации
Code:
(setobjectrotation Leader 0 0 CorrectedRadian)
(setobjectrotation Follower 0 0 CorrectedRadian)
сохраняем предыдущий результат.
Code:
(setq OldRadian CorrectedRadian)
конец кода
Вот собственно сам пример работы этого алгоритма могу написать пример с этими формулами на акшон скрипте в флэш
\\__________________________________________________________________________
То есть z это внешняя переменная?
Я знаком с C# а вот до C++ никак руки не доходят.
Спасибо за помощь? попробую разобраться на выходных с этими алгоритмами))))