Render.ru

Матрица поворота

Сэмc

Пользователь сайта
Рейтинг
2
#1
Есть координаты объекта [x, y, z], имеется вектор верха в виде [0, 1, 0], и вектор поворота, опятьже, вида [0, 0, 1]

Прошу, объясните как работать с этими векторами, и как правильно повернуть объект? перерыл многое из гугла, ничего подобного не нашёл((

Заранее спасибо
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#2
Объясните подробнее.
Откуда вы взяли координаты объекта, вектор верха и вектор поворота?
Что такое вектор верха? Это ось Z объекта? Как вы получили вектор верха?
Что такое вектор поворота? Это ось X или Y объекта? Как вы получили вектор поворота?
Пример:
Координаты объекта [10,20,30]. Ось Z объекта равно [0, 1, 0]. Ось X объекта равно [0, 0, 1].
Запускаем скрипт в новой сцене. Скрипт создает чайник и применяет трансформацию к нему.
Код:
p=[10,20,30]; zv=[0, 1, 0]; xv=[0, 0, 1]; yv=cross zv xv; 
obj=Teapot(); obj.transform=matrix3 xv yv zv p
 

Сэмc

Пользователь сайта
Рейтинг
2
#3
Оба вектора состоят из трех составляющих x,y,z и представляют собой единичный вектор Direction(поворота)-вектор указывающий направление объекта относительно системы координат объекта - родителя. Up(вектор верха) - вектор указывающий положение объекта относительно своей системы координат.
В GLScene на дэльфе, всё продеывал вот так
Код:
 FF, грубо говоря мой объект
  FF.Scale.X := Attribute.ScaleX;
  FF.Scale.Y := Attribute.ScaleY;
  FF.Scale.Z := Attribute.ScaleZ;

  UP := FF.UP.AsAffinevector;
  dir := FF.Direction.AsAffinevector;
  UP.X := Attribute.Rotatex.DirectionUp;
  UP.Y := Attribute.Rotatez.DirectionUp;
  UP.Z := Attribute.Rotatey.DirectionUp;

  dir.X := Attribute.Rotatex.DirectionLeft;
  dir.Y := Attribute.Rotatez.DirectionLeft;
  dir.Z := Attribute.Rotatey.DirectionLeft;

  FF.UP.AsAffinevector := UP;
  FF.Direction.AsAffinevector := dir;

  FF.Position.X := Attribute.PosX;
  FF.Position.Y := Attribute.PosZ;
  FF.Position.Z := Attribute.PosY;
Чуточку инфы что за UP и Direction
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#4
Теперь стало понятнее.
Если объект не имеет родителя тогда будет так:
Код:
scale_vector=[1,2,3]
Up_Vector=[0, 1, 0]
Direction_Vector= [0, 0, 1]
Left_Vector=cross  Up_Vector Direction_Vector
Position_Vector=[10,20,30]

axis_x=Left_Vector*scale_vector.x
axis_y=Up_Vector*scale_vector.y
axis_z=Direction_Vector*scale_vector.z
m=matrix3 axis_x axis_y axis_z Position_Vector

obj=Teapot();obj.transform=m
У вас объекты имеют родителей?
Вы сохраняете название родителя объекта?
Вы имеете информацию о родителей объектов?
Если информация сохраняется в системе координат родителя тогда будет так.
Запускаем скрипт в новой сцене.
Скрипт создает сферу и чайник. Сфера это родитель чайника.
Скрипт применяет трансформацию к чайнику в системе координат родителя.
Код:
scale_vector=[1,2,3]
Up_Vector=[0, 1, 0]
Direction_Vector= [0, 0, 1]
Left_Vector=cross  Up_Vector Direction_Vector
Position_Vector=[10,20,30]

axis_x=Left_Vector*scale_vector.x
axis_y=Up_Vector*scale_vector.y
axis_z=Direction_Vector*scale_vector.z
m=matrix3 axis_x axis_y axis_z Position_Vector

obj_parent=sphere();obj_parent.pos=[50,60,70]; obj_parent.rotation.z_rotation=30
obj=Teapot(); obj.parent=obj_parent
obj.transform=m*obj_parent.transform
 

Сэмc

Пользователь сайта
Рейтинг
2
#5
Хм, есть чтото похожее на нужный поворот, но, в основном модель состоит из нескольких мешей, из-за этого, я делаю grp = group arrMesh name: (filenameFromPath pathtofile), в итоге, координаты и повороты делаются не правильно, как быть?

igorznag, огромное спасибо за предоставленную помощь...
 

igorznag

Мастер
Рейтинг
103
#6
Вы можете предоставить полностью код скрипта, а не только одну строчку?

Вот пример с сферой и чайником. В конце скрипта группируем сферу и чайник.
Координаты и повороты сферы и чайника делаются не правильно?
Код:
scale_vector=[1,2,3]
Up_Vector=[0, 1, 0]
Direction_Vector= [0, 0, 1]
Left_Vector=cross  Up_Vector Direction_Vector
Position_Vector=[10,20,30]

axis_x=Left_Vector*scale_vector.x
axis_y=Up_Vector*scale_vector.y
axis_z=Direction_Vector*scale_vector.z
m=matrix3 axis_x axis_y axis_z Position_Vector

obj_parent=sphere();obj_parent.pos=[50,60,70]; obj_parent.rotation.z_rotation=30
obj=Teapot(); obj.parent=obj_parent
obj.transform=m*obj_parent.transform

grp = group #(obj,obj_parent) name: "group_sphere_teapot"
 
Сверху