пятница, 31 октября 2008 г.

Основы строительства

Ну что же, все взяли блокноты и ручки?
Начнём наш урок, посвященный азам строительства.

Всё, что вы видите вокруг, все предметы: здания, средства передвежения, различные украшения, вплоть до ювелирных, а так же предметы одежды - все сделаны из примитивных объектов, которые в дальнейшем мы будет называть просто ПРИМЫ (prim).

Итак, чтобы начать что-то строить, вам необходимо самое главное - желание строить!
Хочу отметить, что строить лучше в так называемых "песочницах" (sandbox), так как в них разрешенное время существования объектов превышает несколько часов (иногда безгранично) - всё зависит лишь от владельца земли.
Ну, раз мы оказались как раз в песочнице, то давайте сразу что-нибудь построим! Есть 2 простых варианта создать объект:
1 - нажать кнопку "Build" в нижнем меню, по умолчанию сразу будет активна кнопка "Create" (волшебная палочка);
2 - правой кнопкой мыши щёлкнуть по земле, затем в появившемся круглом меню нажать "Create".
Затем кликнуть "волшебной палочкой" по месту, где вы хотите создать прим.




*примечание: в меню строительства 5 кнопок: Focus - движение камеры обзора, Move - ручное перемещение объекта, Edit - редактирование объекта, Create - создание прима, Land - изменение параметров земли (только у тех, у кого есть такие права).
*в режиме редактора есть значения: Position - основное редактирование объекта, его движение, Rotate - крутить, Stretch - растягивать, Select Texture - обработка определённой текстуры, Edit linked parts - обработка определённого прима слинкованного объекта
Давайте каждый из нас создаст по приму.
По умолчанию всегда создаётся куб.
Примы могут принимать следущие формы: куб (Box), цилиндр (Cylinder), призма (Prism), шар (Sphere), тор (Torus), туба (Tube), кольцо (Ring), скульптурный прим (Sculpted).
Все примы можно редактировать.
Нажмите кнопку "More>>" в меню строительства, затем выберите закладку "Object".
В левой части меню мы можем регулировать расположение прима по осям X,Y,Z (Position), изменять его размеры (Size) и вращать по осям (Rotation).
Так же можно выбрать материал (Material) своего прима - по крайней мере каждый материал производит определённый звук, если по нему ударить)))



*в закладке Object есть несколько параметров под заголовком Edit object parameters
Locked - не изменить тогда объект, Physical - становится физическим, Temporary - временный (исчезнет сам через минутку), Phantom - "призрак" - то есть через него можно будет пройти
"вес" объекта зависит от его размера и от материала, из которого ты его "сделал"
Рассмотрим правую часть меню:
Нажав кнопку "Building Block Type" мы можем изменить форму прима на любую другую.
Однако давайте пока разберёмся с кубом!



Все сделали свои примы в форме куба? Поехали дальше!
Дальше мы видим "Path Cut Begin and End". Буквально "Резка от начала (B) до конца (E)".
Увеличивая параметр B (начало) или уменьшая E (конец) - мы фактически вырезаем часть прима.
Чтобы снова сделать его целым - вручную проставьте значения "0" для B и "1" для E.
Продолжим?
"Hollow" - отверстие, полость. Чем больше вы поставите значение, тем больше будет отверстие внутри прима. Максимальное значение - 95. Этот параметр есть у примов всех форм.
"Hollow Shape" - отверстие (полость) может быть разной формы: круглой, квадратной, треугольной. Измените - увидите.
Дальше начинается самое интересное!
"Twist Begin and End" - закручивание начала (B)и конца (E).
Максимальное значение - 180 градусов. Но если закрутить начало (B) на 180 градусов в одну сторону, а конец (E) - на 180 градусов в другую, т.е. поставить значение "-180", то в итоге мы получим все 360!
Frige Fride: Примы типа торуса допускают твист от -360 до 360
Головокружительно, не так ли? :) Это удобно использовать при создании чего-то элегантного...
Вернём все значения к "0", чтобы разобраться в остальных параметрах. Готовы?
"Taper" - сведение сторон по оси X и Y друг к другу.
Сведя их вплотную (крайние значения "1" и "-1") можно получить пирамиду или что-нибудь другое. Хотя и не всегда требуется сводить их вплотную - иногда достаточно минимального "искривления"
Выравняли на нули? Поехали дальше!
"Top Shear" - "сдвиг" паралельных сторон по оси X и Y.
Ну а теперь можете поиздеваться над примом - крутите и режьте как вам угодно)))
Итак, у куба (Box), цилиндра (Cylinder) и призмы (Prism) параметры редактирования, которые вы сейчас подробно рассмотрели, ОДИНАКОВЫ.
У шара (Sphere) - меньше.



"Вращение" (Twist) начала и конца - выглядит так, будто вы его завязываете в узел.
"Dimple Begin and End" - "Впадина" - фактически это "резка", но только по другой оси.
Кстати, "треугольная" полость в шаре даёт интересный результат!
Перейдём к следующему типам примов. Торус (Torus), Труба (Tube), Кольцо (Ring).
На мой взгляд - это самые интересные примы)))



Рассмотрим Торус, его специфические параметры
"Hole Size" - "размер отверстия" - Уменьшение числа X уменьшает высоту прима, Изменение числа Y меняет радиус внутреннего отверстия - увеличивая Y, вы увеличиваете боковые стенки прима (и наоборот).
"Profile Cut Begin and End" - "вырезание внутренней (B) и/или внешней (E) стороны прима".
Красивый вид резки)))
"Taper" при изменении значения X уменьшает высоту одного из концов прима, при изменении занчения Y - толщину (значение может быть как отрицательным, так и положительным).
"Radius Delta" - различие радиуса начала прима от его конца. То есть прим получается "завёрнутым" вовнутрь (значение может быть как отрицательным, так и положительным).
"Revolutions" - создание спирали. Максимальное количество полных витков - 4. Минимальное соответственно - 1.
При изменении параметра Skew в отрицательную сторону, Спираль может создаваться закрученной всегда не только в одну сторону.
В сочетаниями с другими параметрами "Revolutions" может дать нам пружину, штопор или ещё какую-нибудь "финтифлюшку", которой вы сами придумаете имя.
Теперь создайте свежий прим Торуса (тубы или кольца) и закрутите его с помощью "Twist Begin and End". Интересный получается результат))
Если закрутить B и E в обратных направлениях (360 и -360), то получим полноценный четырёхлопостной винт!
Итак. Торус, Туба и Кольцо имеют одинаковые параметры. Если вы поменяете тип прима (Building Block Type) на другой тип (торус, туба, кольцо), то увидите, что слегка изменяется только форма прима. Параметры объектов остаются прежними.
Кстати, если вы переключите тип на другой, с более "бедной" палитрой параметров объекта, то настройки первоначального могут "обнулиться".
Так. А теперь давайте что-нибудь построим! Ну например стул.
Создайте ножку стула. Любую: из куба, цилиндра... Уменьшите её стороны (X и Y) и увеличьте высоту (Z) в параметре (Size).



Все параметры задаются в метрах, так что прикиньте сами какой высоты и размера будет стул.
Двигайте ножку так, чтобы она нормально стояла на земле (ну или слегка висела в воздухе). Постарайтесь её не потерять))
Чтобы не создавать заново вторую (третью и четвёртую) ножки, можно всего лишь ЗАЖАВ (и удерживая) SHIFT, слегка подвинуть ножку влево или вправо (можно и вверх, но сейчас это не требуется).



Вот у вас и получилась копия!!! Подвиньте её на нужное расстояние.
Теперь, чтобы скопировать сразу две ножки, зажав SHIFT, кликните по второй. После того, как у вас выделены 2 ножки - копируете, зажав SHIFT их в сторону на нужное расстояние.



Готовы ножки? Сделаем сиденье! Создадим куб. Изменим до нужной величины длину-ширину-высоту и подвинем её, поставив на ножки.
Готово? Чтобы собрать объект воедино, соединить между собой примы, мы их "слинкуем"! Сначала SHIFT-ом выделим ВСЕ свои примы, которые надо "склеить". "Склеивание" выполняется через верхнее меню Tools -> Link (или нажатием Ctrl+L).



Кстати, выделять для линковки можно просто мышью, только надо быть уверенным, что в "объединение" не попадут другие, чужие объекты.
*SOb Zemlja: чтобы не попали, в меню Tools можно отметить пункт "Select only my objects"

Присядьте теперь на своё творение! Надо увеличить или уменьшить стул? Нет проблем! Встаньте с него. А теперь , зажав и удерживая CTRL+SHIFT подвигайте за один из белых маркеров. Меняется размер объекта целиком.



Максимальный размер прима - 10 метров. Минимальный - 0.01 метра. Соответственно увеличить "слинкованный" объект можно до тех пор пока один из примов не достигнет максимального размера - 10 метров, уменьшить - пока один из составляющих примов не достигнет 0.01 метра.
"Link" срабатывает для объектов, находящихся между собой на расстоянии до 30 метров. Максимальное количество примов при "линковке" - 256.
Итак... У нас получилась табуретка. В принципе можно создать новый прим, чтобы сделать спинку стула. А можно скопировать и развернуть сиденье.
Чтобы "разлинковать" объект - нажмём в верхнем меню Tools -> Unlink (либо Ctrl+Shift+L).
Все разлинковали?
Скопируем сиденье стула вверх. А теперь, Зажав и удерживая CTRL, повернём по нужной оси так, чтобы получилась спинка! Теперь, двигая спинку по осям, поставим её на место.
*SOb Zemlja: при строительстве сложных объектов лучше менять размеры прима, чем лишний раз его вращать. Не развёрнутый прим легче ровнять, проще считать в уме положение и размеры, проще размещать на нём текстуру.



Чтобы увеличить сторону объекта - зажать и удерживать CTRL+SHIFT - я растянуть один из цветных квадратиков в нужное направление!
Получилось? Теперь можно снова "слинковать" стул! Присядем? :)
Итак, ещё немного о строительстве. Можно строить, двигая предметы "на глаз", а можно изменять необходимые знчения в строительном меню вручную.
Если двигать объект по какой либо оси (т.е. левая кнопка мыши" у вас зажата при этом), то чем дальше мы отведём от оси мышь, тем с большим округлением будет объект перемещаться по оси (например на каждые 0.5 метра или больше).
То же самое происходит, если мы "тянем" объект, зажав CTRL+SHIFT. Чем дальше отводится мышь от оси движения, тем с большим шагом происходит изменение.
При линковке последний выделенный прим становится "главным", т.е. именно его параметры мы будем видеть из всего объекта.
Чтобы сделать "главным" нужный прим, надо выделив весь объект в "неслинкованном" состоянии, щёлкнуть, зажав SHIFT, по необходимому приму (он отделяется от общего объекта), а потом снова нажимаем по нему с SHIFT-ом. Можно линковать!
последнее тогда: в режиме редактирования в закладе General (или щёлкнув дважды по объекту в инвентаре) можно: Allow anyone to move - все смогут двигать твой объект, Allow anyone to copy - смогут каопировать его к себе в инвентарь, For Sale - ты сможешь установить на него цену - может кто-нибудь купит.


Спасибо Омону и Собу!!!

© Omon Rau, SOb Zemlja, dimm Torok

Режим Flycam с мышкой

Для съёмки Machinima в Second Life сделан специальный режим — Flycam. В этом режиме камера перемещается отдельно от аватара и как бы летает над снимаемой местностью.



Одно «но» — режим рассчитан на управление джойстиком, в крайнем случае манипулятором Space Navigator. Попробуем заставить его работать с мышкой (в моём случае с трекболом).

Т.к. без джойстика режим Flycam просто не активируется, нам нужно добавить в систему джойстик. Мы добавим эмулятор. После недолгих поисков я остановился на PPJoystick. Штука, судя по форуму, проверенная, к тому же периодически обновляется. Качаем, распаковываем, запускаем Setup.exe, соглашаемся установить неподписанные драйверы. В системе появится устройство Parallel Port Joystick bus.

После установки программы скорее всего откроется окно с ярлыками настройки. Если не открылось, открываем: Пуск → Программы → Parallel Port Joystick → Configure Joysticks.



Нажимаем Add.



Ещё раз.




Проверяем, что появился PPJoy Virtual joystick 1, нажимаем Done.

В папке, откуда мы запускали setup.exe, лежит программа PPMouse.exe, собственно она занимается переводом движений мыши в команды джойстика. Запускам и настраиваем соответствие движений мыши осям джойстика. Всего в данном эмуляторе мы можем настроить 4 «оси»: наклон вперёд-назад, наклон вправо-влево, сдвиг вверх-вниз, и вращение.



Движение мыши горизонтально будет отображаться на ось 0, с зажатым Shift — на ось 3, при этом движение по оси 0 будет продолжаться.



Движение мыши вертикально будет отображаться на ось 1, с зажатым Shift — на ось 2, при этом движение по оси 1 будет остановлено (условие 1: ни один Shift не должен быть нажат).



Вращение колеса мыши сбрасываем.

На закладке Centering (сброс позиции осей по центру) проверям, чтобы в первых двух строчках фигурировал только LAlt, ненужные кнопки можно удалить крестиком. Для назначения — нажать на кнопку в программе потом на кнопку на клавиатуре.
На закладке Test Joystick можно посмотреть, как двигается джойстик, параметры на ней лучше во внимание не принимать.
Нажимаем Save Config и задаём имя файлу конфигурации.
Запускаем Second Life (программа PPMouse должна быть открыта, т.к. фактически она и есть эмулятор). Заходим в Edit → Preferences → Input & Camera → Joystick Setup, настраиваем всё по картинке:



  • Ось X — движение камеры влево-вправо, не поворот!

  • Ось Y — движение камеры вверх-вниз, не поворот!

  • Ось Z — движение камеры вперёд-назад, не Zoom!

  • Yaw — поворот камеры влево вправо

  • Pitch — поворот камеры вверх-вниз

  • Zoom — и в Африке зум (наезд камерой, увеличение)

  • Roll — не понял


Значение Scale, применительно к данному описанию — чувствительность мыши. Скорее всего придётся подстраивать на каждой конкретной системе. Менять имеет смысл с шагом не более 0.1.

К сожалению наши возможности при использовании мышки — любые 4 пункта из 7.

Внимательнее с галочками. Из важного: Auto Level — отвечает за автоматическое выравнивание «крена» после разворотов камеры; Feathering — «тяжесть» камеры, в крайнем левом положении камера наиболее инерционна, все движения неспешные и плавные, в крайнем правом… лучше не пробовать, истина, в нашем случае, где-то ближе к левому положению.

Теперь можно попробовать режим Flycam. Жмём Alt-Shift-F, сбрасываем положение осей джойстика нажатием на левый Alt, двигаем мышь и смотрим, что получилось.

© SOb Zemlja

четверг, 30 октября 2008 г.

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

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

Для начала давайте рассмотрим основные настройки камеры и отображения, которые нам могут пригодиться. Во-первых, давайте снимем ограничения с радиуса удаления камеры непосредственно от аватара. Для этого войдя в расширенное меню (Advanced Menu) найдем пункт Disable Camera Constraints и влючем его.



Теперь ваша камера может удаляться от аватара настолько, насколько позволяет настройка окружающей видимости (Ctrl-P -> Graphics -> Draw Distance). Теперь вы можете, используя клавишу Alt, одну или в комбинациях с Ctrl и Shift, нажав и удерживая левую кнопку мыши, перемещать камеру в довольно-таки широких пределах. Рекомендую потренироваться перемещать ее плавно и относительно медленно.

Неплохие результаты дает состояние mouselook, если отключить "прицел". Делается это также через расширенное меню:



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

Однако клиент Second Life обладает встроенным механизмом перемещения камеры отдельно от аватара, причем, аватар может при этом жить самостоятельной жизнью - камера становится полностью независимой. Для управления камерой в этом режиме вам потребуется джойстик. Впрочем, можно обходиться и без него, выставив камеру в позицию и "отвязав" ее от аватара, если нужно заснять какие-либо его действия. Но с джойтиком куда удобнее. Включается этот режим достаточно просто:



Однако, следует помнить, что до того, как воспользоваться этим режимом вы должны разрешить использование джойстика в настройках: Ctrl-P -> Input & Camera -> Joystick Setup -> Enable Joystick



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

Теперь, при нажатии комбинации Alt-Shift-F камера перейдет в независимый режим и будет управляться только с джойстика. Изменяя значения коэффициентов по осям вы можете регулировать скорость отклика камеры на отклонения джойстика, а также глубину этих отклонений.

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

Более подробно про настройку различных джойстиков и режим FlyCam можно почитать в официальной вики от липедоидов, но, к сожалению, на английском языке.

Итак, пока вы осваиваетесь в управлении камерой, я напишу цикл статей о том, как же выбрать подходящий план, как снимать кадрами (кадром в кино считается короткое законченое действие одного плана), как осуществлять монтаж при помощи программы Sony Vegas, а также как подобрать музыкальное сопровождение и как записать и наложить озвучку. Маленьким бонусом будет инструкция по использованию Macromedia Encoder'a для того, чтобы создавать файлы формата FLV высокого графического качества, чтобы ваши ролики выглядели на все сто.

Manoul Carnell

Как снимать видеоролики в Second Life при помощи программы FRAPS

Процесс съёмки программой FRAPS прост до невозможности. Но есть несколько моментов, которые помогут вам более качественно снять Ваш видеоролик. По порядку...

1. Скачиваем и устанавливаем программу FRAPS. Можно вот здесь, но можете поискать более продвинутые версии на просторах интернета. Ссылка с официального сайта, но в той версии можно снимать отрывки не более 30 секунд.

2. Запускаем Second Life, думаю уже многие научились это делать))).

3. Запускаем FRAPS.

4. Настройки минимальные, нужно всего лишь в закладке MOVIES:
-выбрать папку, куда будут сохраняться Ваши отснятые .avi-файлы (показано стрелочкой на рисунке);
-выбрать клавишу с помощь которой будет стартовать и останавливаться съёмка (у меня это F9, показано на рисунке)
-и первая небольшая хитрость, поставить галочку в поле "NO CURSOR". Если стоит эта галочка, то на снятых эпизодах не будет виден курсор от мыши. (всё это также показано на рисунке ниже).



5. Скидываете FRAPS значком свернуть. Продолжаете наслаждаться виртуальным миром Second Life. И вдруг, Вам захотелось что-то запечатлеть, например какой-то интересный момент для конкурса машинимы. Просто нажимаете кнопку старта записи (у меня F9). Остановка записи выполняется той же клавишей. Видите как всё просто?

6. Каждый эпизод (с момента старта и до остановки) записывается отдельным .avi-файлом (с датой и времени съёмки в названии этого файла) в папке, которую Вы указали при настройке.

7. Должен предупредить, что записаные файлы будут достаточно большими по объёму, так что небольшой совет - не старайтесь снимать длинные эпизоды.

8. Как отключить показ имён и групп над аватарами? В клиенте в меню настроек (ctrl+P) в закладке общие (General) убрать галочки в разделе "Show names"



9. Как отключить панель чата? Нажать ESC, включение панели чата - ENTER

10. Как включить полноэкранный режим? Нажать комбинацию клавиш Alt+Enter.

11. Как отключить показ нижнего меню? В верхнем меню в закладке ВИД (VIEW) снять выделение в строчке Toolbar.

12. Как отключить верхнее меню? Комбинацией клавиш ctrl+alt-F1, этой же комбинацией и обратно включается.


Применяя пункты 8-12 вы можете получить чистую картинку без ненужного для ролика мусора на экране.

Всем удачи!

© dimm Torok

вторник, 28 октября 2008 г.

Анимации - это просто! Часть 2.

Продолжая цикл статей, посвященных анимации, сегодня мы расскажем, что такое Pose Stand и Animation Overrider (AO), а также как их изготовить самостоятельно в домашних условиях.




Pose Stand является устройством, которое позволяет проделывать массу полезных вещей с вашим аватаром. Например, используя его, вы можете подогнать парик, обувь и т.п. по размеру вашего персонажа, или же устроить ему фотосессию, используя всевозможные позы, или, на худой конец, просто испытать ваши анимации. А если pose stand научить принимать деньги и раздавать товар, то вот вам и вендор для продажи ваших анимаций.

Итак, берем три прима и делаем основу нашего pose stand.



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

