Сплайны

Сплайн – это объект, представляющий собой одну или несколько линий в пространстве или на плоскости. Все сплайны, а также NURBS-кривые относятся к категории Shapes (формы). Команда showclass "*:shape" выводит в окно Listener все существующие классы сплайнов. Некоторые свойства этих классов повторяются, как общие свойства всех сплайнов. Описывать все классы нет необходимости, рассмотрим класс Arc (дуга):

СвойствоОписание
<Arc>.radiusРадиус дуги (тип значения – float, по умолчанию 25.0)
<Arc>.fromПоложение начальной точки, как угол, отмеряемый от положительного направления локальной оси X
 против часовой стрелки. (float, 45.0)
<Arc>.toПоложение конечной точки, как угол, отмеряемый от положительного направления локальной оси X
 против часовой стрелки. (float, 135.0)
<Arc>.pieДостраивает дугу до замкнутого сплайна, соединяя концы с центром прямыми сегментами. (Boolean, false)
<Arc>.reverseИнвертирует сплайн дуги, т.е. меняет порядок вершин на противоположный. (Boolean, false)
<Arc>.stepsЧисло разбиений сегмента между вершинами. (Integer, 6)
<Arc>.optimizeУдаляет разбиение прямых сегментов сплайна. (Boolean, true)
<Arc>.adaptiveАвтоматически определяет и устанавливает разбиение для сплайнов. У прямых сегментов всегда 0. (0, false)
<Arc>.angleУгол поворота сечения визуализируемого сплайна. (float, 0.0)
<Arc>.thicknessДиаметр (толщина) визуализируемого сплайна. (float, 1.0)
<Arc>.sidesЧисло сторон в сетке визуализируемого сплайна. Например, значение 4 дает квадратное сечение. (Integer, 12)
<Arc>.renderableВключает показ сплайна при визуализации. (Boolean, false)
<Arc>.mapCoordsВключает проекционные координаты. (Boolean, false)
Пример: duga = arc radius: 100 from: 0 to: 180 pos: [0, 0, 0]

 
Класс SplineShape

Методы этого класса работают с любыми сплайнами и позволяют всячески их редактировать. Чтобы конвертировать сплайны стандартных классов в класс SplineShape, необходимо использовать функцию convertToSplineShape <node>, где <node> – любой объект-сплайн. Если в качестве <node> задать объект, который нельзя конвертировать, функция возвратит значение undefined.

Методы, работающие с целым объектом Shape
updateShape <shape>
Обновляет объект, этот метод необходимо запускать после редактирования формы методами SplineShape и до работы с объектом любыми другими операциями.

resetShape <shape>
Стирает все сплайны объекта.

numSplines <shape>
Возвращает количество всех сплайнов в объекте как значение типа Integer. Эквивалент <shape>.numSplines.

setFirstSpline <shape> <spline_index_integer>
Меняет порядок сплайнов таким образом, что указанный сплайн становится первым.

addAndWeld <to_shape> <from_shape> <weldthreshold_float>
добавляет сплайны одного объекта к другому. Конечные точки сплайнов будут объединяться, если расстояние между ними не превысит значения <weldthreshold_float>.

bindKnot <shape> <isEnd_boolean> <splineId_integer> <segIndex_integer> <splineSegId_integer>
Связывает первую или последнюю вершину сплайна с серединой указанного сегмента. Если значение параметра <isEnd_boolean> - true, связывается последняя вершина, иначе первая.
Параметры:
<splineId_integer> - задает номер сплайна, которому принадлежат связываемые вершины.
<segIndex_integer> - определяет номер сегмента, к середине которого будет привязана вершина.
<splineSegId_integer> – номер сплайна, которому принадлежит этот сегмент.

unBindKnot <shape> <spline_index_integer> <isEnd_boolean>
Разрывает связь конечной или начальной вершины указанного сплайна.

updateBindList <shape>
Обновляет список связей. Метод вызывается, когда меняется топология, например, стираются вершины.

materialID <shape> <spline_index_integer> <segment_index_integer>
Возвращает идентификатор материала для указанного сегмента сплайна заданного объекта.

Методы, работающие со сплайнами объекта Shape
addNewSpline <shape>
Добавляет новый пустой сплайн к объекту и возвращает его номер (будет последним в списке всех сплайнов этого объекта).

getSplineSelection <shape>
Возвращает номера выделенных сплайнов объекта как массив целых чисел.

setSplineSelection <shape> <spline_index_array> [keep:<boolean>]
Выделяет сплайны, определенные массивом <spline_index_array>. Со сплайнов, уже выделенных к данному моменту, выделение снимается, если только не установлен параметр keep: true.

