Раздел:
Разное

Управление камерой - нативки

Автор статьи: МрачныйВорон
Создатель статьи: host_pi
Продолжение статьи на английском языке с гифками wc3modding.info/34/cameras
сместить обзор (положение) камеры в обзор другой камеры (camerasetup)
камера GetLocalPlayer() смещается в камеру camerasetup
real duration - время перехода, которое влияет на смещение камеры. 0.00 - смещает мгновенно камеру, time>0 - камера постепенно двигается в эту точку (и изменить положение камеры за это время не дают, и смотришь как смещается камера). Чем больше это время, тем медленее движется в эту точку
native CameraSetupApplyForceDuration takes camerasetup whichSetup, boolean doPan, real forceDuration returns nothing
временно сместить камеру игрока в точку
центр камеры игрока смещается в заданную точку (x,y), и держит несколько секунд в этом положении
real duration - время, которое влияет на смещение камеры. 0.00 - смещает мгновенно камеру, time>0 - камера постепенно двигается в эту точку (и изменить положение камеры за это время не дают, и смотришь как смещается камера). Чем больше это время, тем медленее движется в эту точку
native PanCameraToTimed takes real x, real y, real duration returns nothing
временно сместить камеру игрока с интерполиров. высотой в точку
центр камеры игрока смещается в заданную точку (x,y)
Камера не будет погружаться под землю при перемещении по маршруту.
Эта функция очень хороша, если вы находитесь на раздражающе холмистой карте. Это в основном сделает так, что он будет подниматься по местности, чтобы высота была несколько постоянной от земли. Это добавит 300 к высоте земли под ним, а не к фактической контрольной точке Z, равной 0. (Таким образом, если вы перемещаете что-либо, оно не будет оставаться на постоянной высоте, оно будет меняться в зависимости от местности)
мне вот интересно можно ли найти высоту Z на холмиках с помощью камеры
real duration - время перехода, которое влияет на смещение камеры. 0.00 - смещает мгновенно камеру, time>0 - камера постепенно двигается в эту точку (и изменить положение камеры за это время не дают, и смотришь как смещается камера). Чем больше это время, тем медленее движется в эту точку
native PanCameraToTimedWithZ takes real x, real y, real zOffsetDest, real duration returns nothing
native CameraSetupApplyWithZ takes camerasetup whichSetup, real zDestOffset returns nothing
временно сместить камеру игрока в точку (при необходимости)
real duration - время перехода, которое влияет на смещение камеры. 0.00 - смещает мгновенно камеру, time>0 - камера постепенно двигается в эту точку (и изменить положение камеры за это время не дают, и смотришь как смещается камера). Чем больше это время, тем медленее движется в эту точку
Если камера очень далеко, она переключится, а не переместится. Если камера очень близко, то запрос на перемещение будет пропущен.
Это BJ-функция. Определяет, находится ли объект камеры слишком близко или слишком далеко. Если он слишком близко, он ничего не сделает. (Камера вообще не будет перемещаться). Если она находится слишком далеко, камера мгновенно передвинет к месту через 0 секунд. Если расстояние между камерой и точкой находится в определенном диапазоне, то камеру будет смещать. За исключением того, что это рассинхронизация! Он использует "GetCameraTargetPositionLoc ()"
function SmartCameraPanBJ takes player whichPlayer, location loc, real duration returns nothing
    local real dist
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.

        set dist = DistanceBetweenPoints(loc, GetCameraTargetPositionLoc())
        if (dist >= bj_SMARTPAN_TRESHOLD_SNAP) then
            // If the user is too far away, snap the camera.
            call PanCameraToTimed(GetLocationX(loc), GetLocationY(loc), 0)
        elseif (dist >= bj_SMARTPAN_TRESHOLD_PAN) then
            // If the user is moderately close, pan the camera.
            call PanCameraToTimed(GetLocationX(loc), GetLocationY(loc), duration)
        else
            // User is close enough, so don't touch the camera.
        endif
    endif
endfunction
установить Поле Камеры (или настройки обзора текущей камеры)
native SetCameraField takes camerafield whichField, real value, real duration returns nothing
есть несколько настроек (camerafield):
    constant camerafield CAMERA_FIELD_TARGET_DISTANCE       = ConvertCameraField(0)
    constant camerafield CAMERA_FIELD_FARZ                  = ConvertCameraField(1)
    constant camerafield CAMERA_FIELD_ANGLE_OF_ATTACK       = ConvertCameraField(2)
    constant camerafield CAMERA_FIELD_FIELD_OF_VIEW         = ConvertCameraField(3)
    constant camerafield CAMERA_FIELD_ROLL                  = ConvertCameraField(4)
    constant camerafield CAMERA_FIELD_ROTATION              = ConvertCameraField(5)
    constant camerafield CAMERA_FIELD_ZOFFSET               = ConvertCameraField(6)
