Форум: "Игры";
Текущий архив: 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