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 вершины, между ними создаешь ребро, просто указывая их номера. Даже синтаксис функции на это намекает (код ниже). Я ее разбирать не буду, там и интуитивно все понятно, кроме одной вещи, которую и поясню.

Код

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

Код

Единственное пояснение: <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).

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

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

Код

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

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

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

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

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