deleteSpline <shape> <spline_index_integer>
Удаляет заданный сплайн из объекта. Оставшиеся сплайны перенумеровываются.

numSegments <shape> <spline_index_integer>
Возвращает количество сегментов указанного сплайна. Это целое число, равное числу вершин для замкнутых сплайнов и на единицу меньше числа вершин для открытых.

numKnots <shape> [<spline_index_integer>]
Возвращает число вершин в указанном сплайне (значение типа Integer). Если номер сплайна не указан, возвращается число вершин во всем объекте.

isClosed <shape> <spline_index_integer>
Возвращает true, если указанный сплайн замкнут, и false, если открыт.

close <shape> <spline_index_integer>
Замыкает указанный сплайн. Этот метод всегда создает новый сегмент от первой до последней вершины, даже если их координаты совпадают.

open <shape> <spline_index_integer>
Открывает указанный сплайн, удаляя сегмент между первой и последней вершиной.

reverse <shape> <spline_index_integer>
Инвертирует порядок вершин в указанном сплайне.

setFirstKnot <shape> <spline_index_integer> <knot_index_integer>
Устанавливает новый порядок вершин в указанном сплайне так, что заданная вершина становится первой.

getSegLengths <splineShape> <spline_index> [cum:<boolean>] [byVertex:<boolean>] [numArcSteps:<integer>]
Возвращает массив длин сегментов или расстояний между вершинами сплайна и общую длину сплайна. Вычисления повышенной точности. Если значение cum:true – результаты складываются, иначе отсчитываются для каждого сегмента (по умолчанию false). Если значение byVertex:true – результаты для вершин, иначе для сегментов (по умолчанию false). Параметр numArcSteps:<integer> по умолчанию равен 100.

subdivideSegment <splineShape> <spline_index> <seg_index> <divisions>
Разделяет сегмент на заданное количество частей. Вычисления двойной точности.

interpCurve3D <splineShape> <spline_index> <param_float> [pathParam:<boolean>]
Возвращает <point3> - координату на указанном сплайне кривой. Если pathParam:false – значение <param_float> считается на основе длины сплайна, иначе на основе длин сегментов. По умолчанию pathParam:false.

tangentCurve3D <splineShape> <spline_index> <param_float> [pathParam:<boolean>]
Возвращает <point3> - касательную в точке на указанной кривой. Если pathParam:false – значение <param_float> считается на основе длины сплайна, иначе на основе длин сегментов. По умолчанию pathParam:false.

Методы, работающие с сегментами сплайнов объекта Shape
getSegmentType <shape> <spline_index_integer> <seg_index_integer>
Возвращает тип указанного сегмента заданного сплайна.

