View Single Post
Old 04-14-2011, 10:40 PM   #115
KUPRUM
Адмирал флотаАдмирал флота
 
Faction:
Хиигаряне

Join Date: Nov 2008
Posts: 1,092
Сообщение Re: Внутри корабля

Это чисто формулы, пример полного алгоритма такой (это 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)
конец кода
Code:
(exit T)
Вот собственно сам пример работы этого алгоритма могу написать пример с этими формулами на акшон скрипте в флэш

\\__________________________________________________________________________

То есть z это внешняя переменная?
Я знаком с C# а вот до C++ никак руки не доходят.

Спасибо за помощь? попробую разобраться на выходных с этими алгоритмами))))
KUPRUM is offline   Reply With Quote