Форум программистов, компьютерный форум, киберфорум
Геометрия
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
1

Loft в 3D

10.09.2015, 19:10. Показов 854. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как программы делают Loft?
На примере гладкая кривая и Loft с адаптивным разбиением.
Loft в 3D

У меня задача намного проще: как провести форму “квадрат” по замкнутой ломанной из 30 точек?
Если ломанная описывает сложные фигуры и восьмерки.
0
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
10.09.2015, 21:34 2
Можно так.
Миниатюры
Loft в 3D  
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.09.2015, 22:24  [ТС] 3
Цитата Сообщение от Nacuott Посмотреть сообщение
Можно так.
Как получили координаты точек какие формулы? Нужно наверно получать координаты 4 точек вокруг каждого отрезка, как?
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
10.09.2015, 22:35 4
У точек есть "следующая/предыдущая" точка. Видимо в плоскости перпендикулярной линии в данной точке строится квадрат. И так для каждой.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.09.2015, 22:52  [ТС] 5
Цитата Сообщение от UI-Maker Посмотреть сообщение
в плоскости перпендикулярной линии в данной точке
Не получиться ли эффекта скрученного квадратного в сечении стержня? Первая вершина квадрата должна как-то соблюдать направление не могу понять.
Как будто в плоскости касательной что ли… непонятно. Или продолжить предыдущий отрезок он даст координаты точки + начало и конец отрезка дадут плоскость P0.
И в этой P0 и одновременно в плоскости перпендикулярной отрезку начинать построение квадрата…
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
11.09.2015, 12:32 6
Loft(ing)(er) - это когда дано N контуров ("Shape" на Вашем рисунке) которые соединяются между собой. А у Вас Sweeper - заданный контур по пути.

Надо строить контур за контуром вдоль пути и соединять их (получать полигоны). Чтобы построить 1 контур нужны те самые матрицы M1 и M2.

Смещение M1 = центр исходного контура.
Смещение M2 = очередная точка пути
Ось Z (M1) = нормаль к исходному контуру
Ось Z (M2) = текущее направление пути

Но остается еще 1 степень свободы - контур может вращаться вдоль пути. Чтобы зафиксировать ее нужно принять какое-то "направление выравнивания". Часто используют "нормаль к пути" это выглядит теоретично но на практике весьма неустойчиво. Поэтому я советую взять выравнивание = мировому Y. Тогда оси матриц

Z (известно)
Y = worldY(0, 1, 0)
X = Cross(Y, Z).Normalize();
Y = Cross(Z, X) // прием "уточнение произведения")

Ну а дальше все так же как в предыдущей задаче
1
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
12.09.2015, 12:40 7
Можно еще так.
Миниатюры
Loft в 3D  
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
12.09.2015, 15:56 8
Цитата Сообщение от Nacuott Посмотреть сообщение
Можно еще так.
И вот так
Миниатюры
Loft в 3D  
0
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
12.09.2015, 17:58 9
Igor3D , это Вы сами сделали? Я, например, выше сделал сам.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
12.09.2015, 18:40 10
Цитата Сообщение от Nacuott Посмотреть сообщение
Igor3D , это Вы сами сделали? Я, например, выше сделал сам.
Да, сделано на Sweeper'е который написал я. Если Вы тоже его делали - у нас масса тем для обсуждения (в личке, конечно).
0
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
12.09.2015, 19:01 11
Да, сделано на Sweeper'е который написал я. Если Вы тоже его делали - у нас масса тем для обсуждения (в личке, конечно)
Я делал в Маткаде.Что такое Sweeper - я не знаю.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.09.2015, 22:15  [ТС] 12
Цитата Сообщение от Nacuott Посмотреть сообщение
Что такое Sweeper - я не знаю.
Nacuott, вы посты не читаете?
Цитата Сообщение от Igor3D Посмотреть сообщение
А у Вас Sweeper - заданный контур по пути.
Кстати, Nacuott, какой смысл в кидании картинок без формул? Ну могу я скачать 500 готовых лофтов или свеперов и что? Ну могу в 3d max сделать свеппер тремя кликами мышки и что? Интересна именно формула или метод создания т.к. мне это нужно будет для визуализации скорости точки в 3д. Длинна отрезка будет определять диаметр окружности которая будет идти по пути (по задумке).
Цитата Сообщение от Igor3D Посмотреть сообщение
Смещение M1 = центр исходного контура.
Смещение M2 = очередная точка пути
Ось Z (M1) = нормаль к исходному контуру
Ось Z (M2) = текущее направление пути
Я понимаю что вы Igor3D, отлично знаете матрицы, но боюсь без детальных формул в символьной форме я не осилю…Все никак не соберусь на решение предыдущей задачи. Как-то это повисло в воздухе… толи лень толи… не знаю =).
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
13.09.2015, 06:48 13
Цитата Сообщение от Excalibur921 Посмотреть сообщение
но боюсь без детальных формул в символьной форме я не осилю…Все никак не соберусь на решение предыдущей задачи. Как-то это повисло в воздухе… толи лень толи… не знаю =).
Ну во-первых, это трудно, вообще 3D только кажется простым, это впечатление обманчиво. Поэтому особо смущаться не надо

