Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Что такое Матрица ?   Найти похожие ветки 

 
Кто---то ©   (2004-10-31 02:41) [0]

в GLScene.

Для однозначного определения вращения объекта достаточно трёх чисел. В которых записаны вращения вокруг осей X, Y, Z. Но в GLScene вращения задаются шестью цифрами. Три в Direction и три в Up. А в Матрицах, так вообще девятью числами. Кто-нибудь знает в чём прикол ? Зачем это ? И как именно они между собой связаны ?


 
Fenik   (2004-10-31 10:28) [1]

Это числовая таблица.


 
dimodim   (2004-10-31 10:49) [2]

Не парься
 Что за вопрос?
  1.Что такое матрица, или
  2.В чем прикол


 
DeadMeat ©   (2004-10-31 19:15) [3]

Не знаю как там насчет матриц (в мат части не очень силен), но Direction и Up - это минимум, для определения вращения предмета в пространстве.
Допустим у нас есть конус, распиленный пополам (сверху вниз, в смысле до основания...). Если мы зададим только Direction, то мы повернем его в нужном нам направлении "вышкой", т.е. узкой его частью (не помню как это называется). Но мы не сможем определить, какую из половин направить наверх. Т.е. он может смотреть в одну сторону, но при этом отпиленной половиной смотреть, скажем, влево. Выставив Up мы выберем, именно направление "вверх". Т.е. сможем уже поставить его в нужную нам "позу". Другими словами, Direction - направление вдоль оси Z, а Up - вдоль Y. (кажись так). При этом всем, при изменении Direction меняется и Up (или наоборот..., щас не помню). Т.е. их надо в какой то последовательности выставлять. Вначале одно, потом другое.
Там еще есть Left и Right. Видимо для удобства расчетов.


 
Поручик ©   (2004-10-31 19:44) [4]

Вот за что не люблю всякие GLScene и DelphiX"ы. Типа я программирую под DirectX и OpenGL, а потом такие вопросы задают. Матрицы это такие штуки  что б вертеть и крутить, смещать, масштабировать, проецировать, трансформировать объекты в OpenGL. Это основа! Но вам ГЛСценщикам это не нужно! >:|


 
NailMan ©   (2004-10-31 20:05) [5]

Как это выглядит в DirectX:

Матрица трансформаций есть мастрица Single-ов 4x4

m._11,m._12,m._13,m._14
m._21,m._22,m._23,m._24
m._31,m._32,m._33,m._34
m._41,m._42,m._43,m._44

Причем всегда элементы m._14,m._24,m._34 равны нулю, а m.44 равен единице.

Теперь поэлементно

 m._11 := right.x;
 m._12 := right.y;
 m._13 := right.z;

 m._21 := up.x;
 m._22 := up.y;
 m._23 := up.z;

 m._31 := dir.x;
 m._32 := dir.y;
 m._33 := dir.z;

 m._41 := Pos.x;
 m._42 := Pos.y;
 m._43 := Pos.z;

таким образом для определения поворота объекта в пространстве необходимо ТРИ вектора: Up, Dir, Right, потому что в DirectX используется левосторонняя система отсчета.

Коэффициенты масштабирования помножаются(после поворотов) на элементы
m._11,m._22,m._33, тоесть расположенные на главной диагонали.

Самое главное чтобы все вектора Up,Right,Dir перед операцией умножения на коэфициенты масштабирования были нормализованы.

Теперь что касается OGL(в контексте GLScene): дело в том что расположение элементов в матрице в DirectX и OGL различны(но все вектора RUD присутствуют в матрице OGL обязательно). Стоит выяснить как там расположено, только и всего.

---
WBR, NailMan aka 2:5020/3337.13


 
Mihey_temporary ©   (2004-10-31 20:08) [6]

Выдержка из книги Краснова "DirectX. Графика в проектах Delphi":

"Трёхмерная графика базируется, как правило, на матричном подходе, заключающемся в том, что операции с системой координат основываются на матричном представлении. Базовым элементом матричного подхода является матрица (таблица чисел) размером 4х4. Я знаю первый вопрос, который возникает всегда и у всех, кто впервые слышит о матричном методе: почему размер матрицы именно такой. В математике для описания точки в пространстве используется четыре числа, вспомогательной характеристике можно придать любой смысл, это может быть, например, заряд частицы или материальная масса. В графике четвёртый компонент координаты точки называется W-координатой и предназначен для осуществления проекции точки на плоскость экрана. Это весовой фактор, на который умножаются координаты точки при её проецировании. Его значение задаётся единичным."


 
wiz ©   (2004-10-31 20:39) [7]

2 Mihey: wow! Краснов, однако, хороший гонщик... :))) интересно, где он такую траву берёт?

