Читайте также:
|
|
SimpleObject представляет собой графический примитив, базирующийся на треугольной сетке. Примерами таких примитивов могут служить сферы, параллелепипеды, конусы, одним словом все стандартные и улучшенные примитивы 3ds max. При написании плугина такого класса необходимо включить в него обработчик события buildMesh, происходящего при создании или настройке параметров объекта. Все действия по трассировке лучей, проверке столкновений, применению модификаторов к созданному объекту и т.д. будут производиться автоматически и программной поддержки с Вашей стороны не требуют.
В плугинах класса simpleObject обязательно наличие средства create.
Доступ к сетке объекта, который будет создан с помощью Вашего плугина, осуществляется с помощью предопределенной локальной переменной mesh. Данная переменная доступна в любом месте определения плугина, но чаще всего используется в обработчике события buildMesh. Вы можете корректировать ее или присвоить ей значение вновь созданной сетки. При этом допускается использование любых средств работы с сетками, которые будут рассматриваться далее.
Пример
--Плугин для создания примитивного подобия башни
plugin simpleObject tower_plugin_def name:"Tower"
classID:#(145345,543211) category:"Scripted Primitives"
(-- Блок параметров башни: Высота, ширина и глубина
parameters main rollout:params
(height type:#worldUnits ui:height default:0
width type:#worldUnits ui:width default:0
depth type:#worldUnits ui:depth default:0
)
-- Свиток для ввода и настройки параметров башни
rollout params "Two Faces Parameters"
(spinner height "Height" type:#worldunits range:[-1000,1000,0]
spinner width "Width" type:#worldunits range:[-1000,1000,0]
spinner depth "Depth" type:#worldunits range:[-1000,1000,0]
)
-- Обработчик события создания и настройки параметров башни
on buildMesh do
(-- Метод setMesh определяет конфигурацию сетки. В данном случае
-- создается грань основания башни
setMesh mesh \
verts:#([0,0,0],[width,0,0],[width,depth,0],[0,depth,0]) \
faces:#([3,2,1], [1,4,3])
-- затем созданная грань выдавливается два раза
extrudeFace mesh #(1,2) (height * 0.5) 40 dir:#common
extrudeFace mesh #(1,2) (height * 0.5) 50 dir:#common
)
-- Средство создания объекта с помощью мыши
tool create
(on mousePoint click do
case click of
(1: nodeTM.translation = gridPoint
3: #stop
)
on mouseMove click do
case click of
(2: (width = gridDist.x; depth = gridDist.y)
3: height = -gridDist.z
)
)
)
В этом примере определяется новый примитив, называемый Tower, который представляет собой примитивное подобие башни. Первое перемещение мыши, при нажатой кнопке, определяет размеры ее основания. Перемещение до второго нажатия левой кнопки задает высоту башни. Описанный в плугине свиток содержит задатчики трех анимируемых параметров: высоты, ширины и глубины. Ключевыми компонентами плугина являются средство create и обработчик события buildMesh. Create задает габариты объекта, а buildMesh приводит положение вершин в соответствие с заданными параметрами.
Внутри средства create так же определяется точка положения основания объекта, для чего применяется локальная переменная nodeTM.
В плугинах этого класса могут определяться так же обработчики следующих трех событий.
on OKtoDisplay do
Обработчик данного события должен возвращать логическое значение, либо true либо false. В случае false построенная сетка не будет отображаться в видовом окне. Данный прием используется в том случае, если некоторое значение параметров объекта приводит к невозможности корректно отобразить его. По умолчанию это значение всегда true.
Обработчик второго события
on hasUVW do
так же должен быть функцией возвращающей логическое значение. Оно равно true, если координаты вершин сетки содержат текстурные координаты и false в противном случае. Для многих стандартных примитивов в свитке параметров имеется флажок Generate Mapping Coords. Хорошим решением будет, если обработчик события hasUVW возвращает значение этого флажка.
Третье событие
on setGenUVW Параметр do
происходит при рендеринге объекта, которому назначен материал с текстурой, а данных о текстурных координатах у вершин нет. Параметр имеет логическое значение и указывает, нужны ли для рендеринга текстурные координаты, или наоборот, они лишние. Например, если в Вашем плугине имеется функция GenMappingCoords, которая генерирует текстурные координаты, то обработчик данного события может иметь такой вид
on SetGenUVW onOff do
(if onOff then GenMappingCoords ()
)
А вот пример другого плугина, который создает трубу с квадратным сечением. Для этого создаются два временных объекта – параллелепипеда. Больший из них служит основанием для трубы, а второй вырезает в нем отверстие с помощью логического вычитания. Для их создания используется функция CreateInstance, которая создает объекты так, что они не являются элементами сцены.
plugin simpleObject squareTube name:"SquareTube"
classID:#(63445,55332) category:"Scripted Primitives"
(local box1, box2
-- Блок параметров - ширина и длина основания, и высота трубы
parameters main rollout:params
(length type:#worldUnits ui:length default:1E-3
width type:#worldUnits ui:width default:1E-3
height type:#worldUnits ui:height default:1E-3
)
-- Свиток отображающий параметры объекта
rollout params "SquareTube"
(spinner height "Height" type:#worldUnits range:[1E-3,1E9,1E-3]
spinner width "Width" type:#worldUnits range:[1E-3,1E9,1E-3]
spinner length "Length" type:#worldUnits range:[-1E9,1E9,1E-3]
)
-- Обработчик события построения сетки
on buildMesh do
(if box1 == undefined then
(box1 = createInstance box; box2 = createInstance box)
box1.height = height; box2.height = height
box1.width = width; box2.width = width * 2
box1.length = length; box2.length = length * 2
mesh = box2.mesh - box1.mesh
)
-- Средство задание параметров объекта с помощью мыши
tool create
(on mousePoint click do
case click of
(1: nodeTM.translation = gridPoint
3: #stop
)
on mouseMove click do
case click of
(2: (width = abs gridDist.x; length = abs gridDist.y)
3: height = gridDist.z
)
)
)
Дата добавления: 2015-10-31; просмотров: 66 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Внесение изменений в плугин | | | Скрипт плугины класса SimpleMod |