Для начала запрограммируем кнопки, чтобы они хоть что-то переключали в дальнейшем. Поскольку объект у нас получается слинкованный, то воспольуемся системой передачи данных внутри объекта - llMessageLinked(). Заходим в режим редактирования и ставим галку Edit Linked Parts. Это позволит нам редактировать отдельный прим слинкованного объекта. Поставив нужную галку, тыкаем мышой в кнопку, ну, пусть это будет кнопка "НАЗАД" (которая слева). В ней нужно создать новый скрипт и написать в нем следующее:

default
{
touch_start(integer total_number)
{
if(llDetectedKey(0) == llGetOwner())
{
llMessageLinked(LINK_ROOT, 0, "bck", NULL_KEY);
}
}
}

То же самое нужно проделать и со второй кнопкой, заменить только параметр функции с "bck" на "fwd". Обратите внимание на проверку при нажатии - это сделано для того, чтобы все, кому не лень, нажимая из любопытства на всякие кнопочки, не мешали вам в вашей работе с позами.

Теперь переходим к самому основному - созданию скрипта, который будет во-первых, отслеживать, что вы загрузили в инвентарь pose stand'a, а во-вторых, по нажатию на кнопку, менять анимации на вашем аватаре. Находиться он должен в инвентаре основного, или рутового, прима. К сожалению, невозможно понятно и доступно отобразить код в рамках этого ресурса, поэтому я приготовил маленький подарок любителям методики copy&paste, который, надеюсь, заставит их пересмотреть свое отношение к этому вопросу.



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

Animation Overrider (AO) по сути представляет собой тот же pose stand, но является более интеллектуальным прибором, кроме того, прибором носимым, или гаджетом. Подробно рассматривать его устройство в рамках данной статьи мы не будем, поскольку сам по себе АО является довольно-таки сложным программным продуктом и, если будет интересно публике, я посвящу отдельную статью именно программированию АО и разбору тонкостей работы этого гаджета. Здесь же мы рассмотрим общий принцип замены анимаций, принцип работы АО, а также где его взять и как настроить для работы с тем набором анимаций, который есть у вас в наличии.

Итак, принцип работы АО достаточно прост - в каждый момент времени аватар совершает какие-то действия, стоит, сидит, шагает и т.п. На каждое действие в наборе hula существует своя анимация, которая и проигрывается согласно флагам, которые выставляются в переменной текущего состояния. Задача оверрайдера, отследив появление того или иного флага, а также других факторов (например, если аватар находится в режиме полета, но уровень воды почему-то выше его текущей координаты, то нужно проиграть не анимацию полета, а анимацию плавания и т.д.), отключить проигрывание анимации hula и запустить анимацию, которая назначена для этого действия или состояния. В большинстве АО существуют специальные нотекарты с конфигурацией .

Кроме того, АО позволяет включать и проигрывать анимации независимо от состояния аватара. Например, вы можете запустить анимацию танца, в то время, когда ваш аватар просто стоит, но в другое время, когда танцевать не нужно, АО автоматически вернет все на свои места. Таким образом, работать с АО довольно-таки просто. Загружаете в него свои анимации, правите конфиг-нотекарту, одеваете АО на себя, включаете и отправляетесь вызывать жгучую зависть окружающих.

Теперь вопрос - где же взять АО? Тут есть несколько вариантов. Самый первых - купить где-нибудь. Как правило, производители анимаций кастомизируют АО под свой стиль, изменяя внешний вид, но по сути - гаджет остается все равно сам собой и реальная стоимость любого АО заключена только лишь в анимациях, которые заложены внутри него. Без них это просто "железка", какой бы навороченный дизайн она бы не имела. Как правило, такие продукты имеют право no modify и вы наврядли сможете их дополнять своими анимациями. Поэтому есть другой вариант - взять на крупнейшем отечественном фрибае Russian Worldware бесплатный АО от Ken Zhao с правами full perm и заняться его наполнением. Бесплатных АО множество, просто смотрите на их функционал. Самое распространенное бесплатное АО, которое и переделывают под свою продукцию практически все производители анимаций, выглядит следующим образом:



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

Удачных экспериментов! А в следующей, третьей части, я расскажу, что за зверь такой - Poser и как в нем делать динамические анимации. Также раскрою секрет изготовления практически любых "реалистичных" походок при помощи этого инструмента.

Manoul Carnell

Анимации - это просто. Часть 1.

Анимации - это просто! Часть 1.



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

Для начала расскажем о сути анимаций как таковых. Существует два понятия - анимация и поза. По сути и то и то является анимацией с той разницей, что в позе всего 2 кадра, нулевой и непосредственно кадр позы, который проигрывается "кольцом", в то время как полноценная анимация предполагает некую мультипликацию множества кадров. Каждый кадр содержит пространственное положение точек скелета аватара, которых насчитывается 23, последовательное перемещение которых со скоростью таймлайна (timeline) и дает тот самый эффект анимации.



SL распознает анимации в формате BVH (*.bvh, Biovision Hierarchy), с которым работают практически все программы, так или иначе имеющие дело с анимированием модели. В этой части мы рассмотрим простенькую, но весьма полезную программу - QAvimator, которая позволит вам сделать на скорую руку несложную анимацию и практически любую позу. Кроме того, эта программа позволяет добавлять к модели предметы, что позволит вам привязать свою анимацию к тем условиям, в которых она будет использоваться после экспорта в SL, например, анимация лыжника.



Итак, скачиваем, устанавливаем, запускаем и сразу делаем вот что: в верхней панели меню кликаем Options и в выпавшей вкладке ставим галки Sceleton (отобразятся узлы скелета на модели) и Show Timeline (отобразиться окно таймлайна - раскадровки).



Все, можно приступать к созданию анимации. Для начала, давайте создадим статичную позу. Выберите тип модели - женский или мужской, это можно сделать с правой стороны окна программы, параметр Figure, и начнем. Если кликнуть по какой-либо части тела, она выделиться бледно-красным цветом и вокруг нее появяться орбы координатных плоскостей. Двигая мышкой при нажатых клавишах Ctrl, Shift и Alt мы можем изменять положение выделенной части тела в пространстве.



Клавиша Ctrl включает поворот по оси Z (синий орб), Shift по оси X (красный орб), а Alt - по оси Y (зеленый орб). При нажатии той или иной клавиши орб, за который она отвечает, становится толще. Кроме того, на правой панели интерфейса программы в группе регуляторов Rotation можно задать точные координаты, либо ползунками изменять эти значения. К слову сказать, работа с мышкой не очень удобна, к ней надо попривыкнуть, поэтому поначалу рекомендуем пользоваться ползунками.

Масштабирование общего вида (камеры) в этой программе производиться следующим образом. Нужно нажать и держать левую кнопку мыши, кликнув ей по поверхности "пола" и, шевеля мышкой, изменzть плоскость обзора. Если вы хотите приближать, удалять и перемещать камеру вокруг модели, то проделайте то же самое, нажав и удерживая Alt.

Вы можете заметить, как, по мере изменения положения той ли иной части тела модели, на таймлайне появляются разные значки. Они означают, что вы что-то делали с той или иной точкой скелет и новое положение записано. Стоит знать вот какую маленькую хитрость. На самом деле на аватар действует одновременно несколько анимаций, поэтому, если какая-то точка скелета не задействована в вашей анимации, то она будет исполнять движение по курве (curve line), обозначенной другой действующей в этот момент анимации. Именно с этим связано "вставание" с диванов во время печатания и другие мало привлекательные и неожиданные действия, виной которым - незнание аниматорами этой особенности. Поэтому, даже если какие-то точки вы не используете, не поленитесь "протыкать" их для того, чтобы избежать досадных глюков.

Стоит обратить внимание вот еще на какой важный момент - позицию модели относительно земли. Задается она единственной частью тела - тазом. Выделите тазовую область (hip) и заметите, как на правой панели активировались ползунки блока Position. Именно эта часть скелета и определяет перемещение всей модели в пространстве, поэтому для того, чтобы сделать, скажем, сидящий аватар, нужно уменьшить значение координаты Y и т.п.

Чтобы на практике показать все описанные параметры, сделаем позу человека, сидящего на земле в позе даоса.



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

Итак, в нашей позе всего два кадра - нулевой и первый. Следовательно, в окошке в нижней части интерфейса программы указываем, что Frame 2 of 2 - таймлайн сразу же сократиться. В окошке Loop ставим двоечку - это со второго кадра и до конца будем непрерывно проигрывать наш ролик, т.е. всегда один кадр. Все, можно сохранять. Открываем верхнее меню программы File -> Save или же попросту нажимаем Ctrl-S и в открывшемся окне указываем имя файла. Обязательно укажите там и расширение *.bvh, потому что из-за какого-то глюка программа иначе его не добавляет сама.

Все, наша поза готова к загрузке в SL, однако стоит учесть, что и в загрузке есть некоторые нюансы, о которых нужно помнить. Итак, в клиенте нажимаем File -> Upload Animation и выбираем получившийся файл. В открывшемся окне предпросмотра следует обратить внимания вот на какие параметры: Loop - зацикливание, для поз ставится всегда; Priority - приоритет замены анимации, чем число больше, тем выше приоритет и ваша анимация будет играть вместо встроенной, если ее приоритет ниже; Hand Pose - положение кистей рук (кулак, открытая ладонь и т.п.) и Expression - выражение лица. Настроив и проверив все заливаем нашу анимацию в грид.



Использовать ее можно, вставив в Аnimation Оverrider или в Pose Stand, если они у вас есть. А если нет, то в следующей статье мы расскажем, как самостоятельно изготовить эти весьма полезные гаджеты. Всего в этом цикле выйдет три статьи, включая эту. "Часть 2" будет содержать в себе материал по изготовлению АО и PS, а также особенности проигрывания и останавливания анимаций на аватаре, ну а "Часть 3" будет посвящена целиком особенности изготовления мультипликационных анимаций в программе, название который в устах Великих Гуру наводит благоговейный страх на каждого - POSER. Однако, ничего страшного в нем нет и вы сами во всем убедитесь, читая наши материалы.

Могу сказать, что только практика позволит вам без труда набросать любую нужную позу, поэтому не нужно бояться, а нужно просто делать, если это вам нравится и интересно. Творческих успехов, господа!

От автора: Ну а от себя могу добавить, что то, что если я сам не делаю анимаций и не торгую ими, так это означает, что это мне попросту не интересно. А раньше, бывало, делал, правда, на скорую руку по необходимости. Да и суть ли это? ;)


Manoul Carnell

Анимации - это просто. Часть 2.

Щиты. Часть 2

Нестабильные физические объекты (т-сферы) представляют собой особым образом "скрученные" физические примы, приобретающие свойства хорошо известной с детства игрушки-неваляшки. Это позволяет им, не имея никакой скриптовой поддержки, постоянно находится в движении, с каждым соприкосновением с землей или другими физическими объектами наращивая свою скорость и постоянно меняя направление движения.

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



Для усиления эффекта действия т-сфер их выстреливают по определенному вектору и с определенным начальным импульсом, а также применяют специальные скрипты, корректирующие разгон и траекторию полета снарядов. Зачастую удар т-сферы гораздо сильнее, нежели действие самого сильного кумулятивного пуша (пуш, который "стреляет" несколько раз), а учитывая то, что подобные снаряды работают на территориях с отключенным пушем и сам удар приносит физические повреждения (на землях с работающим damage), то можно считать т-сферы одним из опаснейших видов оружия на сегодняшний день.

Кроме того, подобными снарядами можно даже сбивать транспортные средства, поскольку в момент движения они все имеют статус физического объекта.

Защита от таких снарядов также решается при помощи все того же Anti-Griefing Vehicle или просто сидением на чем-либо не физическом. Что касается щитов "силового" действия, которые воздействуют на ударивший снаряд с такой же силой, но с обратным знаком, таким образом как бы останавливая его, то они попросту бессильны в этом случае, повторюсь - импульс т-сфер поистине бесконечно велик.

Теперь подойдем к самому интересному - как защититься от "смерти" на территории, где включен damage, так называемых "небезопасных территориях". Сама природа damage близка к природе пуша - это также свойство симулятора, уменьшающее жизнь аватара и при достижении в процентном отношении нуля, аватар телепортируется в свою домашнюю локацию, однако сам аватар не изменяет пространственных координат. Как правило все существующее стрелковое оружие имеет в своих снарядах способность наносить урон, уменьшая счетчик "жизни", поэтому на небезопасной территории вы можете подвергнуться атаке практически любого маньяка. Кроме того, урон может быть нанесен даже быстро движущимся физическим объектом.

Защититься от damage довольно-таки трудно - не спасет никакой внешний щит, сидение на чем-либо и все подобные меры. Поэтому мы сейчас вместе с вами самостоятельно изготовим специальный щит от этой напасти. Итак, нажимаем Ctrl-4 и создаем на земле кубик. Уменьшаем его до приемлемых размеров, скажем, 10х10х10 см. По желанию, можно его покрасить, скажем, в черный цвет - лишь бы вы сами знали, что это такое.



Далее в окне инструментария открываем вкладку Content и нажимаем кнопку New Script. Далее кликаем по появившемуся скрипту, чтобы открыть его в режим редактирования и заменяем содержимое тем, что показано ниже.



default
{
state_entry()
{
llSetSitText("Protect");
llSitTarget(<0,0,-250>, ZERO_ROTATION);
}

changed(integer change)
{
if(change & CHANGED_LINK)
{
if(llAvatarOnSitTarget() != NULL_KEY)
{
llSetPos(llGetPos() - <0,0,5>);
llSetAlpha(0.0, ALL_SIDES);
}
else
{
llDie();
}
}
}
}


Затем нажимаете кнопку Save и сохраняете скрипт. Переименовав объект, забираете его в свой инвентарь, чтобы при необходимости быстренько достать и сесть на него. В этом случае вы будете перемещены под землю на глубину 250 метров, а ваш щит, мало того, что станет невидимым, сам также спрячется под землю - мера бессмысленная, но уж, как говорится, "на всяких пожарный", чтобы не демаскировал вас. Как только вы встанете, щит самоудалится.

Чтобы видеть, что происходит на поверхности в это время, нужно "освободить" свою камеру, сняв с нее ограничение обзора. Для этого нажмите Ctrl-Shift-Alt-D, тем самым открывая два сервисных пункта меню. Из них нас интересует только один - Client. Откройте его и найдите там подпункт Disable Camera Constraints и кликните по нему. Теперь ваша камера "свободна" и вы можете обозревать окрестности как через перископ.

Так как под воздействием этого щита вас во-первых, не будет видно, а от физических пуль вас защитит поверхность земли, вы будете неуязвимы для damage.

Щиты. Часть 1

Пуш и импульс.

Сегодня мы с вами поговорим о щитах. Правда, ни обзора производителей, марок и моделей пассивной защиты аватаров, ни подробного экономического анализа "почему одинаковые на вид модели так сильно различаются в цене", в этой статье вы не найдете. Мне хотелось бы уделить внимание лишь технической стороне вопроса, и уверен, это будет по-настоящему интересно.

Практически каждый житель SL неоднократно сталкивался с агрессивными действиями других аватаров - оружия в нашем онлайновом мире существует великое множество: от детальных копий образцов, популярных в оффлайновой жизни, до сугубо виртуальных моделей наподобие эпического БФГ – "Большого Финишного Глушила". Не стоит забывать и о так называемом скрытом оружии, которое для неискушенного пользователя, как правило, остается незаметным, но все же таким же опасным, как и его более приметные "собратья".

Однако, несмотря на все изообилие оружия, видов возможных атак не так уж много. А ведь именно от этого фактора зависит выбор щита. Заметим, что решения "все в одном" пока не достигли технического совершенства - такие щиты либо не слишком удобны в использовании, либо малофункциональны, но обо всем по порядку.

Начнем с самого распространенного вида атаки - толкательной (пуш). Пуш (от англ. to push – толкать) – это свойство симулятора сообщать объекту (физическому примитиву или аватару) направление и ускорение, или, проще говоря, возможность толкать объект в заданную сторону и с заданной силой. При помощи этой функции можно практически мгновенно переместить объект из одной точки в другую, например, оттолкнуть незваного посетителя от вашей двери или, наоборот, подсадить на высокую крышу. В оружейном производстве пуш, как правило, направлен строго вверх с максимальными значениями ускорения, что приводит к широко известным в народе "полетам в космос" - на высоту около трех миллионов метров, откуда потом приходится долго и нудно падать. Оружие этого типа самое распространенное, и в настоящее время его даже объявили "вне закона". На некоторых землях эту функцию вообще отключили, и такие места можно распознать по значку с перечеркнутой ладошкой.

Защититься от оружия, основанного на пуше, проще простого – нужно всего лишь сесть на какой-то нефизический предмет. Таким образом, ваш аватар приобретет свойства предмета, на котором сидит, а следовательно, станет "прозрачным" для пуш-пуль. Замечу, что способ "сесть на что-нибудь" по праву можно считать защитой номер один, поскольку он достаточно универсален и позволяет отразить большинство видов атакующих воздействий.

Щиты, разработанные на основе перехода в нефизическое состояние, как раз и представляют собой этот самый нефизический объект, снабженный специальными скриптами, которые дают вам возможность перемещаться в пространстве (просто сидя, скажем, на земле, этого сделать нельзя). Самым известным из них является распространяемый бесплатно "Anti-Griefing Vehicle", имеющий вид небольшого красного кубика.



В случае угрозы нападения щит нужно бросить на землю, кликнуть по нему правой кнопкой мыши и выбрать в круговом меню пункт "PROTECT".



Несколько секунд - и вы защищены от злобных атакующих маньяков. Теперь можно расслабиться и спокойно подумать, что предпринять. Если возникнет необходимость отойти подальше – просто нажимайте клавиши со стрелками и летите куда вздумается.

Кстати, у этого типа щитов существует еще одна приятная особенность – находясь в нефизическом состоянии под действием такой защиты, вы запросто можете проходить сквозь стены. Ну, а зачем это нужно, и нужно ли вообще, пусть каждый решает для себя сам.

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

Родственными по действию пушу являются физические, или импульсные атаки. Принцип действия такого оружия очень прост – в ваш аватар выстреливается физический объект - болванка, которой сообщается поистине чудовищный импульс, и вас просто сносит силой удара. Импульсные атаки возможны на землях, где запрещен пуш, однако с успехом отражаются тем же самым простеньким красным кубиком, о котором рассказывалось выше.

К разновидности этого типа оружия относятся и так называемые нестабильные физические объекты, однако о них мы поговорим в другой раз.

Оружейная. Делаем мину.

Говоря об оружии в целом, нельзя не вспомнить о всевозможных гранатах, бомбах и минах. Почему бы и нет? А давайте сделаем мину, которая будет тихо и спокойно лежать себе, пока на нее кто-нибудь по невнимательности своей не наступит. К слову сказать, мину сделать гораздо проще, нежели дубину, которую мы описывали в прошлой статье цикла "Оружейная".



Итак, для прообраза возьмем старую добрую, надежную противотанковую мину ТМ-46, изготовим ее из цилиндрических примов и приступим к самому главному - замесу взрывчатого вещества. ;)


Для начала давайте определим, от какого критерия должна срабатывать мина. Очевидно, что когда на нее кто-то наступит. Окей, берем уже известное нам по прошлой статье событие collision_start() и думаем дальше, что должно произойти после того, как нога аватара-раззявы наступит на наш "тортик".

Для разнообразия предлагаю использовать знаменитый push - llPushObject(). После того, как кто-то наступает на мину, мы вычисляем его идентификатор при помощи оператора llDetectedKey() и подкидываем вверх пушем:

llPushObject(llDetectedKey(0), force_amount*llRot2Up(llGetRot()), ZERO_VECTOR, FALSE).

В переменную force_amount поместим любое произвольное большое число - ну пусть это будет 10 000 000, не особо важно. Множитель же этой переменной - функция llRot2Up() от текущего значения вращения аватара на момент срабатывания мины - просто небольшая хитрость, смысл которой я не буду сейчас разъяснять. Просто запомните, что вектор импульса <0,0,10000000> работать не будет так же, как работает эта конструкция.

Можно сделать так, что мина будет срабатывать только на технику, например, на автомобили, или же, напротив, только на аватаров. Для этого нужно проверить, что именно вызвало событие - физический объект или аватар. Делается это при помощи оператора llDetectedType(). Например, нас интересует только живая сила врага. Значит, в скрипте пишем:

if(llDetectedType(0) & AGENT)
{
llPushObject(llDetectedKey(0), force_amount*llRot2Up(llGetRot()), ZERO_VECTOR, FALSE);
}


Кроме того, для совместимости с бэтлграундами неплохо добавить значение damage - пишем llSetDamage(5000).

Ну и осталось нам совсем немного - добавить спецэффектов, как то звук взрыва, дым, огонь и т.п. Кладем в инвентарь мины заранее подобранный звук и пару текстур, дыма и пламени. Звук вообще неплохо бы подгрузить заранее, поэтому рекомендую описать событие on_rez() и вставить туда команду заблаговременной подгрузки звука:

on_rez(integer start)
{
llPreloadSound("Explode");
}


Соответственно, звук нужно проиграть в нужный момент - добавляем перед пушем оператор llTriggerSound("Explode", 1.0), которая и проиграет звук, причем, звук будет как бы вокруг, а не четко привязан к самой мине, что важно в данном случае для нас - его будет далеко слышно.

Ну и дым с огнем. Тут с одной стороны все просто, а с другой - не очень. Дело в том, что существуют специализированные функции, которые призваны для того, чтобы создавать, особо не заморачиваясь, такие вещи, как взрывы, дымы, облака, брызги и т.п. Но отчего-то их вытесняют из языка LSL, предлагая использовать новомодную систему частиц llParticleSystem() во всех случаях жизни. Не буду спорить, система мощная, но работа с ней требует все-таки довольно глубокого понимания вопроса.

Итак, нужная нам команда - llMakeExplosion(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset). Немного расскажу про ее аргументы.

  • particles - количество частиц, которое будет сгенерено при вызове функции;

  • scale - максимальный размер частицы;

  • velocity - скорость распространения частиц;

  • lifetime - время жизни частицы;

  • arc - конус выброса частиц;

  • texture - текстура, которая будет натянута на каждую частицу;

  • offset - расстояние от источника до фактического образования частиц.



Итого, остается прописать два раза эту функцию - сначала для огня, затем для дыма:

llMakeExplosion(20, 1.0, 5, 3.0, 1.0, "Fire", ZERO_VECTOR);
llMakeExplosion(20, 1.0, 5, 3.0, 1.0, "Smoke", ZERO_VECTOR);


И самое последнее - раз мина взорвалась, то ее быть и не должно. Последней строчкой пишем llDie(), которое уберет сработавшую мину с земли.

Вуаля! Сохраняем скрипт, кладем мину в свой инвентарь, достаем, маскируем и прячемся в кустах, чтобы вдоволь похихикать над каким-нибудь невнимательным аватарчиком. Надо лишь помнить, что мина наша работает только на тех землях, где пуш разрешен. Впрочем, используя материал статьи про дубину, несложно переработать ее таким образом, чтобы она работала и там, где пуша нет и в помине.

Оружейная. Делаем дубину.

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



В SL существует масса оружия, от холодного до стратегического, подробнее об можно прочитать в обзорах заслуженного ветерана и владельца русского военного острова Fynist Island Dmitry Willis'а, где он рассказывает о видах всевозможных стрелялок и пулялок, а также где такое можно приобрести, ну а мы в рамках цикла "Оружейная" научимся самостоятельно изготавливать себе всевозможные военные побрякушки. Начнем мы с холодного оружия и для начала изготовим дубину для битья супостатов по бокам. Сразу скажу, что принцип действия любого оружия в SL один и тот же независимо от визуального воплощения - нечто вылетает из него, долетает до врага и входит с ним в соприкосновение; а дальше выполняет деструктивные методы - push, impulse или damage.

Итак, создадим некую дубину - пусть она у нас будет иметь вид классической бейсбольной биты.



Далее нужно приладить ее к руке - "одеть" на правую руку и отрегулировать положение.





Теперь нужно научиться махать нашим дубинатором, для чего открываем редактирование и создаем там скрипт, который позволит нам при нажатии определенных клавиш проигрывать различные анимации, имитирующие удары. Анимации могут быть сделаны вами самостоятельно или взяты откуда-либо - особой роли не играет. Лишь бы они адекватно отражали то, что вы хотите получить - наглядность нанесения ударов. Для простоты сейчас мы воспользуемся стандартной анимацией sword_strike_R, имитирующей косые рубящие удары с плеча.

Итак, рассмотрим основные части нашего будущего скрипта:

1. Захват и опрос клавиш управления при "одевании" дубины;
2. Проигрывание анимации в момент удара;
3. Нанесение урона врагу;
4. Спецэффекты (звуки, брызги крови etc).


"Одеванием" заведует событие attach(key id), возникающее при одевании чего либо на аватар, либо снятии этого чего-либо. Параметр, который появляется при этом событии - ключ-идентификатор аватара id. Таким образом, если предмет одет и возникло событие, то в переменной id появляется значение ключа, а если же предмет снят, то id будет равно значению NULL_KEY. Проверяя это значение по возникновению события attach мы всегда можем узнать, одели или сняли предмет.

В первую очередь, при одевании предмета, нужно проверить, если ли у нас право захватить клавиши управления и проигрывать анимации. Для этого существует оператор llGetPermissions(), возвращающий целое число, биты которого говорят о том, какие права в данный момент установлены. Нас интересуют следующие битовые флаги - PERMISSION_TRIGGER_ANIMATION, позволяющий проигрывать анимации, и PERMISSION_TAKE_CONTROLS, позволяющий перехватывать события нажатия кнопок. Если такие права у нас есть, то выполняем оператор llTakeControls(), в котором указываем, какие именно кнопки мы хотим захватить. Если же по каким-то причинам у нас нет прав на эти действия, то запрашиваем оные, исполняя llRequestPermissions(). Этот оператор вызовет появление в верхнем правом углу диалогового окна, предлагающего вручную разрешить применить к вашему аватару действия по захвату кнопок управления и назначения анимации.

К слову сказать, при "одевании" необходимые нам права выделяются автоматически, но на всякий случай мы предусматриваем корректную обработку возможной ошибки, связанной с выделением прав.

Ну и, если предмет был снят, нужно "освободить" клавиши, выполнив оператор llReleaseControls().

attach(key id)
{
if(id != NULL_KEY)
{
integer perm = llGetPermissions(); // запрашиваем права
if(perm == (PERMISSION_TAKE_CONTROLS | PERMISSION_TRIGGER_ANIMATION))
{
// если с правами все ОК, "захватываем" управление
llTakeControls(CONTROL_ML_LBUTTON | CONTROL_LBUTTON | CONTROL_UP | CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ROT_RIGHT, TRUE, TRUE);
}
else
{
// если же нет, то просим нам дать эти права
llRequestPermissions(id, PERMISSION_TAKE_CONTROLS | PERMISSION_TRIGGER_ANIMATION);
}
}
else
{
llReleaseControls();
}
}


Еще один момент - при событии "одевания" и после ответа на запрос прав возникает еще одно событие - run_time_permissions(integer perm), где в perm хранится состояние выделенных прав. Нужно его также корректно обработать.

run_time_permissions(integer perm)
{
if (perm)
{
llTakeControls(CONTROL_ML_LBUTTON | CONTROL_LBUTTON | CONTROL_UP | CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_ROT_RIGHT | CONTROL_DOWN, TRUE, TRUE);
}
}


Теперь нужно описать, какие действия будет выполнять наш скрипт при нажатии на определенные клавиши. Для удобства использования сделаем так, чтобы при простом нажатии на клавиши со стрелочками аватар вел себя как обычно до тех пор, пока не нажата и удерживается кнопка мыши - лишь в этом случае при нажатии на стрелочки аватар начинал бы орудовать дубиной.

Событие, возникающее при нажатии на клавишу, называется control(key owner, integer level, integer edge). При его возникновении определяются параметры owner, содержащее ключ вашего аватара, level - битовое число, "знающее", какая кнопка нажата и не отпущена и edge, которое, в свою очередь "знает", какая кнопка удерживалась и теперь отпущена. Все действия, интересные нам должны обрабатываться только при нажатой и удерживаемой кнопке мыши - level & (CONTROL_ML_LBUTTON | CONTROL_LBUTTON) и если это так, выясняем, нажимается ли еще что-то в данный момент. Если нажимается, проигрываем анимацию удара при помощи оператора llStartAnimation().

control(key owner, integer level, integer edge)
{
if(level & (CONTROL_ML_LBUTTON | CONTROL_LBUTTON))
{
if(edge & (CONTROL_UP | CONTROL_FWD | CONTROL_BACK | CONTROL_LEFT | CONTROL_ROT_LEFT | CONTROL_RIGHT | CONTROL_ROT_RIGHT))
{
llStartAnimation("sword_strike_R");
}
}
}


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

Итак, нам нужно создать некий объект, который бы при ударе вылетал из дубины и бил прямехонько в супостата. Делать мы это будем при помощи оператора llRezObject(), который позволяет выкидывать в пространство предмет, хранимый в инвентаре родительского объекта, по определенному вектору с определенной силой. Для этого мы сначала определяем, в какой стороне от нас враг и куда нужно пулять. Делается это операторами llGetRot() и llRot2Fwd(), первый из которых возвращает вращение вашего аватара (а предполагается, что вы бьете врага, стоя к нему лицом), а второй преобразует это вращение в направление. Кроме того, неплохо было бы знать и положение в пространстве нашего аватара, что мы сделаем при помощи оператора llGetPos(). Выделим это в отдельную пользовательскую функцию kick():

kick()
{
rotation rot = llGetRot();
vector pos = llGetPos();
vector dir = llRot2Fwd(rot);
pos += dir;

llRezObject("kick_bullet", pos, dir, ZERO_ROTATION, 0);
}

Самое время переходить к изготовлению пули. В качестве нашего kick_bullet будем использовать обыкновенный шарик небольшого диаметра. Собственно, форма объекта может быть любой - все равно в нашем случае он будет невидимым. Также нужно решить, как именно будет наносится урон врагу. Я бы рекомендовал использовать энергию импульса и damage, что позволит пользоваться нашей дубиной даже там, где выключен push, ну и на территориях, где разрешен damage (на так называемых бэттлграундах) и "убивать" ей супостатов.

Создаем скрипт в пуле и прописываем там, что нужно делать, если пуля попала во врага. Событие соприкосновения с чем-либо называется collision_start(integer num), где num - количество столкновений. Кроме того, нам интересно еще одно событие, возникающее при начале движения пули - moving_start(). Во-первых, мы должны придать пуле способность наносить повреждения - damage. Делается это при помощи оператора llSetDamage(), придать ей свойство физического объекта STATUS_PHYSICS оператором llSetStatus() и во-вторых, увеличить силу физического удара при помощи llSetForce(), чтобы нашим врагам мало не казалось. Для этого мы в событии collision_start() определяем массу врага через llGetObjectMass() и расчитываем необходимую силу удара.

Теперь немного об утилизации отработанных пулек. Для того, чтобы не засорять окружающее пространство, добавляем в пулю такой параметр, как lifetime. Это - количество времени, которое проживет пуля с момента выстрела (начала своего движения в пространстве). Кроме того, это время попутно нам сокращает радиус действия нашей дубины, что, согласитесь, немаловажно для реалистичности ее использования. Итак, в событии moving_start() мы запускаем таймер llSetTimerEvent(lifetime), который сработав, вызовет событие timer(), в котором при помощи оператора llDie() пуля самоуничтожится. Переменная shot введена для удобства настройки боевых качеств пули - если вы ее просто выложите на землю, то она не будет самоуничтожаться, а даст вам возможность спокойно настроить необходимые параметры скрипта. Ну и еще маленькая тонкость - чтобы наши пульки, вылетев за границу мира, не падали нам в папку Lost And Found и не засоряли инвентарь, добавим статус STATUS_DIE_AT_EDGE, который будет их удалять при пересечении границы мира.

vector velocity;
float damage = 20;
float lifetime = 0.27;
integer shot = FALSE;

default
{
state_entry()
{
llSetDamage(damage);
llSetAlpha(0.0, ALL_SIDES);
llSetStatus(STATUS_PHYSICS, TRUE);
llSetStatus(STATUS_DIE_AT_EDGE, TRUE);
llSetBuoyancy(1.0);
llSetForce(<10, 0, 0>, TRUE);
}

collision_start(integer total_number)
{
key kd = llDetectedKey(0);
float fMass = llGetObjectMass(kd);
integer mass = llRound(fMass);
llSetForce(<10*mass,0,0>,TRUE);
}

timer()
{
if(shot) llDie();
}

moving_start()
{
llSetTimerEvent(lifetime);
velocity = llGetVel() * 5;
float vmag = llVecMag(velocity);
if (vmag > 0.1){
shot = TRUE;
}
}
}


Ну вот, собственно, и все. Сохраняем скрипт, забираем пулю с земли и кладем ее в инвентарь дубины. После этого хватаем дубину в руки и идем гонять нехороших злых аватаров. Что касается спецэффектов в виде брызг крови, отлетающих зубов и т.п., то это несложно реализовать, добавив в событие collision_start() соответствующие функции. Какие именно - это мы рассмотрим в следующей статье цикла, когда будем создавать огнестрельное оружие, где спецэффекты более обоснованы. ;)

Немного от автора.
Этот материал в первую очередь предназначен для людей, способных к самообучению. Поэтому я специально не привожу полные листинги скриптов - моя цель состоит именно в том, чтобы читатель разобрался в принципе действия такого оружия, в принципе работы событий в скриптах и т.п., тогда ему не составит никакого труда сделать что-то свое, придав ему именно те свойства, которые требуются. А нахаляву метод "копипаста" не прокатит. ;)


ЛИТЕРАТУРА:
http://wiki.secondlife.com/
http://rpgstats.com/wiki/index.php?title=Main_Page