Сплайны
Сплайн – это объект, представляющий собой одну или несколько линий в пространстве или на плоскости. Все сплайны, а также 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_1 | Point3 | [-75,33,0] |
$Circle01.Spline_1___Vertex_1 | Point3 | [-75,33,0] |
$Circle01.Spline_1___OutVec_1 | Point3 | [-50,0,0] |
$Circle01.Spline_1___InVec_2 | Point3 | [-20,-33,0] |
$Circle01.Spline_1___Vertex_2 | Point3 | [7,-66,0] |
$Circle01.Spline_1___OutVec_2 | Point3 | [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)
)