Войти
ПрограммированиеФорумГрафика

Формирования матрицы трансформации из треугольника ABC в треугольник A`B`C`

Страницы: 1 2 Следующая »
#0
13:37, 21 июля 2017

Так, ребят, я тут всё таки завис на идее хакнуть distance field и сделать быстрый марчинг, нужна помощь :-)
Дано:
1. Треугольник в 3D с вершинами A, B и C
2. Треугольник в 3D с вершинами A`, B` и C`
Задача:
Найти такую матрицу трансформации, умножив на которую каждую вершину исходного треугольника, я бы получил треугольник с вершинами A`,B`,C`.
По сути нужно подобрать нужные коэффициенты масштаба, поворота и переноса.

Может кто сталкивался с такой задачей или есть линк, что почитать?


#1
13:49, 21 июля 2017

Не силен в матрицах, но по идее должно быть что-то вроде P'=P0+(P1-P0)*K, чисто векторная алгебра, где K - 0...1, коэффициент приближения, P0 и P1 - начальная и конечная точки.
Если я вообще правильно понял. Зачем что-то поворачивать и переносить, если итоговые координаты известны?

#2
13:53, 21 июля 2017

M — матрица 3х3
d — вектор сдвига
Итого 12 неизвестных.
СЛАУ:
Ma + d = a'
Mb + d = b'
Mc + d = c'
9 уравнений

нужно еще 3 условия для однозначного решения.

#3
14:09, 21 июля 2017

-=MASTER=-
Пропорции у треугольников сохраняются?

#4
14:22, 21 июля 2017

mahrizh
> ужно еще 3 условия для однозначного решения.
что я тупанул, всё же гораздо проще, у меня известны начальные и конечные координаты, так? Так! Значит я могу просто записать для каждой из трёх вершин по отдельности систему вида (x - начальная координата, x` - конечная)

x` = a * x;
y` = b * y;
z` = c * z;

три уравнения - три неизвестных, нахожу a,b и c и вуаля :-) То есть мне здесь даже матрица как бы не нужна, на каждый вертекс нужно 3 коэффициента, просто теперь нужно подумать, как это вкорячить в SDF...  Хотя конечно, матрица была бы более приемлемой...

Aroch
> Пропорции у треугольников сохраняются?
не, ничего не сохраняется, меняется всё.

VoidSpirit
> Зачем что-то поворачивать и переносить, если итоговые координаты известны?
да....долго рассказывать, это магия процедурной графики, вместо долгой проверки функцией дистанции треугольника, гораздо быстрее его фейково подвинуть куда надо...

#5
19:36, 21 июля 2017

Я могу подсказать, но не кодом, а алгоритмом.
Нужно для кажого треугольника построить базис по двум сторонам, и третий вектор базиса получить из векторного произведения. Теперь мы имеем две матрицы: M и M`. Теперь чтобы превратить треугольник без штриха в треугольник со штрихом нужно обратную матрицу от M умножить на M`.

#6
21:08, 21 июля 2017

MrShoor
> но не кодом, а алгоритмом
Чисто из принципа? :-)
А вообще, спасибо за подсказку, поразбираюсь в том, что ты написал...

#7
21:21, 21 июля 2017

-=MASTER=-
> Чисто из принципа? :-)
Ну это основы линейной алгебры. 3д разработчик должен знать это в обязательном порядке. Поэтому если ты этого не знаешь - самое время разобраться и выучить, не?

#8
21:25, 21 июля 2017

MrShoor
> Поэтому если ты этого не знаешь - самое время разобраться и выучить, не?
да не, покопаюсь конечно в том, что ты написал ...завтра... просто мне, да как наверное и любому другому проггеру, смотреть на код, нежели на формулы с закорючками, намного привычнее и удобнее :-)

#9
22:38, 21 июля 2017

-=MASTER=-
> смотреть на код, нежели на формулы с закорючками, намного привычнее и удобнее :-)

t1 = {{x1, y1, z1}, {x2, y2, z2}, {x3, y3, z3}}
t2 = {{a1, b1, c1}, {a2, b2, c2}, {a3, b3, c3}}

M1 = Transpose[{#1, #2, Cross[#1, #2]} &[#[[2]] - #[[1]], #[[3]] - #[[1]]] &[t1]]
M2 = Transpose[{#1, #2, Cross[#1, #2]} &[#[[2]] - #[[1]], #[[3]] - #[[1]]] &[t2]]

M = M2.Inverse[M1]
если я ниче не спутал + еще нужно учесть перенос
правда общая формула тебе не понравится :)
+ WARNING
#10
22:51, 21 июля 2017

-=MASTER=-
> По сути нужно подобрать нужные коэффициенты масштаба, поворота и переноса.
Можно еще попробовать "аналитически", посчитать поворот через кватернионы как поворот между векторами - там их будет два. Масштаб взять как разницу длинны одной стороны и высоты треугольников. Перенос будет разницей между вершинами. Но не уверен что это будет быстрее, но возможно это проще оптимизировать. И такой вариант предполагает сохранение ортоганальности.

#11
4:52, 22 июля 2017

Zegalur
> {#1, #2, Cross[#1, #2]} &[#[[2]] - #[[1]], #[[3]] - #[[1]]] &[t1]
Можешь расшифровать это?

#12
4:58, 22 июля 2017

-=MASTER=-
> Можешь расшифровать это?
Базис строит по двум сторонам и векторному произведению. То, о чем я писал.

#13
22:12, 22 июля 2017

-=MASTER=-
Тебе нужно с матрицей разобраться как она выглядит применительно для 3D. То есть понимать по ее значением к какому результату она приведет (хотя бы приблизительно представлять). Тогда ты просто будешь уже знать что тебе пишут.

#14
22:57, 22 июля 2017
foxes
Ему нужен готовый код, который он сможет ctrl+c/ctrl+v. Код из mathematica он не может ctrl+c/ctrl+v.
Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.