Во-вторых, "детальные формулы в символьной форме" - это маразм, расписанные километры очень быстро становятся неподъемными. Делайте "инструменты", др пути нет

И попробуйте нарисовать матрицу, лично мне это всегда помогает
0
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
13.09.2015, 10:54 14
Excalibur921 , наверное, забанили Гугл.Если бы не забанили- набрал бы "каналовые поверхности".
0
Igor3D
13.09.2015, 13:19
  #15

Не по теме:

Цитата Сообщение от Nacuott Посмотреть сообщение
Excalibur921 , наверное, забанили Гугл.Если бы не забанили- набрал бы "каналовые поверхности".
Если термин так сомнительно звучит - лучше его не употреблять. Вспоминается как тут рыбой торговали "сомик (к)анальный" :)

0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
13.09.2015, 13:27  [ТС] 16
Цитата Сообщение от Igor3D Посмотреть сообщение
расписанные километры очень быстро становятся неподъемными
Зачем километры? Вы ж и дали символьную форму в прошлой задаче. Можно расписывать полную запись до элементарных действий - это длинные формулы. А можно и кратко в высокоуровневых командах. Обе они символьные формы.
Цитата Сообщение от Igor3D Посмотреть сообщение
Смещение M1 = центр исходного контура.
Это матрица 1 столбец на 3 строки? Но если центр формы Shape в 0.0.0 то какой смысл в этом?
Цитата Сообщение от Igor3D Посмотреть сообщение
Смещение M2 = очередная точка пути
Это будет матрица 1 столбец на 3 строки?
Цитата Сообщение от Igor3D Посмотреть сообщение
Ось Z (M1) = нормаль к исходному контуру
Нормаль к контуру? А если центр Shape в 0.0.0 то нормаль будет например 0.0.1?
Цитата Сообщение от Igor3D Посмотреть сообщение
Ось Z (M2) = текущее направление пути
Это координаты конца единичного вектора текущего отрезка пути?
Т.е. прошлая точка пути минус текущая и нормировка?
Эх… =).
Цитата Сообщение от Nacuott Посмотреть сообщение
наверное, забанили Гугл.
Так напишите в их тех. поддержку. А другие поисковики Яндекс, Рамблер, Мета, Яху..
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
13.09.2015, 15:00 17
Не спешите, прочувствуйте как работают матрицы

В математике с перемножением матриц все четко: строки первой матрицы множатся на столбцы второй, рез-том будет матрица с числом строк первого сомножителя и столбцов второго. В OpenGL и др. приложениях правила могут быть какими угодно, я их никогда и не помнил. Чтобы как-то в этом огороде разбираться придумали рабочие термины

"матрица справа" - означает что вектор-строка (1 строка, 3 колонки) множится на столбцы матрицы
"матрица слева" - наоборот, строки матрицы множатся на вектор-столбец (3 строки, 1 колонка)

Я выписываю (заполняю) матрицу по строкам полагая что вектор будет множиться по правилу "матрица справа". Конечно можно и все наоборот, рез-т будет тот же, дело вкуса. Главное понимать какое преобразование будет выполнено.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Это матрица 1 столбец на 3 строки? Но если центр формы Shape в 0.0.0 то какой смысл в этом?
В общем случае неизвестно что центр в нуле
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Нормаль к контуру? А если центр Shape в 0.0.0 то нормаль будет например 0.0.1?
Нормаль - это как повернут контур (куда он рыльцем смотрит), а не "где стоит". По-взрослому надо считать нормаль на основании исходных точек контура. Ну со скидкой на Вашу молодость можно принять напр мировой Z (т.е. Вы обязуетесь обеспечить такой исходный контур).

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Это координаты конца единичного вектора текущего отрезка пути?
Т.е. прошлая точка пути минус текущая и нормировка?
Эх… =).
Совершенно верно - Вы уже делаете первые успехи
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
13.09.2015, 19:54  [ТС] 18
Запутался вообще.
Вот так лучше для определенности:
A0=0.0.0 начало координат
вектор ось X (1.0.0)= B0
вектор ось Y (0.1.0)= B1
вектор ось Z(0.0.1)
B2(-1.0.0)
B3(0.-1.0)
Построение точек Bn идет против часовой. Значит B0 это координаты нормали контура Shape?Или ось Z это нормаль контура?
Путь C0,C1,C2…

Теперь в новых условиях так :
Z пути=С1-С0 нормируем
X пути= Cross((0, 1, 0), Z пути).Normalize();
Почему не получить Y через: Y пути= Cross(X пути, Z пути).Normalize(); ?

