Как волшебным образом убрать ненужные опорные точки?
- Руководство пользователя Illustrator
- Основы работы с Illustrator
- Введение в Illustrator
- Новые возможности в приложении Illustrator
- Часто задаваемые вопросы
- Системные требования Illustrator
- Illustrator для Apple Silicon
- Рабочая среда
- Основные сведения о рабочей среде
- Ускоренное обучение благодаря панели «Обзор» в Illustrator
- Создание документов
- Панель инструментов
- Комбинации клавиш по умолчанию
- Настройка комбинаций клавиш
- Общие сведения о монтажных областях
- Управление монтажными областями
- Настройка рабочей среды
- Панель свойств
- Установка параметров
- Рабочая среда «Сенсорное управление»
- Поддержка Microsoft Surface Dial в Illustrator
- Отмена изменений и управление историей дизайна
- Повернуть вид
- Линейки, сетки и направляющие
- Специальные возможности в Illustrator
- Безопасный режим
- Просмотр графических объектов
- Работа в Illustrator с использованием Touch Bar
- Файлы и шаблоны
- Инструменты в Illustrator
- Краткий обзор инструментов
- Выбор инструментов
- Выделение
- Частичное выделение
- Групповое выделение
- Волшебная палочка
- Лассо
- Монтажная область
- Выделение
- Инструменты для навигации
- Рука
- Повернуть вид
- Масштаб
- Инструменты рисования
- Градиент
- Сетка
- Создание фигур
- Градиент
- Текстовые инструменты
- Текст
- Текст по контуру
- Текст по вертикали
- Текст
- Инструменты рисования
- Перо
- Добавить опорную точку
- Удалить опорные точки
- Опорная точка
- Кривизна
- Отрезок линии
- Прямоугольник
- Прямоугольник со скругленными углами
- Эллипс
- Многоугольник
- Звезда
- Кисть
- Кисть-клякса
- Карандаш
- Формирователь
- Фрагмент
- Инструменты модификации
- Поворот
- Отражение
- Масштаб
- Искривление
- Ширина
- Свободное трансформирование
- Пипетка
- Смешать
- Ластик
- Ножницы
- Быстрые действия
- Ретротекст
- Светящийся неоновый текст
- Старомодный текст
- Перекрашивание
- Преобразование эскиза в векторный формат
- Введение в Illustrator
- Illustrator на iPad
- Представляем Illustrator на iPad
- Обзор по Illustrator на iPad.
- Ответы на часто задаваемые вопросы по Illustrator на iPad
- Системные требования | Illustrator на iPad
- Что можно и нельзя делать в Illustrator на iPad
- Рабочая среда
- Рабочая среда Illustrator на iPad
- Сенсорные ярлыки и жесты
- Комбинации клавиш для Illustrator на iPad
- Управление настройками приложения
- Документы
- Работа с документами в Illustrator на iPad
- Импорт документов Photoshop и Fresco
- Выбор и упорядочение объектов
- Создание повторяющихся объектов
- Объекты с переходами
- Рисование
- Создание и изменение контуров
- Рисование и редактирование фигур
- Текст
- Работа с текстом и шрифтами
- Создание текстовых надписей по контуру
- Добавление собственных шрифтов
- Работа с изображениями
- Векторизация растровых изображений
- Цвет
- Применение цветов и градиентов
- Представляем Illustrator на iPad
- Облачные документы
- Основы работы
- Работа с облачными документами Illustrator
- Общий доступ к облачным документам Illustrator и совместная работа над ними
- Публикация документов для проверки
- Обновление облачного хранилища для Adobe Illustrator
- Облачные документы в Illustrator | Часто задаваемые вопросы
- Устранение неполадок
- Устранение неполадок с созданием или сохранением облачных документов в Illustrator
- Устранение неполадок с облачными документами в Illustrator
- Основы работы
- Добавление и редактирование содержимого
- Рисование
- Основы рисования
- Редактирование контуров
- Рисование графического объекта с точностью на уровне пикселов
- Рисование с помощью инструментов «Перо», «Кривизна» и «Карандаш»
- Рисование простых линий и фигур
- Трассировка изображения
- Упрощение контура
- Определение сеток перспективы
- Инструменты для работы с символами и наборы символов
- Корректировка сегментов контура
- Создание цветка в пять простых шагов
- Рисование перспективы
- Символы
- Рисование контуров, выровненных по пикселам, при создании проектов для Интернета
- 3D-объекты и материалы
- Подробнее о 3D-эффектах в Illustrator
- Создание трехмерной графики
- Проецирование рисунка на трехмерные объекты
- Создание трехмерного текста
- Создание трехмерных объектов
- Подробнее о 3D-эффектах в Illustrator
- Цвет
- О цвете
- Выбор цветов
- Использование и создание цветовых образцов
- Коррекция цвета
- Панель «Темы Adobe Color»
- Цветовые группы (гармонии)
- Панель «Темы Color»
- Перекрашивание графического объекта
- Раскрашивание
- О раскрашивании
- Раскрашивание с помощью заливок и обводок
- Группы с быстрой заливкой
- Градиенты
- Кисти
- Прозрачность и режимы наложения
- Применение обводок к объектам
- Создание и редактирование узоров
- Сетки
- Узоры
- Выбор и упорядочение объектов
- Выделение объектов
- Слои
- Группировка и разбор объектов
- Перемещение, выравнивание и распределение объектов
- Размещение объектов
- Блокировка, скрытие и удаление объектов
- Копирование и дублирование объектов
- Поворот и отражение объектов
- Переплетение объектов
- Перерисовка объектов
- Кадрирование изображений
- Трансформирование объектов
- Объединение объектов
- Вырезание, разделение и обрезка объектов
- Марионеточная деформация
- Масштабирование, наклон и искажение объектов
- Объекты с переходами
- Перерисовка с помощью оболочек
- Перерисовка объектов с эффектами
- Создание фигур с помощью инструментов «Мастер фигур» и «Создание фигур»
- Работа с динамическими углами
- Улучшенные процессы перерисовки с поддержкой сенсорного ввода
- Редактирование обтравочных масок
- Динамические фигуры
- Создание фигур с помощью инструмента «Создание фигур»
- Глобальное изменение
- Текст
- Дополнение текстовых и рабочих объектов типами объектов
- Создание маркированного и нумерованного списков
- Управление текстовой областью
- Шрифты и оформление
- Форматирование текста
- Импорт и экспорт текста
- Форматирование абзацев
- Специальные символы
- Создание текста по контуру
- Стили символов и абзацев
- Табуляция
- Поиск отсутствующих шрифтов (технологический процесс Typekit)
- Шрифт для арабского языка и иврита
- Шрифты | Часто задаваемые вопросы и советы по устранению проблем
- Создание эффекта 3D-текста
- Творческий подход к оформлению
- Масштабирование и поворот текста
- Интерлиньяж и межбуквенные интервалы
- Расстановка переносов и переходы на новую строку
- Проверка орфографии и языковые словари
- Форматирование азиатских символов
- Компоновщики для азиатской письменности
- Создание текстовых проектов с переходами между объектами
- Создание текстового плаката с помощью трассировки изображения
- Создание специальных эффектов
- Работа с эффектами
- Стили графики
- Атрибуты оформления
- Создание эскизов и мозаики
- Тени, свечения и растушевка
- Обзор эффектов
- Веб-графика
- Лучшие методы создания веб-графики
- Диаграммы
- SVG
- Фрагменты и карты изображений
- Рисование
- Импорт, экспорт и сохранение
- Импорт
- Помещение нескольких файлов в документ
- Управление связанными и встроенными файлами
- Сведения о связях
- Извлечение изображений
- Импорт графического объекта из Photoshop
- Импорт растровых изображений
- Импорт файлов Adobe PDF
- Импорт файлов EPS, DCS и AutoCAD
- Библиотеки Creative Cloud Libraries в Illustrator
- Библиотеки Creative Cloud Libraries в Illustrator
- Диалоговое окно «Сохранить»
- Сохранение иллюстраций
- Экспорт
- Использование графического объекта Illustrator в Photoshop
- Экспорт иллюстрации
- Сбор ресурсов и их массовый экспорт
- Упаковка файлов
- Создание файлов Adobe PDF
- Извлечение CSS | Illustrator CC
- Параметры Adobe PDF
- Палитра «Информация о документе»
- Импорт
- Печать
- Подготовка к печати
- Настройка документов для печати
- Изменение размера и ориентации страницы
- Задание меток обреза для обрезки и выравнивания
- Начало работы с большим холстом
- Печать
- Наложение
- Печать с управлением цветами
- Печать PostScript
- Стили печати
- Метки и выпуск за обрез
- Печать и сохранение прозрачных графических объектов
- Треппинг
- Печать цветоделенных форм
- Печать градиентов, сеток и наложения цветов
- Наложение белого
- Подготовка к печати
- Автоматизация задач
- Объединение данных с помощью панели «Переменные»
- Автоматизация с использованием сценариев
- Автоматизация с использованием операций
- Устранение неполадок
- Проблемы с аварийным завершением работы
- Восстановление файлов после сбоя
- Проблемы с файлами
- Поддерживаемые форматы файлов
- Проблемы с драйвером ГП
- Проблемы устройств Wacom
- Проблемы с файлами DLL
- Проблемы с памятью
- Проблемы с файлом настроек
- Проблемы со шрифтами
- Проблемы с принтером
- Как поделиться отчетом о сбое с Adobe
- Повышение производительности Illustrator
Возникли проблемы при редактировании сложного изображения с множеством опорных точек? Используйте функцию упрощения контура в Illustrator, чтобы устранить проблемы, связанные с редактированием сложных контуров.
Функция Упрощение контура в Illustrator помогает убирать ненужные опорные точки и создавать упрощенный оптимальный контур для сложного графического объекта, не внося существенных изменений в исходную форму контура.
Упрощение контура предоставляет следующие преимущества:
- простое и точное редактирование контуров;
- уменьшенный размер файлов;
- ускоренные отображение и печать файлов.
В каких случаях необходимо упрощать контур?
- Для удаления дефектов на трассированном контуре во время трассировки изображения.
- Для редактирования фрагмента сложного изображения и создания острых или сглаженных контуров в выбранной области изображения.
- Для сокращения количества опорных точек при расширении фигуры с помощью инструмента изменения ширины в Illustrator.
- Для редактирования изображения, созданного с помощью мобильных приложений для рисования или эскизов, а затем импортированного в Illustrator.
A. Исходное изображение B. Изображение после трассировки или импорта (максимальное количество опорных точек) C. Изображение после упрощения контуров (оптимизированные опорные точки)
Автоматическое упрощение контура
- Выберите объект или определенный участок контура.
- Выберите пункты Объект > Контур > Упростить.
Ненужные опорные точки автоматически удаляются, и рассчитывается упрощенный контур.
A. Ползунок для уменьшения количества опорных точек B. Автоматическое упрощение опорных точек C. Дополнительные параметры
Упрощение контура вручную
Чтобы еще больше упростить и уточнить контур, используйте ползунок для уменьшения количества опорных точек. По умолчанию на ползунке задано значение для автоматически упрощенного контура. Положение и значение ползунка определяет, насколько точно упрощенный путь соответствует кривым исходного контура.
- Минимальное количество опорных точек (). Если значение ползунка близко к минимальному количеству или равно ему, опорных точек будет меньше, однако кривая измененного контура будет несколько отклоняться от исходного контура.
- Максимальное количество опорных точек (). Если значение ползунка близко к максимальному количеству или равно ему, измененная кривая контура содержит больше точек и больше похожа на исходную кривую.
Расширенное управление упрощением
Нажмите кнопку Дополнительные параметры (), чтобы открыть диалоговое окно «Упрощение» с дополнительными параметрами.
Используйте ползунок Предел угла точки кривой, чтобы регулировать сглаженность углов контура. Переместите ползунок влево, чтобы сгладить контур, или вправо, чтобы сделать углы более острыми.
Совет. Если хотите быстро сгладить углы при меньшем количестве опорных точек, используйте ползунок Предел угла точки кривой синхронно с ползунком Упрощение кривой.
При изменении опорных точек или значения предела угла точки кривой Illustrator автоматически рассчитывает и отображает количество исходных и новых опорных точек.
- Показать контур исходной кривой: установите этот флажок, чтобы исходный контур отображался под упрощенным для предварительного просмотра различий между этими двумя контурами.
- Предварительный просмотр: просмотр вносимых изменений в реальном времени.
Установите флажок Преобразовать в прямые линии, чтобы провести прямые линии между исходными опорными точками объекта.
Если вы хотите, чтобы в следующий раз напрямую открылось расширенное диалоговое окно с текущими настройками, установите флажок Сохранить последние настройки и открыть это диалоговое окно.
Угловые точки остаются без изменений, когда пороговое значение больше, чем автоматически рассчитанное пороговое значение, используемое по умолчанию (90°).
Пример: упрощение и редактирование контура с дополнительными параметрами
В этом примере мы постараемся достичь следующих результатов с помощью функции упрощения контура:
- Уменьшение количества опорных точек в выбранной области.
- Создание острых углов в выбранной области.
- Преобразование контура в прямые линии в выбранной области.
Вот как мы достигли желаемого результата
Создание сглаженных контуров с помощью инструмента «Сглаживание»
Сократив количество опорных точек, вы можете использовать инструмент «Сглаживание» для удаления ненужных точек и сглаживания контура.
Создание сглаженных кривых
Чтобы сгладить кривую, сохранив противоположные кривые без изменений, сделайте следующее:
- Выберите инструмент «Опорная точка».
- Нажмите клавишу Option или Alt и щелкните любой маркер, чтобы связать противоположные маркеры и сгладить участок.
Управление уровнем сглаживания
Чтобы изменить степень сглаживания, дважды щелкните инструмент «Сглаживание» и задайте следующие параметры.
Точность
Определяет, на какое расстояние можно переместить курсор или перо прежде, чем Illustrator добавит к контуру следующую опорную точку. Например, значение 2,5 для параметра «Отклонение» означает, что перемещения инструмента на расстояние менее 2,5 пикселя не регистрируются. Параметр «Отклонение» может принимать значения от 0,5 до 20 пикселей. Чем выше значение, тем более гладким и менее сложным будет контур.
Сглаживание
Определяет степень сглаживания, применяемую программой Illustrator при использовании этого инструмента. Плавность можно задавать в пределах от 0 до 100%. Чем больше значение, тем сильнее сглаживается контур.
Связывание противоположных маркеров при помощи инструмента «Опорная точка»A. Угловые точки с непарными маркерами B. Противоположные маркеры связываются, что приводит к сглаживанию кривой
Что дальше
После упрощения контура можно выполнить следующие задачи:
Есть вопросы или предложения?
Если у вас есть вопросы или идеи, которыми вы хотели бы поделиться, присоединяйтесь к беседе в сообществе Adobe Illustrator. Мы будем рады узнать ваше мнение.
Свой AR. Основы векторной алгебры / Хабр
В настоящий момент появилось достаточно большое количество библиотек дополненной реальности с богатым функционалом (ARCore, ARKit, Vuforia). Тем не менее я решил начать свой открытый проект, попутно описывая как это работает изнутри. Если повезет, то позже получится добавить какой-то особый интересный функционал, которого нет в других библиотеках. В качестве целевых платформ пока возьмем Windows и Android. Библиотека пишется на C++, и сторонние библиотеки будут задействованы по минимуму, т.е. преимущественно не будет использовано ничего готового. Фокус в статьях будет направлен на алгоритмы и математику, которые постараюсь описать максимально доступно и подробно. В этой статье пойдет речь про основы векторной алгебры.
Дополненная реальность — это совмещение виртуального мира и реального. Для этого, нам нужно представить окружающее реальное пространство в виде математической модели, понимая закономерности которой, мы сможем получить данные для совмещения. Начнем с основ векторной алгебры.
Вектора — это частный случай матриц, состоящие либо из одного столбца, либо из одной строки. Когда мы говорим о векторе, обычно имеется вектор-столбец . Но записывать вектор как столбец неудобно, поэтому будем его транспонировать — .
Длина вектора
Первое, что мы рассмотрим — получение длины вектора — , где — значение длины, — наш вектор. Для примера возьмем двумерный вектор:
, где и — компоненты вектора, значения проекций вектора на оси двумерных координат. И мы видим прямоугольный треугольник, где и — это длины катетов, а — длина его гипотенузы. По теореме Пифагора получается, что . Значит . Вид формулы сохраняется и для векторов большей размерности, например — .
Скалярное произведение
Скалярное произведение векторов — это сумма произведение их компонентов: . Но так как мы знаем, что вектора — это матрицы, то тогда удобнее записать это в таком виде: . Это же произведение можно записать в другой форме: , где — угол между векторами и (для двумерного случая эта формула доказывается через теорему косинусов). По этой формуле можно заключить, что скалярное произведение — это мера сонаправленности векторов. Ведь, если , то , и — это просто произведение длин векторов. Так как — не может быть больше 1, то это максимальное значение, которые мы можем получить, изменяя только угол . Минимальное значение будет равно -1, и получается при , т.е. когда вектора смотрят в противоположные направления. Также заметим, что при , а значит какие бы длины не имели вектора и , все равно . Можно в таком случае сказать, что вектора не имеют общего направления, и называются ортогональными.
Также при помощи скалярного произведения, мы можем записать формулу длины вектора красивее: , .
Проекция вектора на другой вектор
Возьмем два вектора: и .
Проекцию вектора на другой вектор можно рассматривать в двух смыслах: геометрическом и алгебраическом. В геометрическом смысле проекция вектора на ось — это вектор, а в алгебраическом – число.
Вектора — это направления, поэтому их начало лежит в начале координат. Обозначим ключевые точки: — начало координат, — конечная точка вектора , — конечная точка вектора .
В геометрическом смысле мы ищем такой , чтобы конечная точка вектора (обозначим ее как — ) была ближайшей точкой к точке , лежащей на прямой .
Иначе говоря, мы хотим найти составляющую в , т.е. такое значение , чтобы и
Расстояние между точками и будет минимальным, если . Получаем прямоугольный треугольник — . Обозначим . Мы знаем, что по определению косинуса через соотношение сторон прямоугольного треугольника
( — гипотенуза, — прилежащий катет).
Также возьмем скалярное произведение . Отсюда следует, что . А значит .
Тут вспоминаем, что — это искомый вектор , а — , и получаем . Умножаем обе части на и получаем — . Теперь мы знаем длину . Вектор отличается от вектора длинной, но не направлением, а значит через соотношение длин можно получить: . И мы можем вывести финальные формулы:
и
Нормализованный вектор
Хороший способ упростить работу над векторами — использовать вектора единичной длины. Возьмем вектор и получим сонаправленный вектор единичной длины. Для этого вектор разделим на его длину: . Эта операция называется нормализацией, а вектор — нормализованным.
Зная нормализованный вектор и длину исходного вектора, можно получить исходный вектор: .
Зная нормализованный вектор и исходный вектор, можно получить его длину: .
Хорошим преимуществом нормализованных векторов является то, что сильно упрощается формула проекции (т.к. длина равна 1, то она сокращается). Проекция вектора на единичной длины:
Матрица поворота двумерного пространства
Предположим у нас есть некая фигура:
Чтобы ее нарисовать, заданы координаты ее вершин, от которых строятся линии. Координаты заданы в виде набора векторов следующим образом . Наша координатная сетка задана двумя осями — единичными ортогональными (перпендикулярными) векторами. В двумерном пространстве можно получить два перпендикулярных вектора к другому вектору такой же длины следующим образом: — левый и правый перпендикуляры. Берем вектор, задающим ось — и ось — левый к нему перпендикуляр — .
Выведем новый вектор, получаемый из наших базисный векторов:
Сюрприз — он совпадает с нашим исходным вектором.
Теперь попробуем как-то изменить нашу фигуру — повернем ее на угол . Для этого повернем векторы и , задающих оси координат. Поворот вектора задается косинусом и синусом угла — . А чтобы получить вектор оси , возьмем перпендикуляр к : . Выполнив эту трансформацию, получаем новую фигуру:
Вектора и являются ортонормированным базисом, потому как вектора ортогональны между собой (а значит базис ортогонален), и вектора имеют единичную длину, т.е. нормированы.
Теперь мы говорим о нескольких системах координат — базовой системы координат (назовем ее мировой), и локальной для нашего объекта (которую мы поворачивали). Удобно объединить наш набор векторов в матрицу —
Тогда .
В итоге — .
Матрица , составляющая ортонормированный базис и описывающая поворот, называется матрицей поворота.
Также матрица поворота имеет ряд полезных свойств, которые следует иметь ввиду:
- При , где — единичная матрица, матрица соответствует нулевому повороту (угол ), и в таком случае локальные оси совпадают с мировыми. Как рассматривали выше, матрица никак не меняет исходный вектор.
- — определитель матрицы равен 1, если у нас, как обычно бывает, правая тройка векторов. , если тройка векторов левая.
- .
- .
. - , поворот не меняет длины вектора.
- зная и , можем получить исходный вектор — . Т.е. умножая вектор на матрицу поворота мы выполняем преобразование координат вектора из локальной системы координат объекта в мировую, но также мы можем поступать и наоборот — преобразовывать мировые координаты в локальную систему координат объекта, умножая на обратную матрицу поворота.
Теперь попробуем повернуть наш объект два раза, первый раз на угол , второй раз на угол . Матрицу, полученную из угла , обозначим как , из угла — . Распишем наше итоговое преобразование:
.
Обозначим , тогда . И из двух операций мы получили одну. Так как поворот — это линейное преобразование (описали ее при помощи одной матрицы), множество преобразований можно описать одной матрицей, что сильно упрощает над ними работу.
Масштабирование в двумерном пространстве
Масштабировать объект достаточно просто, нужно только умножить координаты точек на коэффициент масштаба: . Если мы хотим масштабировать объект на разную величину по разным осям, то формула принимает вид: . Для удобства переведем операцию в матричный вид: .
Теперь предположим, что нам нужно повернуть и масштабировать наш объект. Нужно отметить, что если сначала масштабировать, а затем повернуть, то результат будет отличаться, от того результата, где мы сначала повернули, а затем масштабировали:
Сначала поворот, а затем масштабирование по осям:
Сначала масштабирование по осям, а затем поворот:
Как мы видим порядок операций играет большое значение, и его нужно обязательно учитывать.
Также здесь мы также можем объединять матрицы преобразования в одну:
Хотя в данном случае, если , то . Тем не менее, с порядком преобразований нужно быть очень аккуратным. Их нельзя просто так менять местами.
Векторное произведение векторов
Перейдем в трехмерное пространство и рассмотрим определенное на нем векторное произведение.
Векторное произведение двух векторов в трёхмерном пространстве — вектор, ортогональный к обоим исходным векторам, длина которого равна площади параллелограмма, образованного исходными векторами.
Для примера возьмем два трехмерных вектора — , . И в результате векторного произведения получим
Визуализируем данную операцию:
Здесь наши вектора , и . Вектора начинаются с начала координат, обозначенной точкой . Конечная точка вектора — точка . Конечная точка — точка . Параллелограмм из определения формируются точками , , , . Координаты точки находим как — . В итоге имеем следующие соотношения:
- , где — площадь,
- ,
- .
Два вектора образуют плоскость, а векторное произведение позволяет получить перпендикуляр к этой плоскости. Получившиеся вектора образуют образуют правую тройку векторов. Если берем обратный вектор, то получаем второй перпендикуляр к плоскости, и тройка векторов будет уже левой.
Для запоминания этой формулы удобно использовать мнемонический определитель. Пусть , и мы раскладываем определить по строке как сумму определителей миноров исходной матрицы :
Некоторые удобные свойства данного произведения:
- Если два вектора ортогональны и нормализованы, то вектор также будет иметь единичную длину. Параллелограмм, который образуется двумя исходными векторами, станет квадратом с длинной сторон равной единице. Т.е. площадь равна единице, отсюда длина выходного вектора — единица.
Матрица поворота трехмерного пространства.
С тем, как формировать матрицу в двумерном пространстве мы разобрались. В трехмерном она формируется уже не двумя, а тремя ортогональными векторами — . По свойствам, описанным выше, можно вывести следующие отношения между этими векторам:
Вычислить вектора этих осей сложнее, чем в матрице поворота двумерного пространства. Для примера получения этих векторов рассмотрим алгоритм, который в трехмерных движках называется lookAt. Для этого нам понадобятся вектор направления взгляда — и опорный вектор для оси — . Сам алгоритм:
- Обычно направление камеры совпадает с осью . Поэтому нормализуем и получаем ось — .
- Получаем вектор оси — . В итоге у нас есть два нормализованных ортогональных вектора и , описывающих оси и , при этом ось сонаправлена с входным вектором , а ось перпендикулярна к входному опорному вектору .
- Получаем вектор оси из полученных и — .
- В итоге
В трехмерных редакторах и движках в интерфейсах часто используются углы Эйлера для задания поворота. Углы Эйлера более интуитивно понятны — это три числа, обозначающие три последовательных поворота вокруг трех основных осей . Однако, работать с ними не очень то просто. Если попробовать выразить итоговый вектор напрямую через эти повороты, то получим довольно объемную формулу, состоящую из синусов и косинусов наших углов. Есть еще пара проблем с этими углами. Первая проблема — это то, что сами по себе углы не задают однозначного поворота, так как результат зависит от того, в какой последовательности происходили повороты — или или как-то еще. Углы Эйлера — это последовательность поворотов, а как мы помним, смена порядка трансформаций меняет итоговый результат. Вторая проблема — это gimbal lock.
Внутри же трехмерные движки чаще всего используют кватернионы, которых мы касаться не будем.
Существуют разные способы задания поворота в трехмерном пространстве, и каждый имеет свои плюсы и минусы:
- Матрица поворота. С ней просто работать (т.к. это просто матрицы). Но есть логическая избыточность данных — все элементы матрицы связаны определенными условиями, так как количество элементов больше степеней свободы (12 элементов против трех степеней). Т.е. мы не можем взять матрицу и наполнить ее случайными числами, так при несоблюдении условий матрица просто не будет являться матрицей поворота.
- Углы Эйлера. Они интуитивно понятны, но работать с ними сложно.
- Вектор оси вращения и угол порота вокруг нее. Любой возможный поворот можно описать таким образом. Поворота вектора вокруг заданной оси рассмотрим ниже.
- Вектор поворота Родрига. Это трехмерный вектор, где нормализованный вектор представляет собой ось вращения, а длина вектора угол поворота. Этот способ задания поворота похож на предыдущий способ, но количество элементов здесь равно числу степеней свободы, и элементы не связаны между собой жесткими ограничениями. И мы можем взять трехмерный вектор с абсолютно случайными числами, и любой полученный вектор будет задавать какое-то возможное вращение.
Поворот вектора вокруг заданной оси
Теперь рассмотрим операцию, позволяющую реализовать поворот вектора вокруг оси.
Возьмем вектор — описывающий ось, вокруг которой нужно повернуть вектор на угол . Результирующий вектор обозначим как . Иллюстрируем процесс:
Вектор мы можем разложить сумму векторов: вектора, параллельный к вектору — , и вектора, перпендикулярному к вектору к вектору — .
.
Вектор — это проекция вектора на вектор . Т.к. — нормализованный вектор, то:
Та часть , которая принадлежит оси вращения () не измениться во время вращения. Повернуть нам нужно только в плоскости перпендикулярной к на угол , Обозначим этот вектор как . Тогда наш искомый вектор — .
Вектор можем найти следующим образом:
Для того, чтобы повернуть , выведем оси и в плоскости, в которой будем выполнять поворот. Это должны быть два ортогональных нормализованных вектора, ортогональных к . Один ортогональный вектор у нас уже есть — , нормализуем его и обозначим как ось — .
Теперь получим вектор оси . Это должен быть вектор, ортогональный к и (т.е. и к ). Получить его можно через векторное произведение: . Значит . По свойству векторного произведения будет равно площади параллелограмма, образуемого двумя исходными векторами ( и ). Так как вектора ортогональны, то у нас будет не параллелограмм, а прямоугольник, а значит . . Значит .
Поворот двумерного вектора на угол можно получить через синус и косинус — . Т.к. в координатах полученной плоскости сонаправлен с осью , то он будет равен . Этот вектор после поворота — . Отсюда можем вывести:
Теперь мы можем получить наш искомый вектор:
Мы разобрались с тем, как поворачивать вектор вокруг заданной оси на заданный угол, значит теперь мы умеем использовать поворот, заданный таким образом.
Получить вектор оси вращения и угол из вектора Родрига не составляет большого труда, а значит мы теперь умеем работать и с ним тоже.
Напоминаю, что матрица поворота представляет собой три базисных вектора , а углы Эйлера — три последовательных поворота вокруг осей , , . Значит мы можем взять единичную матрицу, как нулевой поворот , а затем последовательно поворачивать базисные вектора вокруг нужных нам осей. В результате получим матрицу поворота соответствующую углам Эйлера. Например:
Также можно отдельно вывести матрицы вращения по каждой из осей , , (, , соответственно) и получить итоговую матрицу последовательным их умножением:
Таким же образом можно перевести вектор поворота Родрига в матрицу поворота: также поворачиваем оси матрицы поворота, полученные от единичной матрицы.
Итак, с вращением объекта разобрались. Переходим к остальным трансформациям.
Масштабирование в трехмерном пространстве
Все тоже самое что и двумерном пространстве, только матрица масштабирования принимает вид:
Перемещение объекта
До этого момента точка начала локальных координат не смещалась в мировом пространстве. Так как точка начала координат нашего объекта — это его центр, то центр объект никуда не смещался. Реализовать это смещение просто: , где — вектор, задающий смещение.
Теперь мы умеем масштабировать объект по осям, поворачивать его и перемещать.
Объединим все одной формулой: :
Чтобы упростить формулу, мы можем, как уже делали ранее, объединить матрицы . В итоге наше преобразование описывает матрица и вектор . Объединение вектора с матрицей еще более бы упростило формулу, однако сделать в данном случае не получится, потому как сложение здесь — это не линейная операция. Тем не менее сделать это возможно, и рассмотрим этот момент уже в следующей статье.
Для какого-то покажется, что статья описывает очевидные вещи, кому-то может показаться наоборот немного запутанной. Тем не менее это базовый фундамент, на котором будет строиться все остальное. Векторная алгебра — является фундаментом для многих областей, так что статья может вам оказаться полезной не только в дополненной реальности. Следующая статья будет уже более узконаправленной.
Как упростить векторное выражение?
Вот способ сделать все, о чем вы просили, автоматически, независимо от версии Mathematica . Подход основан на специальном символе для идентификации, когда мы имеем дело с вектором: вместо использования таких вещей, как x
, y
и т. д. для векторов, теперь принято соглашение, что векторы записываются как vec[x]
, vec[y]
и т. д.
Вы также можете определить оболочку OverVector[x]
для этой цели, потому что он отображается как $\vec{x}$. Но для этого поста я хочу, чтобы он был простым, и стрелки не будут легко отображаться в исходном коде ниже.
ClearAll[scalarProduct, vec]; SetAttributes[scalarProduct, {Беспорядковый}] vec /: Dot[vec[x_], vec[y_]] := scalarProduct[vec[x], vec[y]] vec /: Cross[vec[x_], HoldPattern[Plus[y__]]] := Map[Cross[vec[x], #] &, Plus[y]] vec /: Cross[HoldPattern[Plus[y__]], vec[x_]] := Map[Cross[#, vec[x]] &, Plus[y]] scalarProduct /: MakeBoxes[scalarProduct[x_, y_], _] := RowBox[{ToBoxes[x], ".", ToBoxes[y]}] век[х].век[у] (* ==> vec[x].vec[y] *) vec[x].vec[y] == vec[y].vec[x] (* ==> Верно *) Крест[vec[x], vec[a] + vec[b]] (* ==> vec[x]\[Cross]vec[a] + vec[x]\[Cross]vec[b] *) Крест[vec[a] + vec[b], vec[x]] (* ==> vec[a]\[Cross]vec[x] + vec[b]\[Cross]vec[x] *)
Для произведения Dot
я определил поведение vec
таким образом, что оно оценивается как новая функция scalarProduct
, единственным алгебраическим свойством которой является то, что это Беспорядок
, как вы и ожидали для скалярного произведения векторов. Конечно, это верно только для евклидовых скалярных произведений, поэтому здесь это предположение неявно. Для получения дополнительной информации о том, как работает это определение, см. TagSetDelayed
.
Кроме того, скалярное произведение
получает настраиваемый формат отображения, определяя, что он должен снова отображаться, как если бы он был точечным произведением, когда он появляется в функции низкоуровневого форматирования MakeBoxes
.
Для распределительного свойства перекрестного произведения я придаю vec
дополнительное свойство, заключающееся в том, что когда оно появляется в Cross
вместе с выражением head Plus
, сумма расширяется. Здесь определения TagSetDelayed
выполняются для обоих заказов и содержат HoldPattern
для предотвращения слишком ранней оценки Plus
в определении.
Теперь вы можете вернуться с еще многими пожеланиями: например, как насчет мультипликативных скаляров в скалярном или перекрестном произведении, и как насчет матриц. Тем не менее, это широкое поле, которое открывает банку червей, поэтому я бы сказал, просто реализуйте минимум функций, которые вы можете использовать символически, а затем приступайте к конкретной рабочей основе, чтобы вместо этого вы могли писать векторы как списки.
Другим подходом может быть определение нового символа для пользовательского скалярного произведения. Это сделано в этом вопросе.
Использование OverVector
Как упоминалось выше, вы можете заменить vec
на Overvector
везде в приведенном выше исходном коде, чтобы получить результат с лучшим форматированием. Предполагая, что вы сделали это (я не буду повторять определения с этим изменением), вот несколько примеров:
Чтобы ввести эти векторные выражения, обратитесь к вспомогательной палитре Basic Math. Перекрестное произведение может быть введено как Esc крест
Esc .
Еще одна вещь, которую вы просили, это использовать антисимметрию векторного произведения в упрощениях. На самом деле это уже сделано, если вы вызываете FullSimplify
:
symbolic — возможно ли упростить выражение в векторной форме, которое включает в себя перекрестное произведение и скалярное произведение?
Мне часто приходится упрощать выражения, включающие перекрестное произведение и скалярное произведение, например:
f = Dot[Cross[Cross[p1 - p, e1], Cross[p2 - p, e2]], Cross[p3 - p , е3]]
, где все символы в RHS являются трехмерными векторами, но нежелательно ссылаться на их компоненты, потому что из результатов довольно сложно найти полезную информацию. Это упрощение очень часто требуется в таких областях, как кинематика и динамика, и я полагаю, что многие люди сталкивались с этой проблемой, но мой поиск не дал очень релевантных результатов.
Есть ли способ справиться с таким упрощением? Я думаю, что возможное решение, которое может сработать, заключается в том, что мы можем определить некоторые настраиваемые операторы или функции для представления перекрестного произведения и скалярного произведения, а затем определить набор правил для этих операторов (или для Simplify
commend), чтобы отразить возможные упрощения, такие как расширение смешанного произведения и т. д. Но я новичок в Mathematica, и не знаю, как это сделать, и не знаю, является ли это лучшим способом, или.
Кто-нибудь может помочь? Будем очень признательны за любой ответ! Спасибо!
Follow Up 1
Благодаря маршу я нашел команду $Assumptions = {p1 [Element] Vectors[3, Reals]}
, которая преобразует проблему в тензорную задачу. Я попробовал эту команду для всех векторов, и 9Функция 0005 f действительно показывает правильное выражение, но после этого Expand
, Simplification
, Collect
не работают, только TensorExpand
и TensorReduce
работают для этих тензоров. Выражение кажется каким-то сложным, так как Упростить
сейчас не получится. Пока я не нашел способа справиться с этим.
Тем не менее, я думаю, что может помочь способ определения настраиваемых операторов (или функций) или правил (в Simplify
), которые могут определять такие операции, как смешанное произведение или двойное перекрестное произведение.