???
Математика на уровне МГУ

Показано с 1 по 6 из 6

Тема: Создание миссии в деталях

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #3
    Реаниматор Аватар для Gunslinger
    Регистрация
    30.03.2003
    Адрес
    Москва
    Возраст
    43
    Сообщений
    1,284

    Работа с камерой

    Наконец-то нашлось свободное время между экзаменами для работы над своей миссий, в итоге завершено Intro и получен материал для следующей части статьи, которую я и собираюсь написать ниже.

    Сегодня затронем тему работы с камерой, создания Интро и немного рассмотрим операторское исусство.

    Во-первых, чтобы сделать для мисси Интро, надо переключить редактор в режим Advansed (кнопка с надписью режима находится в правом верхнем углу). После этого под кнопкой Clear появится меню (в белой рамке) из которого можно выбрать часть создаваемой миссии (начало, саму миссии или завершение). Выберите Интро (то есть начало). При этом с карты пропадут все юниты и триггеры, если вы уже расставили их для самой миссии (но они сохранятся и будут отображаться при переключении на создание миссии). Все три части миссии сохраняются в одном и том же файле, а именно mission.sqm.

    В Интро, так же как и в миссии, необходимо указать игрока, однако вы не сможете им управлять. Для проверки нажмите кнопку Preview в редакторе и посмотрите на результат (будет вид со спины игрока, вы сможете вертеть камеру по сторонам, но не сможете воздействовать на игрока).

    Чтобы завершить Интро, опять же как и в миссии, нужно ставить триггер типа End. Можно прописать в поле Condition этого триггера какю то переменную, например endcond. Теперь эту переменную надо определить в самом начале Интро, например в поле Initialization игрока, прописать endcond=false. Теперь, когда вам потребуется завершение Интро, пропишите в нужном триггере endcond=true.

    Перейдем к операторскому искусству. Без него невозможно создать качественный видео-ролик. Вы можете придумать хороший сюжет для него, написать много скриптов, но если вы неправильно расставите камеры, неточно подберете время, ролик не будет смотреться. Возьмем, к примеру, бой. Самолеты в воздухе летят бомбить базу. Пехота подбирается поближе к обороняющимся. Танки уже открыли огонь. На базе появляются первые жерты, паника, пожар. Но поставив камеру где-нибудь у забора игрок не увидит всей этой красоты (если пожар и смерть вообще может быть красивой). Ладно, пусть поле боя видно, но если камера будет стоять на одном месте все время, это опять же не даст положительного результата. Все движется и в скором времени камера будет показывать чистое поле, а игрок будет слышать лишь звуки выстрелов. Это необходимо учитывать.

    Также выжным является перемещение камеры. Никаких резких движений, передвижения по земле (или очень низко, такой ракурус смотрится хорошо лишь как исключение в редких случаях). Избегайте камеры, следяющий за передвигающимся игроком, вы замечали как она немного трясется в это время (благо с техникой такого не происходит). Лучше используйте заранее нацеленную на какой то объект камеру. Если же необходимо проследить за игроком. Поставьте в конечной точке (куда идет игрок) еще один объект (лучше всего использовать объекты Game Logic, т.к. их невидно они практически даже не существуют, но можно использовать их координаты) и сделайте перемещение камеры от первого объекта ко второму, рассчитав время так, чтобы камера при перемещении показывала игрока.

    Отдельно стоит упомянуть крупный план. Он смотрися хорошо в диалогах, когда можно показать лица героев, их движения. Также хороший прием, наезд юнита на камеру, например когда танк наезжает на камеру.

    Дальний вид стоит применять при крупномасштабных действиях, показе городов и прочих гигантских объектов (а также при отображении техники, движущейся на большой скорости). Когда юнитов не более 10-20, это придаст картинке дополнительную пустоту.

    В роликах можно использовать команду setacctime NUM (где num - число, во сколько раз уменьшается или увеличивается скорость течения времени). Этот же эффект достигается нажатием клавиш + и - во время игры. Если использовать 1 - это стандартное время, меньше 1 - замедление, больше 1 - ускорение.

    Вот мы и добрались до самой сути, а именно, до работы с камерой. Это довольно сложная часть создания миссии. Тут надо понять, как определять координаты х и у, т.к. при установке камер и выборе цели вам постоянно придется с этим сталкиваться. Причем, нужно помнить где сервер и где юг и как изменются координаты относительно вашей цели (я например, до сих пор все время путаюсь и подбираю координаты методом тыка ).

    Итак, существует несколько (пока опишу только те, которые наиболее часто применяются и которые я использовал сам) команд для управления камерой (их легко запомнить, т.к. все они начинаются на cam), это:
    - camCreate
    - camSetPos
    - camSetRelPos
    - camSetTarget
    - cameraEffect
    - camSetFOV
    - camCommit
    - camDestroy

    Важное замечание: ни одно изменение параметров камеры не вступит в силу, пока не будет выполнена команда camCommit! О ней в конце.

    Команда camCreate используется для создания камеры, это инициализационная, то есть самая первая команда идущая в порядке исполнения в процессе создания камеры, и писать в скрипте ее надо раньше других. Синтаксиси такой
    camname = "camera" camCreate [x,y,z]
    camname - это имя камеры, которе будет использоваться в дальнейшем при обращении к камере.
    x,y,z - сооветствующие координаты, то есть позиция, в которой будет создана камера. Можете в этой команде координаты все время указывать как 0,0,0. Т.к. потом их легко изменить командой camSetPos или же camSetRelPos.

    Если вы делаете начальный ролик не в виде Интро, а просто в начале миссии, чтобы не появлялся на пару секунд в начале заставки игрок (такой глюк иногда заметен), нужно создавать камеру сразу же при начале миссии, желательно в строке Initialization игрока (точнее в этой строке не создавать камеру, а вызывать из нее скрипт, который и создаст камеру).

    Команда camSetPos используется для задания местоположения камеры. Чтобы иметь возможность точного позиционирования, лучше всего использовать объекты Game Logic (как я уже говорил, их не видно и они не мешают игровому процессу). Например создаем объект такого типа с именем gl. Теперь чтобы поместить в его координаты камеру, достаточно прописать команду
    camSetPos getpos gl
    Не зобывайте при использовании координат объектов Game Logic прописывать getpos gl, а не просто gl. Если же вы хотите разместить камеру не точно на данном объекте, а немного сместить, например вверх, то здесь поможет такой скрипт
    glcoords = getpos gl
    x = glcoords select 0
    y = glcoords select 1
    z = glcoords select 2
    mycam camsetpos [x,y,z+10]
    Мы записали значения координат объекта gl в переменную glcoords, выделили их по отдельности, то есть записали координату по оси Х в переменную х, и т.д. Теперь камеру mycam мы может разместить относительно объекта gl, узкаывая в квадртаных скобках переменные x,y,z и прибавляя/вычитая из них цифровые значения. В данном случае камера будет находиться на 10 метров выше объекта gl.

    Команда camSetRelPos используется для установки камеры в координаты относительно координат цели камеры. Ее синтаксис похож на предыдущую команду, однако координаты здесь отсчитываются не относительно начала координат, а относительно юнита. Это удобно, например для создания крупного плана, можно разместить камеру в метре от нужного юнита используя команду (все также зависит куда направлен юнит, и с какой стороны отсчитывать метр, спереди или сзади, это все надо подбирать)
    myсam camSetRelPos [1,0,0]
    Заметьте, что здесь не обязательно что-то с чем-то складывать и указывать знак +. Если вы написали здесь 1, это уже означает что камеры смещается на 1 метр вперед в сторону цели. Чтобы сместить назад, надо использовать отрицательные числа, например -5.

    Установка цели камеры производится командой camSetTarget. Причем эту команду можно использовать и с юнитами (устанавливать в качестве цели опредеолнную технику или объекты) и точными координатами. В первом случае синтакисис будет такой
    camname camSetTarget UNIT
    Заметьте, что здесь НЕ надо добавлять команду getpos, так как здесь идет работа с самим объектом, а не с его координатами (точнее с ними тоже, но получаются они уже самой игрой).
    Второй метод, указание точных координат, как
    camname camSetTarget [х,y,z]
    Опять же здесь очень удобно использовать объекты Game Logic и метод получения их координат.

    Команда cameraEffect задает свойства и положение камеры. Ее синтаксис
    camname cameraEffect ["string1","string2"]
    Где string1 - это свойство, а string2 - положение. Существует несколько свойств:
    Internal
    External
    Fixed
    FixedWithZoom
    TERMINATE
    Обычно да и почти всегда используется Internal, так что на остальные можете не обращать внимания (если нетересно, можете с ними поэкспериментировать).
    Положения есть такие:
    TOP - вид сверху
    LEFT - слева
    RIGHT - справа
    FRONT - спереди
    BACK - сзади (обычно испольлзуется именно этот вид)
    Чтобы установить камеру над игроком, пропишите
    mycam cameraEffect ["internal","top"]
    И не забывайте про кавычки.

    Команда camSetFOV изменяет угол обзора камеры. Синтаксис
    camname camSetFOV NUM
    Где NUM - число. 1 - это нормальный обзор, если меньше 1, это приближение, больше 1 - удаление (с искажением вида). Данная команда аналогична той, что используется во всех частях игры Quake и с помощью которой игроки делают увеличение для RailGun`a. Кстати крупный план хорошо получается этой командой.

    Одна из самых важных команда при работе с камерой - это camCommit. Пока не будет исполнена данная команда, ни одно изменение с камерой не вступит в силу. Ее синтаксис
    camname camCommit NUM
    Где NUM - цифра, указываяющая время в секундах, в течение которого будут произведены изменения. Например если вы укажите 0 (myname camCommit 0), изменения произойдут немедленно, то есть камера сразу же переместится в новые координаты и т.п. Если же указать цифру больще 0, например 5, то изменения будут происходить в течение 5 секунд. То есть камера будет плавно (в зависимости от указанного времени и расстояния, чем больще расстояние, тем больше требуется времени для плавного перемещения) перемещаться из одного места в другое. Таким образом создается эффект двжиения камеры. Можно также плавно приближать камеру, изменяя угол обзора, например так
    mycam camSetFOV 0.5
    mycam camCommit 10

    И, наконец, чтобы вернуть упрвление игроку, если ролик создав в самой миссии, необходимо уничтожить камеру. Для этого используется команда camDestroy camname. Но перед удалением камеры обязательно пропишите строчку
    mycam cameraEffect ["TERMINATE","back"]
    Это уберет все эффекты с камеры и вернет ее в стандартное положение, чтобы игрок мог дальше нормально играть.

    Теперь небольшой пример. Сделаем вращение камеры вокруг игрока. Для этого вначале разместим 4 объекта Game Logic (чем больше будет объектов, тем плавнее будет круг, с 4 объектами это будет скорее ромб) на равном расстоянии (чтобы радиус был одинаковым) от игрока. Теперь создаем камеру в одном из этих объектов, целью камеры будет игрок. И перемещаем камеру от одного объекта к другому. На это перемещение задаем некотрое время, при этому нужно выждать это время командой ~, перед тем как исполнять другую команду. После того как выждано время меняйте положение камеры на другой объект Game Logic и т.д. Примерно это будет выглядеть так (с учетом того что 4 объекта и игрок расставлены, объекты имеют имена gl1, gl2, gl3 и gl4, а игрок с именем pl):

    [PHP]
    ;создаем камеру
    mycam = "camera" camcreate [0,0,0]
    mycam cameraeffect ["internal", "back"]
    mycam camsetpos getpos gl1
    mycam camsettarget pl
    mycam camcommit 0
    ;запускаем ее от объекта 1 к 2 в течение 5 секунд
    ;и выжидаем это время
    mycam camsetpos getpos gl2
    mycam camcommit 5
    ~5
    ;запускаем ее от объекта 2 к 3 в течение 5 секунд
    ;и выжидаем это время
    mycam camsetpos getpos gl3
    mycam camcommit 5
    ~5
    ;запускаем ее от объекта 3 к 4 в течение 5 секунд
    ;и выжидаем это время
    mycam camsetpos getpos gl4
    mycam camcommit 5
    ~5
    ;запускаем ее от объекта 4 к 1 в течение 5 секунд
    ;и выжидаем это время - возвращаем камеру
    ;на место, т.е. завершаем круг и выходим из скрипта
    mycam camsetpos getpos gl1
    mycam camcommit 5
    exit
    [/PHP]

    Более продвинутые скрипты (например, присоединение камеры к объекту) ищите на Эдитинге в разделе Примеры.
    Крайний раз редактировалось Gunslinger; 01.01.1970 в 03:00.
    Нет ничего более постоянного, чем перемены...

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •