Урок 5 Осветительная лампа часть 1
Осветительная лампа
Предлагаю поговорить о СВЕЧЕНИИ и ОСВЕЩЕНИИ.
Чтобы материал был более понятен, установите МИР==>СОЛНЦЕ==>ПОЛНОЧЬ.
Мы будем работать со светом, а в темноте это будет выглядеть более нагляднее.
Создадим примитив КУБ. И в его свойствах попробуем установить ОСВЕЩЕНИЕ. Для этого в СВОЙСТВАХ ОБЪЕКТА переключаемся на вкладку ОСОБЕННОСТИ и ставим галочку на СВЕТ.
Предмет начинает освещать вокруг себя. Но сам при этом не светится. Для начала давайте разберемся со свойствами ОСВЕЩЕНИЯ. Есть несколько параметров, которые можно задать. По умолчанию, СВЕТ белый. Для того чтобы изменить ЦВЕТ ОСВЕЩЕНИЯ, рядом с тем местом, где мы поставили галочку на СВЕТ есть белый квадрат. Нажмем на него левой кнопкой мыши, и у нас появляется меню, в котором мы можем установить нужный нам ЦВЕТ ОСВЕЩЕНИЯ.Давайте поставим например зеленый цвет. Цвет освещения вокруг предмета изменился, и все стало с зеленоватым оттенком. С этим, думаю, разобрались. Давайте вернем белый цвет освещения на место, и рассмотрим другие настройки ОСВЕЩЕНИЯ.
Далее, ниже, у нас есть параметр ИНТЕНСИВНОСТЬ. По умолчанию там стоит значение 1, и это максимальное значение интенсивности. С боку поля, где указано значение 1, есть две стрелочки, вверх и вниз. Если вы нажмете на стрелочку вверх, значение будет прибавляться, если вы нажмете на стрелочку вниз — значение будет соответственно уменьшаться. В поле будет отображаться текущее значение. Так же вы можете изменять значение в поле напрямую, просто вписывая нужные цифры. Делайте, как вам будет удобнее, но помните при этом, что максимальное значение поля интенсивность 1, минимальное 0. т.е. если вы попытаетесь вписать 2, например, ничего не получится. Интенсивность освещения — попросту величина яркости, с которой будет освещать предмет вокруг себя. При значении 1 — яркость освещения будет максимальна. Попробуйте менять параметры интенсивности, и вы наглядно увидите, как меняется яркость освещения вокруг предмета.
Радиус освещения — тут вроде все понятно из названия. Значение по умолчанию — 10 метров. Можно увеличить до 20 метров, или уменьшить соответственно до нужной вам величины.
Ослабление. Значение по умолчанию 0.750. Этот параметр показывает, как будет меняться яркость освещения с учетом отдаления от источника света. т.е. более близкие предметы к источнику света будут освещены ярче, чем более отдаленные от источника света предметы. Если вы установите значение этого поля в 0 — яркость освещения для всех предметов будет одинакова. И для близких, и для удаленных.
С освещением вроде разобрались. Но если использовать наш примитив в качестве осветительной лампы, нужно еще кое что. Согласитесь, странно получается, лампа освещает вокруг себя, но при этом не светится.
Давайте все исправим. Перейдем на вкладку ТЕКСТУРА. И тут мы видим параметр СВЕЧЕНИЕ, который мы и будем использовать.
Минимальное значение 0, максимальное -1. Настройте свечение предмета по своему усмотрению. Также можно менять ЦВЕТ и ПРОЗРАЧНОСТЬ. Параметр СОБСТВЕННАЯ ЯРКОСТЬ — если вы поставите галочку на него, предмет будет равномерно освещаться как будто днем, в не зависимости от того, утро, вечер или ночь вокруг.
Вот теперь это уже стало более или менее похоже на осветительную лампу в стиле модерн :) Но чтобы выключить ее, вам нужно в свойствах этого предмета снять галочку с «СВЕТ» и уменьшить значение свечения до нуля. Нда… не очень удобная лампа. Но автоматизировать этот процесс естественно можно с помощью скрипта, что мы и попробуем сделать. Задача у нас такая, если мы щелкнем по лампе мышкой, если лампа выключена — она включиться. Если она включена — она соответственно выключится.
Давайте попробуем это реализовать.
Создаем скрипт, по умолчанию если вы помните, скрипт выглядит так:
default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}
touch_start(integer total_number)
{
llSay(0, "Touched.");
}
}
Нам нужно сделать так называемый «флаг», который будет хранить в себе состояние того, включена наша лампа в данный момент, или выключена. Флаг, это таже самая переменная, которая используется для управления работы скрипта. Он нужен для того, чтобы скрипт знал, при щелчке мышкой на лампе - когда включать лампу, а когда выключать. т.е. он должен знать, включена лампа в данный момент, или выключена. И если включена — выключить ее, а если выключена — наоборот включить.
Этот флаг будет принимать только два значения, TRUE — ИСТИНА, или FALSE — ЛОЖЬ. Это так называемое БУЛЕВО значение.
x=1 все равно что х=TRUE
х=0 все равно что х=FALSE
Назовем флаг (переменную) lamp_on — лампа включена. Если значение lamp_on будет TRUE (ИСТИНА) — значит лампа действительно включена. Если значение будет FALSE (ЛОЖЬ) — значит лампа выключена. Объявим флаг глобально:
integer lamp_on;//Объявляем флаг глобально
default
{
state_entry()
{
lamp_on=FALSE; //Наша лампа выключена по умолчанию.
}
touch_start(integer total_number)
{
}
}
Сделано.
Идем дальше.
Давайте поставим условие, если лампа выключена — при щелчке на лампе мышкой скрипт должен ее включить, и наоборот, если она включена, при щелчке на лампе мышкой — скрипт должен ее выключить.
integer lamp_on;//Объявляем флаг глобально
default
{
state_entry()
{
lamp_on=FALSE; //Наша лампа выключена по умолчанию.
}
touch_start(integer total_number)
{
if (lamp_on==FALSE) //Если лампа выключена
{
}
else //Если лампа включена
{
}
}
}
Для того, чтобы изменить свойства лампы (объекта) и включить освещение и свечение мы воспользуемся функцией llSetPrimitiveParams () которая может принимать в себя список ФЛАГОВ и параметров для них.
В данном случае ФЛАГ будет обозначать определенное свойство примитива, для которого и будут применены определенные настройки, переданные через аргументы. Нас интересует пока только два флага, это :
PRIM_FULLBRIGHT и PRIM_POINT_LIGHT. Каждый из них идет с дополнительными аргументами.
[ PRIM_FULLBRIGHT, integer face, integer boolean ] — устанавливает СОБСТВЕННУЮ ЯРКОСТЬ, о которой мы говорили выше. Сопровождается двумя аргументами: fase — число, номер стороны прима, для которой включить этот параметр (ALL_SIDES — для всех сторон сразу). И boolean которое и определяет состояние параметра (TRUE — включен, FALSE — выключен).
[ PRIM_POINT_LIGHT, integer boolean, vector color, float intensity, float radius, float falloff ] — устанавливает ОСВЕЩЕНИЕ. Аргументы:
integer boolean — состояние параметра (TRUE — включен, FALSE — выключен)
vector color — цвет освещения
float intensity — интенсивность освещения
float radius — радиус освещения
float falloff — ослабление освещения
Обо всех этих параметрах мы говорили выше.
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
Установит собственную яркость примитива для всех его сторон.
llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1.0,1.0,1.0>, 1.0, 10.0, 0.6]);
Установит освещение, белого цвета, с интенсивностью освещения 1, радиусом освещения 10 метров, и ослаблением освещения 0,6.
Для этой функции флаги и их параметры так-же можно комбинировать:
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE,PRIM_POINT_LIGHT, TRUE, <1.0,1.0,1.0>, 1.0, 10.0, 0.6]);
Установит сразу и СОБСТВЕННУЮ ЯРКОСТЬ и ОСВЕЩЕНИЕ.
Давайте добавим это в наш скрипт:
integer lamp_on;//Объявляем флаг глобально
default
{
state_entry()
{
lamp_on=FALSE; //Наша лампа выключена по умолчанию.
}
touch_start(integer total_number)
{
if (lamp_on==FALSE) //Если лампа выключена
{
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE,PRIM_POINT_LIGHT, TRUE, <1.0,1.0,1.0>, 1.0, 10.0, 0.6]);
lamp_on=TRUE; //Запоминаем состояние лампы, что она теперь включена
}
else //Если лампа включена
{
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, FALSE,PRIM_POINT_LIGHT, FALSE, <1.0,1.0,1.0>, 1.0, 10.0, 0.6]);
lamp_on=FALSE; //Запоминаем состояние лампы, что она теперь выключена
}
}
}
Вместо итогов… Интересный момент. Если сделать цвет света лампы черным, лампа будет работать наоборот. Т.е. при ее включении станет еще темнее :)