константы (это настройки по умолчанию). Если вам надо сбросить настройки, вот вы знаете где взять. Еще можно в редакторе карт создать камеру, и посмотреть характеристики.
Созданная камера по умолчанию задает эти характеристики.
constant integer bj_CAMERA_DEFAULT_AOA=304
constant integer bj_CAMERA_DEFAULT_DISTANCE=1650
constant integer bj_CAMERA_DEFAULT_FARZ=5000
constant integer bj_CAMERA_DEFAULT_FOV=70
constant integer bj_CAMERA_DEFAULT_ROLL=0
constant integer bj_CAMERA_DEFAULT_ROTATION=90
constant integer bj_CAMERA_MIN_FARZ=100
CAMERA_FIELD_TARGET_DISTANCE - расстояние до цели - это расстояние между глазом камеры и цели. Можете так отдалить камеру от земли, так и приблизить. Это также влияет и на область обзора, чем ближе камера, тем меньше обзора охватывает камера (просто видите увеличенную картинку в маалюсенькой области). Значение по умолчанию равно 1650.
CAMERA_FIELD_FARZ - дальность по оси Z - так понял это определяет как далеко видит камера, объекты прорисовывают и так далее. Если значение прописать слишком маленькие, то это у вас уйдет за черный экран (то есть вообще ничего не видит, обычно дальние объекты за черный туман уходят, даже если у вас карта открыта). По умолчанию значение равно 5000. Еще раз
Far Z - изменяет диапазон, в котором видны удаленные объекты. Допустим, дерево находится на расстоянии 10000 координат. Вы можете установить 10 000, чтобы увидеть это дерево. Максимум на самом деле 10000. Даже если вы установите его выше в триггерах, он, скорее всего, будет иметь тот же эффект, что и 10000. Будьте осторожны, делая это, может помочь улучшить видимость местности издалека, но в реальных играх это может привести к фаталу. Это, вероятно, один из самых впечатляющих визуальных эффектов. Если вы установите слишком высокое значение и увидите слишком много объектов, это может снизить FPS (количество кадров в секунду, тип / fps в игре) на 20 или больше. В конечном счете, это зависит от угла атаки, но если будет видно слишком много объектов, то это, как правило, вызывает большое отставание.
CAMERA_FIELD_FIELD_OF_VIEW - поле зрения или величина обзора камеры - это в основном влияет на количество области, которую вы видите в вашей камере. Своего рода zoom. Зум это по-русски «масштаб» или «мера приближения». Есть определенный диапазон от 20 до 120. Ниже или выше этого диапазона невозможно ввести, ты вводишь, но ничего не происходит. Значение по умолчанию равна 70.
CAMERA_FIELD_ANGLE_OF_ATTACK - угол атаки (от 0 до 360) - Наклон камеры относительно земли:
0 = горизонтальный вид (половина камеры лежит в земле, вторая половина на поверхности)
90 - вид снизу, камера направлена вверх и находится под землей;
180 - горизонтальный вид (это перевернутая сверх ногами камера, половина камеры лежит в земле, вторая половина на поверхности)
270 = вид сверху, камера напрвлена вниз и находится над землей
304 градуса это стандартная игровая камера AoA.
Приблизительно 345 градусов или около того обычно используется для RPG-подобных камер.
CAMERA_FIELD_ROLL - крен - угол вращения камеры вокруг оси. камеру можно вращать вбок (влево-вправо). По умолчанию значение равно 0. Значения для ввода должны быть в диапазоне 1-360 градусов.
CAMERA_FIELD_ROTATION - повороты (вращения) - вращает объект. 90 градусов направлены на север, 180 градусов - на запад, 270 градусов - на юг, а 360/0 градусов - на восток. Значения для ввода должны быть в диапазоне 1-360 градусов.
CAMERA_FIELD_ZOFFSET - граница высот (смещение камеры по оси Z) - Z-Offset - высота камеры от земли. Вся камера перемещается вверх и, таким образом, имеет увеличенное значение «Z». Z-координаты - это, в основном, высота объектов, то, как высоко что-то от стандартной позиции на земле, равной 0.
вращение камеры вокруг точки
делает повороты вокруг точки (x,y). текущий угол поворота камеры по умолчанию равен 0. узнать текущий угол поворота можно еще с помощью этой функции GetCameraField(CAMERA_FIELD_ROTATION). Так вот, если вы вводите значение угла, то будет происходить поворот камеры от текущего угла к нужному. измеряется в радианах (можете перевести из градусов)
native SetCameraRotateMode takes real x, real y, real radiansToSweep, real duration returns nothing
прикрепить камеру к юниту
центром камеры является юнит. Куда сдвинется юнит, туда и камера последует. Камеру за все время следования невозможно сдвинуть за границы, чтобы посмотреть и тд. Это отлично подходит для RPG и односимвольных карт, так как вы можете легко прикрепить камеру к герою. Камера будет прикреплена, даже, если герой умрет.
  • Центр камеры можно сместить, это ввести координату смещения (x,y) от позиции юнита. Тогда положение камеры будет гулять относительно позиции героя (это мб сбоку находиться, ниже или наверху. в зависимости от значении координат. Может и пропасть из виду герой, если ввести большое значение координаты)
  • Можно еще поворачивать камеру. Rotation Source (источник поворота, на jass boolean inheritOrientation) - true (Поворот боевой единицы)/false (По умолчанию). По умолчанию = 0 град, Поворот боевой единицы - на самом деле это никакой не поворот боевой единицы, в гуи неправильно перевели. Это берут за основу поворот текущей камеры, ее можно изменять. И относительно ее вращают камеру. У вас всегда будет повернут на этот угол. Возможно можно изменять триггерно, и камера примет другой поворот.
  • Если нужно открепить камеру от героя, используйте сброс Reset Game Camera
