Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
Кто---то ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.044 c
3-1104780165
Jiny
2005-01-03 22:22
2005.02.06
аналог EncodeDate в Interbase или как сцепить строковые значения


1-1105756712
Прекрасно
2005-01-15 05:38
2005.02.06
Существует ли качалка с открытым исходником на Дельфи ?


14-1105705510
WhiteGuy
2005-01-14 15:25
2005.02.06
Халявные com-хосты


1-1106521601
ninja
2005-01-24 02:06
2005.02.06
прокрутка StringGrid


3-1104850241
Брат
2005-01-04 17:50
2005.02.06
Ошибка в SQL-запросе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский