Добавлен Raised,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Алгоритм
Версия Warcraft:
Любая
Набор функций для работы с игровой камерой.
globals
- cCzOffsetFix: необходимо для корректной работы функции SetCameraXYZ: игровая камера движется не по террейну, а по процедурно-генерируемой cameraMap, которая является его производной. SetCameraXYZ лочит камеру на Ctrl (особого, неподвижного дамми-юнита с UnitTypeId == CtrlId, который создается библиотекой при загрузке карты в указанных коорднатах), то есть достаточно посчитать смещение производной в этих координатах в начале игры. Производную можно рассчитать, отключив все функции, использующие эту библиотеку и вызвав функцию GetCameraMapOffset, после чего на экран будет выведено значение смещения, которому и должна равняться константа cCzOffsetFix.
- Примечание 0: триггерное воздействие на террейн вблизи Ctrl нарушает нормальную работу функции SetCameraXYZ.
- Примечание 1: cCzOffsetFix может менятся при редактировании террейна в редакторе.
- CtrlX, CtrlY: координаты Ctrl (особого, неподвижного дамми-юнита с UnitTypeId == CtrlId, необходимого для правильной работы функции SetCameraXYZ).
- Ctrl: особый, неподвижный дамми-юнит с UnitTypeId == CtrlId, необходимый для правильной работы функции SetCameraXYZ.
- loc: дамми-локация, использующаяся для определения высоты террейна.
functions
- GetLocZ: считает высоту террейна в указанных координатах.
- PanCameraXYZ: линейно перемещает игровую камеру в указанную точку за указанное время. Параметр inverted определяет тип камеры (классический или от первого лица).
- SetCameraXYZ: перемещает игровую камеру в указанную точку. Параметр inverted определяет тип камеры (классический или от первого лица).
- Примечание 0: триггерное воздействие на террейн вблизи Ctrl нарушает работу данной функции.
- Примечание 1: используя эту функцию, вы лишаетесь возможности отдавать приказ перемещаться с помощью райт-кликов по миникарте.
- Примечание 2: используя эту функцию, вы лишаетесь возможности перемещать игровую камеру в указанную точку при лефт-кликах по миникарте.
- Примечание 3: используя эту функцию, вы лишаетесь возможности линейно перемещать игровую камеру (timed).
- SetCameraFocus: устанавливает расстояние от cameraTarget до cameraEye и поле зрения камеры. Параметр inverted определяет необходима ли совместимость с камерой от первого лица.
- SetCameraPYR: вращает камеру, используя углы Эйлера в качестве входящих значений.
- SetCameraFacing: поворачивает камеру в направлении точки, заданной координатами.
- GetCameraMapOffset: вспомогательная функция, рассчитывает производную cameraMap в точке (CtrlX,CtrlY). Необходима для нормальной работы функции SetCameraXYZ.
code
library Camera initializer Init
globals
constant real cCzOffsetFix = //Your value (call GetCameraMapOffset())
constant integer CtrlId = //Your UnitTypeId
constant real CtrlX
constant real CtrlY
real pCzOffsetFix
location loc
unit Ctrl
endglobals
function GetLocZ takes real x, real y returns real
call MoveLocation(loc,x,y)
return GetLocationZ(loc)
endfunction
function PanCameraXYZ takes real x, real y, real z, real time, boolean inverted returns nothing
if time < 0.001 then
set time = 0.001
endif
set pCzOffsetFix = GetLocZ(GetCameraTargetPositionX(),GetCameraTargetPositionY())
if inverted then
set x = x + (GetCameraTargetPositionX()-GetCameraEyePositionX())
set y = y + (GetCameraTargetPositionY()-GetCameraEyePositionY())
set z = z + (GetCameraTargetPositionZ()-GetCameraEyePositionZ())
call PanCameraToTimed(x,y,time)
call SetCameraField(CAMERA_FIELD_ZOFFSET,z-pCzOffsetFix+GetCameraField(CAMERA_FIELD_ZOFFSET)+GetLocZ(GetCameraTargetPositionX(),GetCameraTargetPositionY())-GetCameraTargetPositionZ(),time)
else
call PanCameraToTimed(x,y,time)
call SetCameraField(CAMERA_FIELD_ZOFFSET,z-pCzOffsetFix+GetCameraField(CAMERA_FIELD_ZOFFSET)+GetLocZ(GetCameraTargetPositionX(),GetCameraTargetPositionY())-GetCameraTargetPositionZ(),time)
endif
endfunction
function SetCameraXYZ takes real x, real y, real z, boolean inverted returns nothing
if inverted then
set x = x + (GetCameraTargetPositionX()-GetCameraEyePositionX())
set y = y + (GetCameraTargetPositionY()-GetCameraEyePositionY())
set z = z + (GetCameraTargetPositionZ()-GetCameraEyePositionZ())
call SetCameraTargetController(Ctrl,x,y,false)
call SetCameraField(CAMERA_FIELD_ZOFFSET,z+cCzOffsetFix-GetLocZ(0,0),0)
else
call SetCameraTargetController(Ctrl,x,y,false)
call SetCameraField(CAMERA_FIELD_ZOFFSET,z+cCzOffsetFix-GetLocZ(0,0),0)
endif
endfunction
function SetCameraFocus takes real d, real f, real time, boolean inverted returns nothing
if inverted then
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE,1,time)
call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW,f,time)
else
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE,d,time)
call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW,f,time)
endif
endfunction
function SetCameraPYR takes real p, real y, real r, real time returns nothing
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK,p,time)
call SetCameraField(CAMERA_FIELD_ROTATION,y,time)
call SetCameraField(CAMERA_FIELD_ROLL,r,time)
endfunction
function SetCameraFacing takes real x, real y ,real z, real time returns nothing
call SetCameraField(CAMERA_FIELD_ROTATION,Atan2(y-GetCameraEyePositionY(),x-GetCameraEyePositionX())*bj_RADTODEG,time)
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK,Atan((z-GetCameraEyePositionZ())/SquareRoot(((x-GetCameraEyePositionX())*(x-GetCameraEyePositionX())+(y-GetCameraEyePositionY())*(y-GetCameraEyePositionY()))))*bj_RADTODEG,time)
endfunction
function GetCameraMapOffset takes nothing returns nothing
call SetCameraTargetController(Ctrl,0,0,false)
call BJDebugMsg(R2S(GetLocZ(GetUnitX(Ctrl),GetUnitY(Ctrl))-GetCameraTargetPositionZ()))
endfunction
function Init takes nothing returns nothing
set Ctrl = CreateUnit(Player(12),CtrlId,CtrlX,CtrlY,0)
endfunction
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Raised
Отредактирован Raised