MaxScript: Editable Poly, разбираемся вместе
Приветствую тебя, мой дорогой читатель! Здесь я хочу поделиться своими экспериментами с созданием геометрии программно, даже не столько экспериментами, сколько первыми открытиями и пониманием, как работает MaxScript и его отличия от изученных мной ранее языков программирования.
Знакомство с созданием геометрии
Для этого мне пришлось воспользоваться справкой по MaxScript, причем искал я необходимый пример очень долго. Я считаю себя довольно опытным пользователем подобных инструментов, но в этот раз я мучился довольно много. Что же вызывало у меня непонимание?
Его вызывало незнание, как создать пустой Editable Poly объект. Конечно, я бы мог придумать костыль в виде «давайте я создам Plane, конвертну его в Editable Poly и удалю все вершины», но костыли — не мой конек. В разделе справки по таким объектам есть функция Create, но она отвечает за создание вершин, ребер и граней. Про это позже.
Уже и не помню где, но я нашел интересующий меня пример. Все было просто: создается пустой Editable Mesh(!) и конвертируется уже в Poly. Привожу код
Продолжаем познавать колдунство MaxScript
С созданием пустого объекта разобрались. Как же быть с его наполнением? И тут то приходит на помощь функция Create из раздела Editable Poly. Кто не перешел по ссылке (да и кто перешел): далее следует разбор того, что я сам понял путем экспериментов.
Первая функция — создание вершины. Одной. Да, массивом нельзя, строго по одной.
Здесь polyop.createVert — команда на создание вершины; <Poly poly> — объект типа Editable Poly, в котором создается вершина; <point3 pos> — позиция точки в местном формате координат (на самом деле, это просто XYZ-координаты). Данная команда возвращает номер создаваемой вершины. На живом примере:
Эта строка, в переводе на русский означает следующее: в объекте ep создать вершину с координатами [0,0,0] и присвоить ее номер в переменную num1. Двигаемся дальше, создание ребер.
Казалось бы, все должно быть просто: есть 2 вершины, между ними создаешь ребро, просто указывая их номера. Даже синтаксис функции на это намекает (код ниже). Я ее разбирать не буду, там и интуитивно все понятно, кроме одной вещи, которую и поясню.
Но если вы вызовете подобную функцию с объектом без полигонов, то вы будете неприятно удивлены: ребра не будет (может, кому-то это очевидно, но я долго не мог разобраться, в чем дело)Причина в следующем: ребро не может «висеть в воздухе», а должно принадлежать какому-то полигону. Т.е. Для создания ребра необходимо создать полигон, хотя бы треугольный. Функция создания полигона:
Единственное пояснение: <vertex array> — массив номеров вершин, на основе которых создается полигон, в порядке их обхода. Иллюстрация с массивом вершин, номера которых указаны как (1,2,4,3) при вызове функции. Бледным цветом показаны номера ребер, которые создает скрипт. Если вы укажете номера в порядке (1,2,3,4), то получите «песочные часы».
Теперь можно создать диагональные ребра (одно из них), так как они будут принадлежать созданному полигону.
Отличия MaxScript от других ЯП
Можно сказать, от одного ЯП, являющегося ООП. А именно — ActionScript 3.0, так как он мне ближе всего. По моим наблюдениям, в MaxScript функции не принадлежат объекту, т.е. не являются его частью, как в AS. В MaxScript мы пишем «функция такая-то вызывается над таким-то объектом с такими-то параметрами», а в AS и других известных мне языках всегда писалось «объект.функция(параметры)».
Кстати, моя поделка в AS 3.0, которую я хочу повторить в 3D (для этого и изучаю MaxScript).
Оставшееся непонятым
Остались вещи, которые я никак не могу понять, а именно — обращение нормалей. Вот мой код
Но независимо от наличия в нем строки flipNormals куб получается созданным наизнанку. Кто знает, как исправить — напишите, буду благодарен. На этом все
Официальная справка по MaxScript — ссылка