setSegmentType <shape> <spline_index_integer> <seg_index_integer> (#curve | #line)
Устанавливает тип указанного сегмента заданного сплайна.

refineSegment <shape> <spline_index_integer> <seg_index_integer> <seg_interp_param_float>
Добавляет новую вершину к указанному сегменту заданного сплайна. Конкретное положение вершины, определяется значением <seg_interp_param_float>. Это число от 0.0 до 1.0 пропорционально длине сегмента. Координаты и касательные на входе и выходе из вершины вычисляются и устанавливаются автоматически, чтобы сохранить исходную кривизну сегмента. Функция refineSegment() возвращает номер новой добавленной вершины.

getSegSelection <shape> <spline_index_integer>
Возвращает номера выделенных сегментов заданного сплайна как массив целых чисел.

setSegSelection <shape> <spline_index_integer> <seg_index_array> [keep:<boolean>]
Выделяет сегменты, определенные массивом номеров <seg_index_array>. С сегментов, уже выделенных к данному моменту, выделение снимается, если только не установлен параметр keep:true.

setMaterialID <splineShape> <spline_index> <seg_index> <matID>
Устанавливает идентификатор материала для заданного сегмента сплайна.

getMaterialID <splineShape> <spline_index> <seg_index>
Возвращает идентификатор материала для заданного сегмента сплайна.

Методы, работающие с вершинами сплайнов объекта Shape
addKnot <shape> <spline_index_integer> (#smooth | #corner | #bezier | #bezierCorner) (#curve | #line) <position_point3> \
[invec_point3] [outvec_point3] [where_integer]
Добавляет к указанному сплайну новую вершину и возвращает ее номер. Третий аргумент определяет тип вершины, четвертый – тип сегмента на выходе из вершины, пятый – координаты новой точки в текущей системе координат. Если тип вершины bezier или bezierCorner, необходимо задать векторы входящей и исходящей касательной (6-ой и 7-ой аргументы). Дополнительный последний аргумент устанавливает номер новой вершины в массиве вершин сплайна, если его не задать, она станет последней.

deleteKnot <shape> <spline_index_integer> <knot_index_integer>
Удаляет указанную вершину с заданного сплайна. Оставшиеся вершины перенумеровываются.

getKnotType <shape> <spline_index_integer> <knot_index_integer>
Возвращает тип указанной вершины с заданного сплайна. Значения (тип name) бывают следующими: #smooth, #corner, #bezier, #bezierCorner.

setKnotType <shape> <spline_index_integer> <knot_index_integer> (#smooth | #corner | #bezier | #bezierCorner)
Задает тип указанной вершины заданного сплайна.

getKnotPoint <shape> <spline_index_integer> <knot_index_integer>
Возвращает координаты (тип point3) указанной вершины заданного сплайна в текущей системе координат.

setKnotPoint <shape> <spline_index_integer> <knot_index_integer> <point3>
Устанавливает координаты (point3) для указанной вершины заданного сплайна в текущей системе координат, т.е. перемещает вершину в точку с этими координатами.

getInVec <shape> <spline_index_integer> <knot_index_integer>
Возвращает вектор (point3) входящей касательной для указанной вершины в текущей системе координат.

setInVec <shape> <spline_index_integer> <knot_index_integer> <point3>
Задает вектор (point3) входящей касательной для указанной вершины в текущей системе координат.

getOutVec <shape> <spline_index_integer> <knot_index_integer>
Возвращает вектор (point3) выходящей касательной для указанной вершины в текущей системе координат.

setOutVec <shape> <spline_index_integer> <knot_index_integer> <point3>
Задает вектор (point3) выходящей касательной для указанной вершины в текущей системе координат.

getKnotSelection <shape> <spline_index_integer>
Возвращает номера выделенных вершин заданного сплайна как массив целых чисел.

setKnotSelection <shape> <spline_index_integer> <knot_index_array> [keep: <boolean>]
Выделяет вершины, определенные в массиве <knot_index_array>, представляющем собой набор целых чисел – номеров вершин. С вершин, уже выделенных к данному моменту, выделение снимается, если только не установлен параметр keep:true.


Анимация вершин сплайнов

Чтобы получить доступ к анимации вершин объекта класса SplineShape, необходимо воспользоваться методом animateVertex, который задает диапазон анимируемых вершин. Впоследствии к этим вершинам можно применять различные контроллеры анимации.
animateVertex <shape> <vertex_spec>, где <vertex_spec> – индекс, массив индексов или ключевые слова #all или #selected (соответствуют всем или только выбранным вершинам). У каждой вершины сплайна есть три индекса: для входящей касательной, для самой вершины и для выходящей касательной. Индексы всегда следуют друг за другом строго по порядку, в случае нескольких сплайнов сначала для всех вершин первого сплайна в объекте класса SplineShape, потом для второго и т.д. После определения диапазона анимируемых индексов, становятся доступными свойства вершин и касательных. Например, вот свойства первых двух вершин первого (и единственного) сплайна объекта окружности $Circle01, которые можно анимировать:

СвойствоТипЗначение
$Circle01.Spline_1___InVec_1Point3[-75,33,0]
$Circle01.Spline_1___Vertex_1Point3[-75,33,0]
$Circle01.Spline_1___OutVec_1Point3[-50,0,0]
$Circle01.Spline_1___InVec_2Point3[-20,-33,0]
$Circle01.Spline_1___Vertex_2Point3[7,-66,0]
$Circle01.Spline_1___OutVec_2Point3[32,-95,0]

Пример создания объекта, состоящего из двух сплайнов-окружностей и последующей анимации его вершин и их касательных:
a=circle pos: [0,0,0] radius: 50
b=circle pos: [0,0,0] radius: 100
convertTosplineShape a
convertTosplineShape b
addAndWeld a b 0.01
a.name="Circles"
animateVertex $Circles #(4, 10, 14, 20)
animate on
(
at time 0 ($Circles.spline_1___InVec_2.z = 50)
at time 100 ($Circles.spline_1___InVec_2.z = -50)
at time 0 ($Circles.spline_1___InVec_4.z = -50)
at time 100 ($Circles.spline_1___InVec_4.z = 50)
at time 0 ($Circles.spline_2___Vertex_1.z = 50)
at time 100 ($Circles.spline_2___Vertex_1.z = -50)
at time 0 ($Circles.spline_2___Vertex_3.z = -50)
at time 100 ($Circles.spline_2___Vertex_3.z = 50)
)