просто базис такой (x,y,z,1)... оттуда и матрицы 4x4...

А тем кто афинных преобразований не знает, но хочет прогить 3d-графику - "Аналитическая геометрия" Must-Read!!!

если не хотите читать (сложно/не хочется/времени нет), то нечего вообще в это дело лезть...

PS: imho


 
Кто---то ©   (2004-11-01 01:32) [8]


> DeadMeat ©   (31.10.04 19:15) [3]
> Не знаю как там насчет матриц (в мат части не очень силен),
> но Direction и Up - это минимум

Минимум - три числа, а не шесть. Если ты конечно живёшь в трёхмерном пространстве.


> таким образом для определения поворота объекта в пространстве
> необходимо ТРИ вектора: Up, Dir, Right,

Между прочим, в SMD-файлах скелетной анимации, прекрасно обходятся всего одним вектором.
Можно на каком нибудь конкретном примере объяснить для чего нужны три и что они конкретно дают ?

Вот допустим есть у нас один единственный вектор из smd-файла. Как из него получить матрицу, и как из матрицы обратно получить один вектор ?


 
П7   (2004-11-01 09:54) [9]

А я вот ламак пока видимо, ибо с OpenGL-матрицами пока не разбирался. Как-то без надобности было. Пока мне glRotatef и glTranslatef хватает за уши. Чего ещё нужно? Но видимо это фича с матрицами шустрее работает. Так что рано или поздно придётся за них взяться, как только тяжёлые 3D-редеры пойдут...
(:


 
Megabyte-CeerCop ©   (2004-11-01 10:28) [10]

Тут необходимость в матрицах такая:
для того чтобы определить угол поворота объекта, действительно достаточно трёх параметров, и при отрисовке объкта придется карте разлагать эти три параметра на производные (Sin, Cos и прочие функции над этими тремя параметрами производить) а в матрице выкладываются уже готовые производные, благодаря чему экономится время на доп. вычисления.


 
NailMan ©   (2004-11-01 21:05) [11]

Кто---то ©  
Не силен в Максовских форматах: Случаем не кватернионы там используются? Кватернион это 4 float-числа.

Или 3 числа - это углы поворота вокруг локальной оси предка(в костевой иерархии). Да мало-ли чего.

Конкретный пример - евклидово пространство. Есть оси OX, OY, OZ однозначно задающие направления "бока", "верха" и "зада". Точно также и у объектов. Матрица - это фактически его локальная система координат, имеющая те самые направления осей локальных координат OX`, OY`, OZ`, которыми будут трансформированны все вершины сетки объекта.

Короче. Есть матрица трансформаций. Она содержит все необходимое для определения положения и ориентации объекта в пространстве. Видеоакселератор берет эту матрицу и перемножает ее на вектор вершины(точнее на компонент вершины XYZ), простым перемножением вектора на матрицу и получает трансформированную вершину, которая далее учавствует в формировании треугольников.

Эту матрицу мы и должны в итоге получить. Какая нафиг разница как хранить: в виде компонентов из которыхз получится матрица, или просто саму матрицу? Я например храню и то и другое.

Возвращаясь к векторам Up, Right, Dir.

Самый классический пример использования векторов локальных координат(взят из реального примера):

//передвинуть координаты объекта вдоль оси на некоторую величину
procedure TBasicObject.SetPosRel(const v: TD3DVector; const s: single);
begin
 World.fPOS.x := World.fPOS.x + v.x * s;
 World.fPOS.y := World.fPOS.y + v.y * s;
 World.fPOS.Z := World.fPOS.z + v.z * s;
 world.fmat._41 := World.fPOS.x;
 world.fmat._42 := World.fPOS.y;
 world.fmat._43 := World.fPOS.z;
end;

Использование векторов:

//Двигаем объект вдоль его направления  взгляда(вперед-назад)
SetPosRel(GetDir,MoveCaps.LinearVelocity);
//Двигаем объект вправо-влево(стрейфинг)
SetPosRel(GetRight,MoveCaps.StrafeVelocity);
//Двигаем объект вверх-вниз(прыжок)
SetPosRel(GetUp,MoveCaps.VerticalStrafeVelocity);

методы GetDir,GetRight,GetUp соответсвенно вытаскивают вышеприведенные мной элементы матрицы.

Просто как божий день.

---
WBR, NailMan aka 2:5020/3337.13


 
DeadMeat ©   (2004-11-01 21:43) [12]


> Минимум - три числа, а не шесть. Если ты конечно живёшь
> в трёхмерном пространстве.

Лучше один раз увидеть...
http://www.deadmeat.fatal.ru/100_010.jpg
это объект у которого Direction=(1,0,0) и Up=(0,1,0)
http://www.deadmeat.fatal.ru/100_001.jpg
а это тотже объект. Direction=(1,0,0) а Up=(0,0,1).
Как видишь Direction-ы у них одинаковые, однако объекты расположены по разному...

---
...Death Is Only The Begining...


 
dimodim-modern   (2004-11-01 23:10) [13]


> Лучше один раз увидеть...

РЕАЛЬНО , но ОРКИ РУЛЯТ


 
wiz ©   (2004-11-01 23:29) [14]

2 all: и еще чуть-чуть о трёх и шести числах...

Часть I. О трёх числах.

для задания ориентации объекта в трёхмерном пространстве достаточно трёх углов поворота - крен/тангаж/рыскание. _ТРИ_ степени свободы - _ТРИ_ числа.

(Если добавить еще три числа - координаты объекта - получим классические шесть степеней свободы твёрдого тела в трёхмерном пространстве).

Часть II. О шести числах.

Когда мы задаём шесть чисел, т.е. два вектора Direction и Up, то:
а) Direction задаёт _два_ угла поворота (не задаёт угол поворота вокруг оси direction) и задаёт _одно_ масштабирование вдоль своего направления. (т.е. если не делать нормирование векторов, то (1,0,0) и (2,0,0) - это совсем не одно и тоже). итого: _три_ преобразования

б) Up задаёт _угол_ поворота вокруг оси direction, задаёт _масштабирование_ вдоль направления Up, и задаёт _угол_ между осями Direction и Up (вообще говоря, никто не говорит, что эти направления должны быть ортогональны). итого: еще _три_ параметра

Всего: _шесть_ параметров преобразования и _шесть_ чисел

Всё сходится...

PS:хотя конечно, если ортонормировать данную систему из двух векторов, например методом Грамма-Шмидта, то как раз появятся три уравнения, которые свяжут компоненты векторов. Тогда, эти 3 уравнения определят однозначно какую-нибудь тройку переменных через другую тройку... и тогда останутся только углы поворота, а масштабные коэффициенты и угол между векторами - просто уйдут...


 
Кто---то ©   (2004-11-02 05:13) [15]


> wiz ©   (01.11.04 23:29) [14]
> а) Direction задаёт _два_ угла поворота (не задаёт угол
> поворота вокруг оси direction) и задаёт _одно_ масштабирование
> вдоль своего направления. (т.е. если не делать нормирование
> векторов, то (1,0,0) и (2,0,0) - это совсем не одно и тоже).
> итого: _три_ преобразования

То есть первая цифра - длина вектора. а вторая и третья - углы его поворота ?


> Up задаёт _угол_ поворота вокруг оси direction, задаёт _масштабирование_
> вдоль направления Up,

А куда тогда направлено это Ап ?

И как преобразовать три обычных координаты в эти шесть ? И обратно.

И главное, зачем всё это нужно то ?


> NailMan ©   (01.11.04 21:05) [11]

А как из девяти цифр матрицы сделать три ?


 
wiz ©   (2004-11-02 07:04) [16]

2 Кто---то:

>То есть первая цифра - длина вектора. а вторая и третья - углы его поворота ?
Нет... эти три числа - компоненты вектора (Direction). Но если хорошо подумать и посидеть с ручкой и бумагой, то можно из этого вектора получить всё то, о чём я говорил.

(Например: direction=(dx,dy,dz). Длина вектора задаёт масштабирование. Cчитаем евклидову норму, т.е. L=sqrt(sqr(dx)+sqr(dy)+sqr(dz)). С углами всё чуть сложнее, это делается через скалярное произведение, нормы и арккосинус).

>А куда тогда направлено это Ап ?
Туда, куда ты его направил. Или через два угла относительно направления direction (через эти углы и длину вектор Up выражается однозначно)

>И как преобразовать три обычных координаты в эти шесть ? И обратно.
Читаем "Аналитическую геометрию"

>И главное, зачем всё это нужно то ?
у-у-у... удобно это батенька... вот и всё, что я могу сказать

>А как из девяти цифр матрицы сделать три ?
хрм-м-м... не _цифр_, а чисел!... (читаем "Аналитическую геометрию")


 
NailMan ©   (2004-11-02 09:54) [17]

Кто---то ©
> А как из девяти цифр матрицы сделать три ?

Тогда объясни что такое эти три числа.

Если углы Эйлера, то нафига они сдались?

Углы(абсолютные, отсчитываемые от начала координат OGL или D3D) в 3Д-графике крайне неудобные величины. Для получения матрицы надо сделать очень много "тяжелых" вычислений. А с векторами все очень просто.

Скажем такой простйший пример: нам надо сориентировать камеру зная точку камеры(координату объектива камеры) и ее точку прицеливания(как в 3dsMax). Как удобней получить вектор ее "взора" для последующей ориентации спрайтов стоко перпендикулярно этому вектору(так устроен спрайт)?

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

2. вариант. Идиотический. Берем и вращаем вокруг 2 глобальных осей вектор направления(единичный и направленный скажем вдоль оси Z) на 3 угла, получаем после нормализации вектор направления.

Первый вариант делается в несколько арифметических действий. Второй делается с одной или несколькими умножениями вектора на матрицу и еще несколькими арифметическими операциями.

---
WBR, NailMan aka 2:5020/3337.13


 
Кто---то ©   (2004-11-03 01:48) [18]


> NailMan ©   (02.11.04 09:54) [17]
> Кто---то ©
> > А как из девяти цифр матрицы сделать три ?
>
> Тогда объясни что такое эти три числа.

О чём можно говорить, если это непонятно ?
Это вращения вокруг осей X Y Z.


> Для получения матрицы надо сделать очень много "тяжелых"
> вычислений.

Каких тяжёлых вычислений ? Ты на счётах что ли считаешь ? Бред вообще.


> Скажем такой простйший пример: нам надо сориентировать камеру

GLScene сама ориентирует камеру на указанный объект.


> wiz ©   (02.11.04 07:04) [16]
> >И как преобразовать три обычных координаты в эти шесть
> ? И обратно.
> Читаем "Аналитическую геометрию"

Короче не знаешь. Тогда всего остального можно было и не говорить.


 
wiz ©   (2004-11-03 07:17) [19]

2 Кто---то[18]:

>Каких тяжёлых вычислений ? Ты на счётах что ли считаешь ? Бред вообще.
хм-м-м... ты похоже чего-то недопонимаешь... если у тебя есть 15000 объектов в игровом пространстве, то начинает сильно-сильно влиять, делаешь ты в каком-то месте их отрисовки два умножения или три умножения. (И три умножения становятся _очень тяжёлыми вычислениями_)

>GLScene сама ориентирует камеру на указанный объект.
хм-м-м... если у тебя такое отношение к программингу графики (т.е. абсолютно пофигу, как и что происходит на самом деле), то зачем ты стал интересоваться векторами и матрицами? Лучше пойди в магазин, купи Doom-3 и забудь про всю эту "чухню"... :)))

>Короче не знаешь. Тогда всего остального можно было и не говорить.
%)))))))))))))))))))))))) долго ржал :) такой детский лепет.....

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

PS: Возник вопрос: а можно узнать, в каком ВУЗе и на каком факультете ты учился?


 
NailMan ©   (2004-11-03 10:16) [20]

wiz ©
Он наверно поторопился с выбором в графе "Образование". Первокур наверно.

---
WBR, NailMan aka 2:5020/3337.13


 
wiz ©   (2004-11-03 14:14) [21]

2 Кто-то: сегодня была одна муторная лекция и я на листочке повспоминал геометрию...
--------------------------------------------------------------------
Обозначения:
Direction = (Dx,Dy,Dz)
Up = (Ux,Uy,Uz)
Right = (Rx,Ry,Rz)

Углы поворота: α,β,γ
--------------------------------------------------------------------
Часть I. (перевод углов α,β,γ в векторы Direction и Up).

Dx = cos(β)*cos(α)
Dy = cos(β)*sin(α)
Dz = sin(β)

Ux = -sin(β)*cos(γ)*cos(α)+sin(γ)*sin(α)
Uy = -sin(β)*cos(γ)*sin(α)-sin(γ)*cos(α)
Uz =  cos(β)*cos(γ)


Вектор Right можно получить простым векторным умножением [ D * U ]
--------------------------------------------------------------------
Часть II. (перевод векторов Direction и Up в углы α,β,γ).

β = arcsin(Dz)
α = arccos(Dx / cos(β))
γ = arccos(Uz / cos(β))

--------------------------------------------------------------------

Объяснять не буду, т.к. я не педагог и мне за это никто не платит... Единственное, что хочу сказать: векторы D,U,R - локальная система координат объекта и они легко находятся через базисные векторы ((1,0,0),(0,1,0),(0,0,1)), домноженные на соответствующие матрицы поворотов пространства.

---
бритва Оккама: "Не создавайте сущности сверх необходимого"



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.048 c
1-1106471634
reborn
2005-01-23 12:13
2005.02.06
инфа из TMemo


11-1089658722
AlexR
2004-07-12 22:58
2005.02.06
RichEdit и scrollbar


1-1106272696
ДЫМ
2005-01-21 04:58
2005.02.06
Как на канве нарисовать жирную пунктирную линию


4-1103166649
Guest44
2004-12-16 06:10
2005.02.06
use GetSystemMetrics


3-1105011777
sergeii
2005-01-06 14:42
2005.02.06
Копирование полей