|
|
|
Программа Transformator4Dv1 При запуске ищет файлы "acrTrans1F.txt" и "acrTrans1A.txt". Должным образом обрабатывает и показывает на экране результат. Первый файл описывает модель, второй аффинные преобразования. Преобразования применяются ко всему объекту. Описание файла "acrTrans1F.txt" Файл содержит информацию о четырехмерном объекте (фигуре).
Формат файла (в порядке следования) |
Количество значений | Описание | Возможные значения |
1 | Замкнутость полигонов | Замкнутые - 1 Незамкнутые - 0 |
3 | Цвет фигуры r g b | Вещественное число от 0 до 1 |
1 | Количество полигонов (nP) | Натуральное число <100 |
k-ый полигон , k - от 1 до nP | ||
1 | Количество вершин (nV) | Натуральное число <100 |
v-ая вершина v - от 1 до nV |
||
4 | Координаты вершины в виде (x,y,z,q) | Вещественные числа |
Цвет указывается тремя компонентами RGB:
красный, зеленый, синий. В следующей таблице приведены примеры некоторых цветов |
|
|
Например, следующий набор данных описывает тетраэдр в в трехмерном пространстве (q=0) с вершинами начале координат и сторонами на осях (комментарии не являются частью файла) 1 //замкнутые полигоны 0 0 0.5 //темно синий цвет 3 //всего три полигона 3 //первый полигон, три вершины 0 0 0 0 //x,y,z,q 1 0 0 0 //x,y,z,q 0 1 0 0 //x,y,z,q 3 //второй полигон, три вершины 0 0 0 0 //x,y,z,q 0 1 0 0 //x,y,z,q 0 0 1 0 //x,y,z,q 3 //третий полигон, три вершины 0 0 0 0 //x,y,z,q 0 0 1 0 //x,y,z,q 1 0 0 0 //x,y,z,q
Описание файла "acrTrans1A.txt" Первым в файле указывается вектор проекции четырехмерного пространства на трехмерное. например (0 0 0 q) создает ортографическую проекцию. Вектор можно менять в течение работы с программой. А здесь устанавливается первоначальное значение. Файл содержит информацию об аффинных преобразованиях объекта описанного в предыдущем файле. Типы аффинных преобразований: статичные и динамичные. Статичные - постоянные преобразования. Не зависит от шага. Динамичные аффинные преобразования - преобразования, зависящие от шага. Шаг (step): (1) - вперед, (-1) - назад. Изменятся интерактивно. При запуске программы шаг=1. Например, необходимо добиться следующего результата. Гиперкуб со ребром 2 вращается вокруг своего центра по всем возможным положительным направлениям с коэффициентами (1,2,3,4,5,6 - соответственно каждому направлению). Его центр находится в точке (3,3,3,3). Так как необходимое вращение происходит вокруг плоскостей проходящих через начала координат, а гиперкуб мы построили относительно одной из его вершин находящейся в точке (0,0,0,0), то для достижения желаемого эффекта необходимо сначала переместить его центр в начало координат, то есть сдвинуть на (-0.5,-0.5,-0.5,-0.5) (статичное перемещение). После этого увеличит в 2 раза (статичное масштабирование). Таким образом мы подготовили объект к вращению. Мы его поворачиваем с соответствующими направлениям коэффициентами в зависимости от шага (динамичное вращение). После получения окончательного результата мы должны сместить центр куба в точку (3,3,3,3) (статичное перемещение). Описание требуемых аффинных преобразований. Статичное Смещение (-0.5,-0.5,-0.5,-0.5) Статичное Масштабирование (2,2,2,2). Динаминый поворот на 1 градус умноженного на шаг. Вращение в каждом направлении изменяется в соответствие поставленной задачи. (xy=1 xz=2 xq=3 yz=4 yq=5 zq=6). Статичное Перемещение (3,3,3,3) Количество преобразований ограничено - максимум 100 штук (на руки). Поддерживаются преобразования нескольких видов |
Название | Код | Параметры (вещественные) |
Статичные преобразования |
||
Масштабирование | 1 | meter x y z q (коэффициенты масштабирования по каждой оси) |
Перемещение | 2 | meter
x y z q (смещение по каждой оси) |
Поворот | 3 | angle xy xz xq yz yq zq (угол, и его коэффициенты поворота от одной оси к другой) |
Динамичные преобразования |
||
Масштабирование | 4 | meter x y z q |
Перемещение | 5 | meter x y z q |
Поворот | 6 | angle xy xz xq yz yq zq |
Meter - общий (для конкретного преобразования) параметр , на него умножаются остальные так называемые "коэффициенты участия" и передаются в процедуру преобразования.
|
Название | Параметры, получаемые процедурой преборазования |
Масштабирование | meter*x meter*y meter*z meter*q |
Перемещение | meter*x meter*y meter*z meter*q |
Поворот | angle*xy angle*xz angle*xq angle*yz angle*yq angle*zq |
Например, Масштабирование (комментарии не являются частью файла) 1 // код преобразования Масштабирование 2 //Meter - коэффициент масштабирования 1 2 0 0 //по x масштабировать в размере meter, по y масштабировать 2*meter, по z и q не масштабировать. 2 //код Перемещение 0.1// на одну десятую 0 10 1 -3 // по x не перемещать, по y перемещать на 1=0.1*10, по z перемещать на 0.1, по q в противоположную сторону на (-3)meter Последние две точки можно записать под другому, но результат от этого не изменится Вариант №1 -0,1 0 -10 -1 3 Вариант №2 1 0 1 0.1 -0.3 и т.д. Результат преобразования будет одинаковый, так как в матрицу преобразования попадают произведения meter и соответствующих коэффициентов. |
В повороте указывается угол (angle) поворота в градусах. Коэффициенты для каждой плоскости вращения. Например запись 3 // поворот 45 0 0 1 -2 0 0 //параметры указывает на угол поворота 45 градусов. при этом поворот не производится в плоскостях xy, xz, yq, zq (нули). И производится от x к q (четвертая единица) и от z к y с размерностью 2 (минус означает противоположное направление, 2 - то, что поворот будет производиться на 2*angle=90 градусов) Кстати, то же самое можно записать вот так 1 0 0 45 -90 0 0 Зависимость от шага |
название | Код | Параметры (вещественные) |
Масштабирование | 4 | meter + шаг |
Перемещение | 5 | meter × шаг |
Поворот | 6 | angle × шаг |
Формат файла. |
Количество значений | Описание | Возможные значения | |
4 | Вектор проекции | Вещественные числа | |
1 | Количество аффинных преобразований | Целое число | |
k-ое преобразование |
|||
1 | Код вида преобразования №1 | 1, 2, 3,4,5,6 | |
количество параметров для соответствующего преобразования | |||
5 | Масштабирование | Вещественные числа | |
5 | Перемещение | Вещественные числа | |
7 | Поворот | Вещественные числа | |
1 | Код вида преобразования №2 | 1, 2, 3,4,5,6 | |
описание преобразования |
|||
1 | Код вида преобразования №3 | 1, 2, 3,4,5,6 | |
описание преобразования |
|||
...и так далее... |
Например, опишем преобразования рассмотренные выше:
статичное перемещение на -0,5, динамичное вращение, перемещение на
+3. Изменим лишь вращение, таким образом чтобы поворот происходил не
в направлении x-q, а от q
к x . (комментарии не являются
частью файла) //начало 4 //количество преобразований 2 // статичное перемещение -0.5 -0.5 -0.5 -0.5 //смещение на -0,5 по всем осям. Центр куба оказался в точке 0,0,0,0 1// статитчное масштабирование 2 2 2 2 //увеличение в 2 раза по всем осям 3 // динамичный поворот 1 //угол 1 градус 1 2 -3 4 5 6 // коэффициенты поворота. (-3) означает, что происходит поворот в противоположном направлении на 3 градуса за шаг. 2 //статичное перемещение перемещение 3 3 3 3 //конец. |
Задача.
Есть квадрат со стороной 1 и вершиной в начале координат. В плоскости xy. Необходимо добиться кругового полета вокруг оси x на расстоянии 3 от этой оси, и в отдалении от плоскости yz на 2. При этом квадрат должен находится в плоскости параллельной yz и вращаться вокруг своего центра. Схема задачи Сначала создадим квадрат Замкнутый полигон - 1 Цвет черный 0 0 0 1 полигон 4 вершины ///////// Файл acrTrans1F.txt 1 0 0 0 0 /////////// Начнем создавать последовательность аффинных преобразований. Повернем его вокруг y 90 градусов от x к z. Этот поворот не зависит от шага, поэтому необходимо использовать код 3, с углом (тоже понятно) 90 градусов . Следующие шесть параметров xy xz xq yz yq zq указывают от чего к чему производить поворот нам нужен второй параметр - xz. Все остальные нули. 3 90 0 1 0 0 0 0 Чтобы вращать квадрат вокруг собственного центра, надо сделать так чтобы этот центр попал в начало координат. Сторона квадрата равна 1, значит смещаем на 0.5 в отрицательную сторону по y и z статичным перемещением. 2 -0.5 0 1 1 0 Начинаем вращать по направлению стрелки, а это значит от z и y. Значит нам нужен четвертый элемент последовательности (xy xz xq yz yq zq) со знаком минус. Вращение будет динамичным, а значит код 6. Сделаем по 5 градусов за шаг. 6 5 0 0 0 -1 0 0 Теперь необходимо сместить наш квадрат на радиус окружности-траектории вращения центра квадрата вокруг оси x. Как смещать? По y или по z? В задаче не указано первоначальное положение, значит разницы нет. Давайте на 1 по y Статичное перемещение, но чтобы скучно не было сделаем так 2 -0.2 0 -15 0 0 и получим смещение на 3 в положительную сторону по y. Далее необходимо обозначить вращение вокруг оси x от y к z. Сделаем медленное вращение по 1 градусу. 6 1 0 0 0 1 0 0 И смещаем по x на 3 2 3 1 0 0 0 Соберем все записи вместе 3 90 0 1 0 0 0 0 2 -0.5 0 1 1 0 6 5 0 0 0 -1 0 0 2 -0.2 0 -15 0 0 6 1 0 0 0 1 0 0 2 3 1 0 0 0 Получили последовательность из шести аффинных преобразований Создаем файл при начальном векторе проекции (0,0,0,1) ////////// Файл acrTrans1A.txt 0 0 0 1 6 3 90 0 1 0 0 0 0 2 -0.5 0 1 1 0 6 5 0 0 0 -1 0 0 2 -0.2 0 -5 0 0 6 1 0 0 0 1 0 0 2 3 1 0 0 0 ////////// Попробуйте указать последовательность преобразований в обратном порядке и посмотрите, что получилось. |
|
|
|
|
|
©2007 AnCoRecords "d'Amateur: Записки 4D любителя" E-mail автору |
|