1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "MAXScript", создана пользователем Сэмc, 15 мар 2015.

Модераторы: Savin Denis
  1. Сэмc

    Сэмc Пользователь сайта

    С нами с:
    10.03.2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Есть координаты объекта [x, y, z], имеется вектор верха в виде [0, 1, 0], и вектор поворота, опятьже, вида [0, 0, 1]

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

    Заранее спасибо
     
    Последнее редактирование: 15 мар 2015
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Объясните подробнее.
    Откуда вы взяли координаты объекта, вектор верха и вектор поворота?
    Что такое вектор верха? Это ось 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 нравится это.
  3. Сэмc

    Сэмc Пользователь сайта

    С нами с:
    10.03.2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Оба вектора состоят из трех составляющих 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
     
    Последнее редактирование: 16 мар 2015
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Теперь стало понятнее.
    Если объект не имеет родителя тогда будет так:
    Код:
    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 нравится это.
  5. Сэмc

    Сэмc Пользователь сайта

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

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

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Вы можете предоставить полностью код скрипта, а не только одну строчку?

    Вот пример с сферой и чайником. В конце скрипта группируем сферу и чайник.
    Координаты и повороты сферы и чайника делаются не правильно?
    Код:
    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"
     
  7. Сэмc

    Сэмc Пользователь сайта

    С нами с:
    10.03.2015
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Отправил нужную информацию в ЛС
     
Модераторы: Savin Denis

Поделиться этой страницей