Добавлено через 2 часа 53 минуты
Пробовал немного расчеты.
Вот правильная формула нормированного Z вдоль пути.
Глобальные координаты Z пути отрезок AB
dAB длинна отрезка
Z пути =(((Bx-Ax)/dAB)+Ax,((By-Ay)/dAB)+Ay,((Bz-Az)/dAB)+Az)
А вот тут, Непонятные координаты дает:
X пути= Cross((0, 1, 0), Z пути).Normalize(); т.е это:
Для нормировки начало 0.1.0 второй Z пути ? Это возвращает локальные координаты или глобальные? Точки плавают непонятно…
Точка D определяет вектор X тогда так?:
Dx=1*Cz-0*Cy
Dy=0*Cx-0*Cz
Dz=0*Cy-1*Cx
И похоже ошибка тут :
// векторное произведение 2 векторов
Vec Cross( Vec a, Vec b )
{
Vec c;
SetVec(&c, a.y * b.z - a.z * b.y,
a.x * b.z - a.z * b.x,
a.x * b.y - a.y * b.x);
return c;
А в инете так:
(Ay*Bz-Az*By)
(Az*Bx-Ax*Bz)
(Ax*By-Ay*Bx)
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
14.09.2015, 00:09  [ТС] 19
Вроде исправил пашет почти.
Толстая синяя линия это нормированный Z0 вдоль траектории.
Красная толстая линия нормированный X:
X0 = Cross((0.1.0), (нормированный Z вдоль траектории)).Normalize();
Проблема с толстой зеленой Y.Поскольку она получаться от:
Y0 = Cross((0.0.1), (нормированный Z вдоль траектории)). Normalize();
Идет близко к другой оси( не ортогональна с другими двумя).
Loft в 3D

То ведет себя странно. Может нужно X0 векторно на Y0? Тогда будут все 3 ортогональны вроде.

1)А может вообще не считать Y0? Поскольку есть 3 точки в пространстве, и они единичной длинны, тогда можно взять вроде матрицу поворота вокруг произвольной оси и поворачивать точки вокруг вектора Z0 вокруг его начала и начиная от X0 вектора?

2)Но если получиться запустить матрицами из прошлой задачи, то можно будет удобней вращать сложный пространственный профиль вокруг ломанной.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
14.09.2015, 08:31 20
Цитата Сообщение от Excalibur921 Посмотреть сообщение
И похоже ошибка тут :
// векторное произведение 2 векторов
Vec Cross( Vec a, Vec b )
{
Vec c;
SetVec(&c, a.y * b.z - a.z * b.y,
a.x * b.z - a.z * b.x,
a.x * b.y - a.y * b.x);
return c;
А в инете так:
(Ay*Bz-Az*By)
(Az*Bx-Ax*Bz)
(Ax*By-Ay*Bx)
Да, это я насвистел во второй строке
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Почему не получить Y через: Y пути= Cross(X пути, Z пути).Normalize(); ?
Правила "правой тройки"
C++
1
2
3
X = Cross(Y, Z); 
Y = Cross(Z, X); 
Z = Cross(X, Y);
Т.е. каждая ось получается как векторное произведение 2 последующих. Если оси кончаются берем следующую с начала. Поэтому
C++
1
Y пути = Cross(Z пути, X пути).Normalize();
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Вот правильная формула нормированного Z вдоль пути.
Глобальные координаты Z пути отрезок AB
dAB длинна отрезка
Z пути =(((Bx-Ax)/dAB)+Ax,((By-Ay)/dAB)+Ay,((Bz-Az)/dAB)+Az)
А зачем Вы прибавляете Ax, Ay, Az? Z пути - это вектор, просто
C++
1
Z = (B - A).Normalize();
И плохо что Вы опять возитесь с каждым Ax, (y, z) - все должно быть в векторах

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Вроде исправил пашет почти.
Толстая синяя линия это нормированный Z0 вдоль траектории.
Красная толстая линия нормированный X:
X0 = Cross((0.1.0), (нормированный Z вдоль траектории)).Normalize();
Проблема с толстой зеленой Y.Поскольку она получаться от:
Y0 = Cross((0.0.1), (нормированный Z вдоль траектории)). Normalize();
Идет близко к другой оси( не ортогональна с другими двумя).
Прием "уточнение". Известно Z0 и вектор выравнивания
1) Получаем ось X перпендикулярную как Z так и выравниванию
X0 = Cross((0.1.0), (нормированный Z вдоль траектории)).Normalize();

2) Получаем ось Y перпендикулярную как оси X так и оси Z
Y0 = Cross(((нормированный Z вдоль траектории), X0)

Поскольку X и Z уже перпендикулярны и единичной длины, нормализация Y0 не требуется, он сам получится единичный. Именно так хвосты спрайтов равняются на камеру
0
14.09.2015, 08:31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru