Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
37
6 лет назад
0
Есть ведь dgui
0
21
6 лет назад
Отредактирован Raised
0
Мне не нра как vJass конвертится в код. Так что пошёл он в звезду, буду удобно-кодить на нормальных языках.

P.S. функции слил в библиотеку для упрощения импорта системы для тех кого vJass не стремает (или этот код).
0
37
6 лет назад
0
Там по минимуму, без полиморфизма и абстракций
0
21
6 лет назад
Отредактирован Raised
0
Ну естественно без. На то он и Jass. Да и не для такой библиотеки полиморфизм нужон. Хотя хз.

Думаю, стоит добавить еще функции для локальных координат.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.