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

Как выровнять объект по осям?

Страницы: 1 2 Следующая »
#0
23:35, 9 дек. 2011

Дан объект (матрица системы координат объекта), относительно мировой системы координат он повернут, растянут и сдвинут. Нужно расчитать матрицу домножая на которую объект выровняется по осям мировой системы оставшись в тойже точке, такимже растянутым. Помогите пжста, никак не соображу как((


#1
23:38, 9 дек. 2011

Matrix.Decompose()

на выходе кватернион вращения, вектор3 скейл и вектор3 траслейшн

#2
2:30, 10 дек. 2011

zamtmn
> Дан объект
Смотря какой. И как его выравнивать. Шар не выравнишь.

У объекта должен быть перед, зад, лево, право. Тогда можно. Находишь углы и поворачиваешь.

#3
7:56, 10 дек. 2011

Верхняя подматрица 3х3. Вручную задашь и будет тебе стастье.

#4
10:05, 10 дек. 2011

Вообще задача такая:
3Д редактор, операция переноса объектов. В случае когда точка за которую переносится объект (1) попадает на другой объект (2), переносимый объект должен выровняться по направлению объекта (2). Точка за которую перносится (1) не лежит в начале его координат.

Работает пока (2) лежит в плоскости z=0. как только в матрицах проскакивают z составляющие - приехали.

ALTAIR
>>на выходе кватернион вращения, вектор3 скейл и вектор3 траслейшн
понятно, но не работает...

asvp
>>Смотря какой. И как его выравнивать. Шар не выравнишь.
Визуально нет, но если у него есть СКО - выравню.
>>У объекта должен быть перед, зад, лево, право. Тогда можно. Находишь углы и поворачиваешь.
У объекта есть матрица. Зад и перед мне без надобности))

k119_55524
>>Верхняя подматрица 3х3. Вручную задашь и будет тебе стастье.
Хотелось бы обойтись методами (2).GetMatrix:DMatrix4D и (1).TransformBy(DMatrix4D). Но пробовал и руками в матрицы лазить - пока счастья нет

Бошка уже опухла от этих матриц... даже толком сформулировать проблему немогу((

#5
11:16, 10 дек. 2011

zamtmn
> У объекта есть матрица.
Ты уверен в этом?
zamtmn
> Бошка уже опухла от этих матриц... даже толком сформулировать проблему немогу((
Сел иванушка-дурачок на пенёк и горько заплакал

zamtmn
> 3Д редактор, операция переноса объектов. В случае когда точка за которую
> переносится объект (1) попадает на другой объект (2), переносимый объект должен
> выровняться по направлению объекта (2).
Хм, то есть зада, переда иванушка на нашел, а направление все-таки у объекта видит, как и матрицу...

#6
11:27, 10 дек. 2011

Красная Звезда
ты прям как из старого анекдота: мозгов нет, зато языки вооот такие...

#7
15:02, 10 дек. 2011

Zamtmn
Тебе тут уже сказали, правь ручками, в твоем случае это проще всего
Во-первых масштаб объекта не пихай в матрицу, храни отдельно и применяй его уже перед установкой матрицы для рендеринга. Иначе точно голова будет пухнуть.
Чтобы сделать выравнивание по осям сохранив перенос, просто верхнюю часть матрицы (3на3 кусок) из объекта (2) переносишь в объект (1)  (масштабирование применяешь после этого). И все дела :)

#8
15:12, 10 дек. 2011

zamtmn
Кстати. Если тебе нужно просто выравнивание по осям, то зачем нужен механизм перетаскивания, чтобы выбрать объект по которому будет происходить выравнивание. Может быть его лучше выбирать просто щелчком мыши, как это делается, например, в 3d studio. Типа выбираешь инструмент "Выровнять по осям", и потом указываешь первый и второй объекты.
"

#9
16:03, 10 дек. 2011

Tolanay
>>Во-первых масштаб объекта не пихай в матрицу, храни отдельно и применяй его уже перед установкой матрицы для рендеринга. Иначе точно голова будет пухнуть.
Делал таким способом - хранил отдельно точку вставки, нормаль (0z), поворот вокруг z и масштаб, такой подход тоже голову не очень бережет - наглядно всё пока в 2d, в 3d наглядность теряется. теперь храню только матрицы.
>>просто верхнюю часть матрицы (3на3 кусок) из объекта (2) переносишь в объект (1) (масштабирование применяешь после этого). И все дела :)
не все дела, точка вставки объекта при этом улетает, т.к. в матрице она хранится в системе координат объекта

>>Типа выбираешь инструмент "Выровнять по осям", и потом указываешь первый и второй объекты.
не, нужно чтото на подобии установки разных устройств на монтажные конструктивы внутри шкафов, типа берем реле, подтаскивием к din рейке, реле ориентируется как надо для установки.

#10
18:12, 10 дек. 2011

zamtmn
Ты бы поподробнее задачу описал, а то не очень понятно как все это должно работать. Типа объект присоединили и он потом должен двигаться в системе координат реле?

#11
18:39, 10 дек. 2011

zamtmn
> k119_55524
> > > рхняя подматрица 3х3. Вручную задашь и будет тебе стастье.
> Хотелось бы обойтись методами (2).GetMatrix:DMatrix4D и
> (1).TransformBy(DMatrix4D). Но пробовал и руками в матрицы лазить - пока
> счастья нет
Сделай функцию которая будет изменять 9 цифр в матрице, что может быть проще.
Если не понятно что на что менять то спроси.

#12
19:01, 10 дек. 2011

не 6 а 9  )  и предварительно надо скейл запомнить

#13
13:02, 11 дек. 2011

Tolanay
> Ты бы поподробнее задачу описал, а то не очень понятно как все это должно
> работать. Типа объект присоединили и он потом должен двигаться в системе
> координат реле?
Пока надо просто правильно сорентировать (1) относительно (2).
мультик с проблемой - http://i31.fastpic.ru/big/2011/1211/1c/8ff7e182ac24b31c6e14c5cf3b5d2b1c.gif
при посадке (1) на объекты лежащие в z=0 (2 линии и окружность) - всё ок. При посадке на окружность ориентированную в 3D видно как точка за которую перетаскивается объект (красный крестик) уезжает и объект ориентируется неправильно.
процедура поворачивающая объект:

procedure processobject(pobj:PGDBObjEntity;minusd,plusd,rm:DMatrix4D;x,y,z:GDBVertex);
var i: GDBInteger;
  m,oplus,ominus:DMatrix4D;
  tv:gdbvertex;
begin
  pobj^.Transform(minusd);                                         //переносим в начало координат
  m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;                //получаем матрицу объекта
  PGDBVertex(@m[3])^:=nulvertex;                            //сбрасываем перемещение, т.к. объект может перетаскиваеться не за точку вставки
  matrixinvert(m);                                                         //инвертируем
  pobj^.Transform(m);                                                 //ориентируем по осям мировой СК
  pobj^.Transform(rm);                                                //поворачиваем как объект "приемник" (2)
  pobj^.Transform(plusd);                                           //переносим обратно
  PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;   //пересчет параметров в связи со сменой места жительства объекта
  PGDBObjWithMatrix(pobj)^.Format;                         //пересчет параметров в связи со сменой места жительства объекта
end;

Перед вызовом процедуры объект уже находится в новой точке вставки, она его только поворачивает minusd,plusd - матрицы переноса объекта в начало координат и обратно, rm - матрица поворота чтоб стал как "приемник". Масштаб объекта кстати тоже херится. Править матрицу руками нехочу - т.к. разницы нету, руками или Transform - всеравно неработает, + в случае ручной правки надо будет дорабатывать механизм undo.

k119_55524
>>Сделай функцию которая будет изменять 6 цифр в матрице, что может быть проще.
>>Если не понятно что на что менять то спроси.
Нету разницы руками я правлю, ногами или pobj^.Transform. За исключением того что Transform уже учитывает UNDO, поэтому он предпочтительнее. Менять придется не 6 и не 9 а 12 цифр, т.к. перемещение в матрице лежит в системе координат объекта, и при просто переориентации объекта его точка вставки "улитит".
Не понятно. Спрашиваю))

