Примитивы

параметры моделей

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

Ресурсы и объекты (модели)
Начну с напоминания того, что 3D модели в Shockwave3D строятся на основе некоторой информационной структуры, или ресурса. Все, доступные для использования в сцене ресурсы хранятся в сцене в списке modelResource и доступны либо по уникальному имени, либо по числовому индексу. На основе каждого ресурса можно создать сколько угодно копий видимых объектов, но ресурс объектом не является. Чтобы окончательно понять эту идею и закрепить ее в голове, проведем аналогию с реальным миром. По чертежам автомобиля можно создать сколько угодно автомобилей, но сам чертеж автомобилем не является. Ресурс хранит информацию, о типе примитива и для каждого типа еще свои уникальные настройки.
Теперь, когда мы разобрались с ресурсами, предлагаю перейти к объектам (моделям). Как и ресурсы, объекты сцены доступны по названию или индексу, но теперь уже в списке model. Каждая модель несет в себе довольно обширную информацию и постепенно, в процессе изучения Shockwave3D, мы узнаем о наиболее значимых, с практической точки зрения, параметрах.

Практика
Теперь наступил тот долгожданный миг, когда целесообразно перейти от теории к практике. Открываем etalon.dir в Macromedia Director (хотя рекомендую сохранить под другим названием). Сразу же давайте забросим w3d в Code:Object Inspector, как мы это делали в предыдущем уроке. Нам придется часто обращаться к этому окну, чтобы следить за динамикой изменения мира. В рамках этого урока нас будут интересовать ветви modelResource и model, но рекомендую полазить по всему дереву (навредить не сможете, а полезностей узнаете много).
Изменению, в рамках урока, будет подлежать только функция beginSprite.
Создание ресурса сцены на основе встроенной библиотеки примитивов осуществляется посредством метода newModelResource Для начала создадим ресурс с чертежами сферы.

on beginSprite me
initScene(sprite(me.spriteNum), 400, 0, 0)

sphereRes = scene.newModelResource("sphere", #sphere, #front)
end
Заметим, что newModelResource написан через точку (селектор членов класса в ООП) после глобальной переменной scene, что означает, что ресурс создается именно для этой сцены (и так для всего, что написано через точку :) ). Новоиспеченный ресурс сохранится в локальной переменной sphereRes (это позволит не искать каждый раз ресурс по имени). Сразу обрадую, что после запуска мы ничего не увидим, поскольку самого видимого объекта еще не существует. Существуют только чертежи объекта. Теперь разберемся с параметрами метода newModelResource.
Первый параметр, это текстовое уникальное имя ресурса. Именно по этому имени мы будем находить интересующий нас чертеж в списке modelResource.
Второй параметр - тип стандартного примитива. Может принимать следующие значения:
#box - прямоугольник (коробка);
#cylinder - цилиндр (призма);
#sphere - уже знакомый нам шар (сфера);
#plane - плоскость (просто плоский квадрат);
#particle - система частиц. Наиболее сложный и важный примитив, заслуживающий отдельного урока;
Третий параметр - видимая поверхность примитива. Каким образом система вычисляет какая сторона лицевая, а какая - нет, это тема урока о создании нестандартных примитивов. Параметр принимает одно из следующих значений:
#front - видимой стороной является лицевая (стандартный вариант);
#back - видимая сторона - изнаночная. Примитивы будут выглядеть вывернутыми наизнанку;
#both - обе стороны являются видимыми. В редких случаях это бывает оправданно;
Теперь давайте создадим экземпляр сферы в мире.

on beginSprite me
initScene(sprite(me.spriteNum), 400, 0, 0)

sphereRes = scene.newModelResource("sphere", #sphere, #front)
sphere0 = scene.newModel("sphere0", sphereRes)
end
В этом фрагменте, при помощи метода newModel, на основе ресурса sphereRes, создается видимый объект с именем "sphere0". Ссылка на новоиспеченный объект сохранена в переменной sphere0. Аналогичным образом будут создаваться и объекты других типов. Вот теперь, после запуска приложения, мы сможем наблюдать сферу в центре сцены.
Сейчас я предлагаю заглянуть в Code:Object Inspector и в ветке modelResource изучить параметры, которые мы можем менять в ресурсе сферы, чтобы изменять ее структуру:
- radius - радиус сферы;
- startAngle, endAngle - начальный и конечный углы отрисовки. Позволяют отображать часть сферы (например половину);
- resolution - разрешение (качество). Задает уровень детализации. Изменяя параметр, можно создать как идеально гладкую сферу, так и просто некое подобие куба;
Сейчас попробуем поиграться с параметрами и вывести на экран нечто эдакое:

on beginSprite me
initScene(sprite(me.spriteNum), 400, 0, 0)

sphereRes = scene.newModelResource("sphere", #sphere, #front)
sphereRes.radius = 50.0
sphereRes.startAngle = 30.0
sphereRes.endAngle = 180.0
sphereRes.resolution = 4
sphere0 = scene.newModel("sphere0", sphereRes)
end
Видим почти полусферу низкого качества, радиусом 50. Кстати в том, что полусфера прозрачна изнутри повинен параметр #front при создании ресурса. Поиграйтесь с этим параметром, чтобы увидеть, что получится.
Теперь я хочу освободить место для создания нового типа моделей. Для этого нужно подвинуть старую модель в право на 100 единиц. Изменение положения объекта происходит при помощи изменения параметра transform.position. О перемещениях мы еще поговорим в отдельном уроке, однако никто не запрещает использовать существующие возможности уже сейчас, без глубокого понимания сути вопроса. Фрагмент процедуры beginSprite будет выглядеть таким образом:

sphereRes.endAngle = 180.0
sphereRes.resolution = 4
sphere0 = scene.newModel("sphere0", sphereRes)
sphere0.transform.position.x = 100.0
Теперь давайте напишем фрагмент, создающий пару цилиндров с разными параметрами. Следующий фрагмент кода будет полезен еще и тем, что я его оформлю без использования переменных. Вместо них я буду использовать вызов элементов списков modelResource и model. Вызов можно производить по названию заключенному в круглых скобках, или по числовому индексу в квадратных скобках.
Следующий код нужно добавить в конец процедуры beginSprite.

scene.newModelResource("cylinder", #cylinder, #front)
scene.modelResource[3].resolution = 10
scene.newModel("cylinder0", scene.modelResource("cylinder"))
scene.model("cylinder0").transform.position.x = -100.0

scene.newModelResource("cone", #cylinder, #front)
scene.modelResource[4].topRadius = 0.001
scene.modelResource[4].bottomRadius = 50.0
scene.modelResource("cone").resolution = 2
scene.newModel("cone0", scene.modelResource("cone"))
scene.model[3].transform.position.y = -100.0
scene.model[3].transform.position.z = -100.0

scene.newModelResource("prizma", #cylinder, #front)
scene.modelResource("prizma").resolution = 1
scene.modelResource("prizma").height = 20
scene.newModel("prizma0", scene.modelResource("prizma"))
scene.model("prizma0").transform.position.z = -100.0
scene.newModel("prizma1", scene.modelResource("prizma"))
Данный код добавляет последовательно круглый цилиндр, пирамиду с трехгранным основанием и два клона сплюснутой трехгранной призмы. Кстати относительно вызова по индексу, то не рекомендую его использовать, поскольку при изменении в коде номер в списке может меняться, да и читать код с названиями проще чем с индексами, которые неизвестно что означают.
В итоге картина должна получиться такой:

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



Источник: http://touch3d.net