native SetCameraTargetController takes unit whichUnit, real xoffset, real yoffset, boolean inheritOrientation returns nothing
прикрепить ориентир камеры к юниту
центром камеры является юнит. Куда сдвинется юнит, туда и камера будет поворачиваться. Отличие от SetCameraTargetController в том, что камера не двигается следом за юнитом, она находится в одной точке, глаз камеры наблюдает за юнитом с этой позиции (юнит может убежать далеко и его будет не видно), где он находился до SetCameraOrientController. Эта штука очень хорошо работает, если нужно наблюдать со стороны за движением юнита (когда приезжает издалека, и уезжает в даль). Камеру за все время следования невозможно сдвинуть за границы, чтобы посмотреть и тд. Это отлично подходит для RPG и односимвольных карт, так как вы можете легко прикрепить камеру к герою. Камера будет прикреплена, даже, если герой умрет.
  • Центр камеры можно сместить, это ввести координату смещения (x,y) от позиции юнита. Тогда положение камеры будет гулять относительно позиции героя (это мб сбоку находиться, ниже или наверху. в зависимости от значении координат. Может и пропасть из виду герой, если ввести большое значение координаты)
  • Можете проверять расстояние между юнитом и текущей камерой для смены позиции
  • Если нужно открепить камеру от героя, используйте сброс Reset Game Camera
native SetCameraOrientController takes unit whichUnit, real xoffset, real yoffset returns nothing
Запустить Кинематографическую камеру
Play Cinematic Camera - Применяет файл модели камеры. В MPQ содержатся специальные модели камер, о которых я расскажу позже (см. внизу ссылки).
native SetCinematicCamera takes string cameraModelFile returns nothing
Остановить камеру - прекращает движение камеры. Такие вещи, как «Apply Camera Object (Timed)» или панорамирование, будут остановлены.
native StopCamera takes nothing returns nothing
Сброс игровой камеры - полезная камера, которая сбрасывает значения текущей камеры по умолчанию (значения в константах выше). (Например: dist = 1650, AoA = 304)
native ResetToGameCamera takes real duration returns nothing
Изменить Сглаживающий фактор камеры
Изменить коэффициент сглаживания камеры - Да, вы можете подумать: «Эй, я могу сделать свои камеры более плавными». Ну, это не совсем то, что делает, к сожалению. Это делает прокрутку более плавной, с помощью кнопок со стрелками или с помощью мыши.
Так понял плавность имеется в виду, насколько быстро смещается камера при поворотах, разворотах, смещении. Можно ставить самое большое значение 999999к. Чтобы сбросить, нужно ввести значене по умолчанию 0 (в BJ функции там так и сделано).
native CameraSetSmoothingFactor takes real factor returns nothing
Трясти Камеру по Горизонтали
Повернуть камеру по Горизонтали для (Player) с увеличением (Magnitude) и скоростью (Velocity)
Это приведет к небольшому «колебанию» камеры, перемещая ее вперед-вниз. Величина магнитуды определяет, насколько разрушительным / экстремальным является влияние. Низкая величина вряд ли будет заметна. Скорость velocity определяет, как быстро она будет колебаться. Установите их оба высоко, и вы будете в поездке. Это полезно для кинематографа, когда вы хотите, чтобы произошло какое-то большое событие. Это повлияет на источник или точку птичьего полета.
Подсказка: Будет трясти камеру до тех пор, пока не вызовут функции 'Камера - Сбросить Игровую Камеру' или 'Камера - Прекратить Тряску/Поворот Камеры
Мнение: эта штука напоминает из эпизодов одного фильма, где-нибудь в каком-нибудь автобусе сладкая парочка занимается энтимным делом.
native CameraSetSourceNoise takes real mag, real velocity returns nothing
Вращать Цель Камеры (раскачивать камеру)
Вращать Цель Камеры для (Player) с увеличением (Magnitude) и скоростью (Velocity)
Sway Camera Target - та же, что и выше, но вместо этого она качает цель. Это будет иметь другой вид эффекта, но все же так же круто.
Подсказка: Будет трясти камеру до тех пор, пока не вызовут функции 'Камера - Сбросить Игровую Камеру' или 'Камера - Прекратить Тряску/Поворот Камеры
Мнение: эта штука напоминает так будто тебя в море лодку раскачивает
native CameraSetTargetNoise takes real mag, real velocity returns nothing
Трясти камеру
Трясти камеру для (Player) с увеличением (Magnitude)
Трясти камеру - вызовет эффект тряски при землетрясении или обвале шахты, сильно трясется. Blizzard делает хорошие вычисления. Это просто продолжительный эффект раскачивания. По сути, он умножит входную величину на 2, а для скорости он умножит величину * 10 ^ Рихтера. Если входная величина больше 5, то значение Рихтера будет 5. Если оно равно 2-5, тогда оно будет установлено на это значение, а если оно меньше 2, оно будет установлено на 2. Так что вы вводите величина 10, это будет 10 * 10 ^ 5 для скорости, или 1 000 000. Это приводит к очень высоким частотам изменения, напоминающим эффект «грохота». Отличная функция для "мощных" способностей и боевой кинематографии.
Подсказка: Будет трясти камеру до тех пор, пока не вызовут функции 'Камера - Сбросить Игровую Камеру' или 'Камера - Прекратить Тряску/Поворот Камеры
function CameraSetEQNoiseForPlayer takes player whichPlayer, real magnitude returns nothing
    local real richter = magnitude
    if (richter > 5.0) then
        set richter = 5.0
    endif
    if (richter < 2.0) then
        set richter = 2.0
    endif
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call CameraSetTargetNoiseEx(magnitude*2.0, magnitude*Pow(10,richter),true)
        call CameraSetSourceNoiseEx(magnitude*2.0, magnitude*Pow(10,richter),true)
    endif
endfunction
Прекратить Тряску/Поворот Камеры
Прекратить Тряску/Поворот камеры для (Player)
Это прекращает действие 'Вращать Цель Камеры' или 'Трясти Камеру. Короче по факту обнуляет значения.
function CameraClearNoiseForPlayer takes player whichPlayer returns nothing
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call CameraSetSourceNoise(0, 0)
        call CameraSetTargetNoise(0, 0)
    endif
endfunction
Установить границы камеры
Чтобы вернуть назад:
call ResetToGameCameraForPlayer( Player(0), 0 )
call SetCameraBoundsToRectForPlayerBJ( Player(0), GetCameraBoundsMapRect() )
native SetCameraBounds takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns nothing
за границы камеры берут границы rect
function SetCameraBoundsToRect takes rect r returns nothing
    local real minX = GetRectMinX(r)
    local real minY = GetRectMinY(r)
    local real maxX = GetRectMaxX(r)
    local real maxY = GetRectMaxY(r)
    call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY)
endfunction
Установить точку пробела - это позволит вам нажать клавишу пробела, чтобы привязать камеру к определенной точке.
Установить точку пробела для (Player) в (Point)
Точка пробела - это место, в которое перемещается камера, когда игрок нажимает пробел.
Вывод: Пробел не только привязан к точке этой функции. У игрока может быть несколько точек. Пробел изначально возвращает в стартовую позицию, а потом к последнему звуковому сообщению интерфейса, например, здание построено, герой погиб, рудник истощён, юнит атакован. Повторное нажатие на пробел возвращает предыдущую позицию. Последовательность точек, чем позже событие, тем первее точка. Это сделано специально, чтобы сместить камеру к последнему событию, и посмотреть что происходить. Как очистить точки - неизвестно. Можно овер дохера точек наплодить, чтобы игрок не смог вернуться к предыдущей точке
native SetCameraQuickPosition takes real x, real y returns nothing
Полезные ссылки:
`
ОЖИДАНИЕ РЕКЛАМЫ...
4
23
6 месяцев назад
4
В б-гомерзком рефе есть ещё две нативки на фокусное расстояние и глубину фокуса, где-то на хайве была статейка по этой теме. Вот пример с использованием: сначала фокус на дальних объектах, а ближние размыты. Затем фокус переводится на ближние объекты, а дальние размываются.
Загруженные файлы
0
23
6 месяцев назад
0
В б-гомерзком рефе есть ещё две нативки на фокусное расстояние и глубину фокуса,
Ээээх такое бы на 1.26а...
0
13
1 месяц назад
0
А какой алгоритм юзается для сглаживания камеры? Какие точки рельефа берутся во внимание?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.