#14
23:21, 11 дек. 2011

zamtmn
Я бы все-таки предложил задавать трансформацию не через матрицы, а непосредственно через центр, базис и масштабы (Но я бы тебе посоветовал забыть про масштабы в матрице, а масштабировать координаты объекта).
Создаешь какой-нибудь класс, который хранит эти данные и позволяет их менять через удобные для тебя функции. Так же класс должен иметь функцию возвращающую матрицу для этих данных. А в стеке undo будут храниться объекты этого класса. Ведь проще сделать transform.Move(...) , transform.RotateAxis() или  transform.Align(...), а при рисовании установить transform.GetMatrix(), чем плясать с самими матрицами.

По поводу кода, пройдусь по строкам. В Паскале правда не шарю.
pobj^.Transform(minusd);                                        //переносим в начало координат; Чтоб перенести в начало координат достаточно удалить элементы смещения у матрицы. И откуда у тебя вообще взялись эти матрицы plus minus?
  m:=PGDBObjWithMatrix(pobj)^.ObjMatrix;                //получаем матрицу объекта
  PGDBVertex(@m[3])^:=nulvertex;                            //сбрасываем перемещение, т.к. объект может перетаскиваеться не за точку вставки; Сброс перемещения. Ну это уже было сделано перемещением в начало координат.
  matrixinvert(m);                                                        //инвертируем;
  pobj^.Transform(m);                                                //ориентируем по осям мировой СК Инвертируем и умножаем на саму себя. Это мощный метод получения единичной матрицы :) А зачем тогда нужно все то, что было раньше, если можно просто установить единичную?
  pobj^.Transform(rm);                                                //поворачиваем как объект "приемник" (2); Дальше пихаем туда матрицу чужого объекта. Ага, а смещение оттуда убирать кто будет. Ведь ты говорил, что нужно только выравнивание
  pobj^.Transform(plusd);                                          //переносим обратно; Тут все понятно.
  PGDBObjWithMatrix(pobj)^.ReCalcFromObjMatrix;  //пересчет параметров в связи со сменой места жительства объекта
  PGDBObjWithMatrix(pobj)^.Format;                        //пересчет параметров в связи со сменой места жительства объекта


Похоже ошибка в том, что я выделил жирным (за исключением твоего ника :) :)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

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