1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
1 | |
Loft в 3D10.09.2015, 19:10. Показов 854. Ответов 21
Метки нет (Все метки)
Как программы делают Loft?
На примере гладкая кривая и Loft с адаптивным разбиением. У меня задача намного проще: как провести форму “квадрат” по замкнутой ломанной из 30 точек? Если ломанная описывает сложные фигуры и восьмерки.
0
|
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
10.09.2015, 22:24 [ТС] | 3 |
Как получили координаты точек какие формулы? Нужно наверно получать координаты 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 |
Не получиться ли эффекта скрученного квадратного в сечении стержня? Первая вершина квадрата должна как-то соблюдать направление не могу понять.
Как будто в плоскости касательной что ли… непонятно. Или продолжить предыдущий отрезок он даст координаты точки + начало и конец отрезка дадут плоскость 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
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
|
|
12.09.2015, 15:56 | 8 |
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
|
|
12.09.2015, 18:40 | 10 |
Да, сделано на Sweeper'е который написал я. Если Вы тоже его делали - у нас масса тем для обсуждения (в личке, конечно).
0
|
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
12.09.2015, 22:15 [ТС] | 12 |
Nacuott, вы посты не читаете?
Кстати, Nacuott, какой смысл в кидании картинок без формул? Ну могу я скачать 500 готовых лофтов или свеперов и что? Ну могу в 3d max сделать свеппер тремя кликами мышки и что? Интересна именно формула или метод создания т.к. мне это нужно будет для визуализации скорости точки в 3д. Длинна отрезка будет определять диаметр окружности которая будет идти по пути (по задумке). Я понимаю что вы Igor3D, отлично знаете матрицы, но боюсь без детальных формул в символьной форме я не осилю…Все никак не соберусь на решение предыдущей задачи. Как-то это повисло в воздухе… толи лень толи… не знаю =).
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
|
|
13.09.2015, 06:48 | 13 |
Ну во-первых, это трудно, вообще 3D только кажется простым, это впечатление обманчиво. Поэтому особо смущаться не надо
Во-вторых, "детальные формулы в символьной форме" - это маразм, расписанные километры очень быстро становятся неподъемными. Делайте "инструменты", др пути нет И попробуйте нарисовать матрицу, лично мне это всегда помогает
0
|
Igor3D
|
13.09.2015, 13:19
#15
|
0
|
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
13.09.2015, 13:27 [ТС] | 16 |
Зачем километры? Вы ж и дали символьную форму в прошлой задаче. Можно расписывать полную запись до элементарных действий - это длинные формулы. А можно и кратко в высокоуровневых командах. Обе они символьные формы.
Это матрица 1 столбец на 3 строки? Но если центр формы Shape в 0.0.0 то какой смысл в этом? Это будет матрица 1 столбец на 3 строки? Нормаль к контуру? А если центр Shape в 0.0.0 то нормаль будет например 0.0.1? Это координаты конца единичного вектора текущего отрезка пути? Т.е. прошлая точка пути минус текущая и нормировка? Эх… =). Так напишите в их тех. поддержку. А другие поисковики Яндекс, Рамблер, Мета, Яху..
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
|
|
13.09.2015, 15:00 | 17 |
Не спешите, прочувствуйте как работают матрицы
В математике с перемножением матриц все четко: строки первой матрицы множатся на столбцы второй, рез-том будет матрица с числом строк первого сомножителя и столбцов второго. В OpenGL и др. приложениях правила могут быть какими угодно, я их никогда и не помнил. Чтобы как-то в этом огороде разбираться придумали рабочие термины "матрица справа" - означает что вектор-строка (1 строка, 3 колонки) множится на столбцы матрицы "матрица слева" - наоборот, строки матрицы множатся на вектор-столбец (3 строки, 1 колонка) Я выписываю (заполняю) матрицу по строкам полагая что вектор будет множиться по правилу "матрица справа". Конечно можно и все наоборот, рез-т будет тот же, дело вкуса. Главное понимать какое преобразование будет выполнено. В общем случае неизвестно что центр в нуле Нормаль - это как повернут контур (куда он рыльцем смотрит), а не "где стоит". По-взрослому надо считать нормаль на основании исходных точек контура. Ну со скидкой на Вашу молодость можно принять напр мировой Z (т.е. Вы обязуетесь обеспечить такой исходный контур). Совершенно верно - Вы уже делаете первые успехи
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(); Идет близко к другой оси( не ортогональна с другими двумя). То ведет себя странно. Может нужно X0 векторно на Y0? Тогда будут все 3 ортогональны вроде. 1)А может вообще не считать Y0? Поскольку есть 3 точки в пространстве, и они единичной длинны, тогда можно взять вроде матрицу поворота вокруг произвольной оси и поворачивать точки вокруг вектора Z0 вокруг его начала и начиная от X0 вектора? 2)Но если получиться запустить матрицами из прошлой задачи, то можно будет удобней вращать сложный пространственный профиль вокруг ломанной.
0
|
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,746
|
||||||||||||||||
14.09.2015, 08:31 | 20 | |||||||||||||||
Да, это я насвистел во второй строке
Правила "правой тройки"
Прием "уточнение". Известно 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 | |