Темы:
Данная статья является продолжением перевода материала TutorialVehicle, размещенного на сайте LSL Wiki.
Предыдущие части:
Часть 1
Часть 2
Часть 3
Часть 4
Часть 5
Плавучесть (Buoyancy)
Транспортным средствам в SL присуще свойство плавучести (вертикальная сила, направленная вверх), независимое от функции llSetBuoyancy. Рекомендуется не использовать их совместно! Для задания плавучести объекта нужно установить параметр VEHICLE_BUOYANCY в значение между -1,0 (экстрагравитация) и 1,0 (полная антигравитация).
Свойство плавучести независимо от свойства парения (hover). Однако для того, чтобы парение работало без необходимости задавать большое значение параметра VEHICLE_HOVER_HEIGHT, параметр VEHICLE_BUOYANCY должен быть установлен в 1,0.
Не рекомендуется смешивать плавучесть транспортного средства с вызовом процедуры llSetBuoyancy. Скорее всего, это приведет к тому, что объект улетит в космос.
Парение или зависание (Hover)
Свойство парения активируется установкой параметра VEHICLE_HOVER_TIMESCALE в значение, меньшее чем 300 секунд; большие значения полностью нейтрализуют это свойство. Большинство транспортных средств лучше всего функционирует с короткой постоянной времени парения – несколько секунд или менее. Чем меньше постоянная времени, тем быстрее объект приблизится к заданной высоте. Заметьте, значения параметра VEHICLE_LINEAR_FRICTION_TIMESCALE могут влиять на скорость парения.
Парение независимо от плавучести, однако параметр VEHICLE_BUOYANCY должен быть установлен в 1,0, иначе объект не оторвется от земли до тех пор, пока параметр VEHICLE_HOVER_HEIGHT не будет установлен в значение, достаточное для противодействия ускорению свободного падения, и объект никогда не взлетит до заданной высоты.
Значение параметра VEHICLE_HOVER_EFFICIENCY изменяется от 0,0 (плавучесть) до 1,0 (сглаженность). Значения в области нуля заставят объект парить немного ниже заданной высоты, и параметр VEHICLE_HOVER_TIMESCALE будет приблизительно равен периоду колебаний высоты.
По причинам, связанным с производительностью, до тех пор пока не будет улучшен физический движок Second Life, транспортные средства могут парить только над поверхностью земли или воды; они не могут парить над объектами, сделанными из примитивов, такими как мосты и дома. По умолчанию парение будет происходить над поверхностью земли или воды, однако это может быть изменено установкой некоторых флагов.
Если вы делаете корабль, то следует установить флаг VEHICLE_HOVER_WATER_ONLY, а если вы хотите управлять танком на воздушной подушке под водой, вам нужно установить флаг VEHICLE_HOVER_TERRAIN_ONLY. Наконец, для подводной лодки и воздушного шара понадобится флаг VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT. Заметьте, эти флаги независимы друг от друга, и установка несовместимых флагов приведет к непредсказуемому поведению. Напомним, что флаги устанавливаются с помощью процедуры llSetVehicleFlags.
Параметр VEHICLE_HOVER_HEIGHT определяет, как высоко над поверхностью земли и/или воды или на глобальной высоте будет парить объект. Максимальное значение этого параметра составляет 100 м, а минимальное – чуть больше нуля. Значения, равные или меньшие нуля, не имеют действия. Заметьте, с точки зрения свойства парения "центр" транспортного средства находится в его центре масс, что не всегда очевидно для нетренированного глаза, и положение центра изменяется, когда аватар находится внутри транспортного средства.
Примечание: "Мои тесты показали, что это неверно, и высота отсчитывается от центра рутового прима", - сообщает Lex Neva.
Опорный каркас (Reference Frame)
При определении транспортным средством предпочтительного направления движения в расчет принимаются оси X (at - прямо), Y (left - влево) и Z (up - вверх). По умолчанию эти оси идентичны локальным осям рутового примитива объекта, однако это значит, что рутовый примитив должен быть ориентирован согласно расчетным осям транспортного средства. Но как быть, если объект уже создан с рутовым примитивом, оси которого не согласованы с обычным движением транспортного средства? В этом случае на помощь приходит параметр VEHICLE_REFERENCE_FRAME. Благодаря ему оси транспортного средства могут быть переориентированы произвольным образом.
В качестве примера возьмем ракету, состоящую из большого цилиндра, конуса в качестве носовой части и нескольких растянутых и урезанных боксов для оперения, связанных между собой с цилиндром в качестве рутового примитива. Осью симметрии цилиндра является его локальная ось Z, а ось X (цилиндра, а значит и ракеты) направлена вбок цилиндра, в то время как ось X ракеты должна быть направлена вдоль ее конструкции. Фрагмент кода, приведенного ниже, развернет оси объекта так, чтобы локальная ось Z стала осью X, а отрицательное направление локальной оси X стало осью Z:
Повернуть каркас транспортного средства на -PI/2 вокруг локальной оси Y
rotation rot = llEuler2Rot(<0, PI/2, 0>);
llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, rot);
Вот другой пример использования параметра VEHICLE_REFERENCE_FRAME. Представьте себе летающий аппарат, использующий вертикальное притяжение (vertical attractor) для обеспечения стабильности в полете, но обладающий возможностью вертикального взлета и посадки. Во время полета надфюзеляжная ось аппарата должна быть направлена вверх, но во время посадки вверх направляется его носовая часть. При посадке объекта можно сделать следующее: в то время как действует вертикальное притяжение, поверните существующий параметр VEHICLE_REFERENCE_FRAME на +PI/2 вокруг оси Y, и объект развернется носовой частью вверх. Транспортному средству можно предоставить возможность свободно снижаться на посадочную площадку под действием сопротивления или убывающего эффекта зависания (hover).
Продолжение следует.
Источник TutorialVehicle














