MaxScript: Editable Poly, разбираемся вместе

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

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

Знакомство с созданием геометрии

Для этого мне пришлось воспользоваться справкой по MaxScript, причем искал я необходимый пример очень долго. Я считаю себя довольно опытным пользователем подобных инструментов, но в этот раз я мучился довольно много. Что же вызывало у меня непонимание?

Его вызывало незнание, как создать пустой Editable Poly объект. Конечно, я бы мог придумать костыль в виде «давайте я создам Plane, конвертну его в Editable Poly и удалю все вершины», но костыли — не мой конек. В разделе справки по таким объектам есть функция Create, но она отвечает за создание вершин, ребер и граней. Про это позже.

Уже и не помню где, но я нашел интересующий меня пример. Все было просто: создается пустой Editable Mesh(!) и конвертируется уже в Poly. Привожу код

Код
ep = editable_mesh name:(uniquename "EPoly") --create an empty EMesh
convertTo ep Editable_Poly

Продолжаем познавать колдунство MaxScript

С созданием пустого объекта разобрались. Как же быть с его наполнением? И тут то приходит на помощь функция Create из раздела Editable Poly. Кто не перешел по ссылке (да и кто перешел): далее следует разбор того, что я сам понял путем экспериментов.

Первая функция — создание вершины. Одной. Да, массивом нельзя, строго по одной.

Код
polyop.createVert

Здесь polyop.createVert — команда на создание вершины; <Poly poly> — объект типа Editable Poly, в котором создается вершина; <point3 pos> — позиция точки в местном формате координат (на самом деле, это просто XYZ-координаты). Данная команда возвращает номер создаваемой вершины. На живом примере:

Код
num1 = polyop.createVert ep [0,0,0]

Эта строка, в переводе на русский означает следующее: в объекте ep создать вершину с координатами [0,0,0] и присвоить ее номер в переменную num1. Двигаемся дальше, создание ребер.

Казалось бы, все должно быть просто: есть 2 вершины, между ними создаешь ребро, просто указывая их номера. Даже синтаксис функции на это намекает (код ниже). Я ее разбирать не буду, там и интуитивно все понятно, кроме одной вещи, которую и поясню.

Код
polyop.createEdge

Но если вы вызовете подобную функцию с объектом без полигонов, то вы будете неприятно удивлены: ребра не будет (может, кому-то это очевидно, но я долго не мог разобраться, в чем дело)EditPoly Edge creating1Причина в следующем: ребро не может «висеть в воздухе», а должно принадлежать какому-то полигону. Т.е. Для создания ребра необходимо создать полигон, хотя бы треугольный. Функция создания полигона:

Код
polyop.createPolygon

Единственное пояснение: <vertex array> — массив номеров вершин, на основе которых создается полигон, в порядке их обхода. Иллюстрация с массивом вершин, номера которых указаны как (1,2,4,3) при вызове функции. Бледным цветом показаны номера ребер, которые создает скрипт. Если вы укажете номера в порядке (1,2,3,4), то получите «песочные часы».

EditPoly Poly creating1

Теперь можно создать диагональные ребра (одно из них), так как они будут принадлежать созданному полигону.

EditPoly Edge creating2

Отличия MaxScript от других ЯП

Можно сказать, от одного ЯП, являющегося ООП. А именно — ActionScript 3.0, так как он мне ближе всего. По моим наблюдениям, в MaxScript функции не принадлежат объекту, т.е. не являются его частью, как в AS. В MaxScript мы пишем «функция такая-то вызывается над таким-то объектом с такими-то параметрами», а в AS и других известных мне языках всегда писалось «объект.функция(параметры)».

Кстати, моя поделка в AS 3.0, которую я хочу повторить в 3D (для этого и изучаю MaxScript).

Оставшееся непонятым

Остались вещи, которые я никак не могу понять, а именно — обращение нормалей. Вот мой код

Код
rollout TreeGrower "Tree Grower" width:170 height:450
(
 button btn1 "Create geometry" pos:[10,10] width:144 height:49
 
 on btn1 pressed do
(
 ep = editable_mesh name:(uniquename "EPoly") --create an empty EMesh
 convertTo ep Editable_Poly
 num1 = polyop.createVert ep [0,0,0]
 num2 = polyop.createVert ep [100,0,0]
 num3 = polyop.createVert ep [100,100,0]
 num4 = polyop.createVert ep [0,100,0]
 num5 = polyop.createVert ep [0,0,100]
 num6 = polyop.createVert ep [100,0,100]
 num7 = polyop.createVert ep [100,100,100]
 num8 = polyop.createVert ep [0,100,100]
 polyop.createPolygon ep #(num1, num2, num3, num4)
 polyop.createPolygon ep #(num1, num2, num6, num5)
 polyop.createPolygon ep #(num2, num3, num7, num6)
 polyop.createPolygon ep #(num3, num4, num8, num7)
 polyop.createPolygon ep #(num1, num4, num8, num5)
 polyop.createPolygon ep #(num5, num6, num7, num8)
 polyop.flipNormals ep #(1,2,3,4,5,6)
 )
)
CreateDialog TreeGrower

Но независимо от наличия в нем строки flipNormals куб получается созданным наизнанку. Кто знает, как исправить — напишите, буду благодарен. На этом все

Использованные и полезные ссылки

Официальная справка по MaxScript — ссылка

Добавить комментарий

© 2022 CAsperovskii BLOG.RU // Дизайн и поддержка: GoodwinPress.ru