Матрицы

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Матрицы

Сообщение mdx » 13.01.2006 (Пт) 6:17

Как можно получить из матрицы вращения направление по X, Y, Z (такое как, например, указывается для направленного света)?

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 13.01.2006 (Пт) 15:51

Думаю, для этого надо знать и углы поворота... Так как если ты делаешь поворот матрицы, ты задаёш его вектором! А если ты знаешь углы поворота(надо X,Y) то ты можешь найти направление луча!
Возмём переменный Angle - поворот по Y
Diff - поворот по оси X

Function GetRayDirection(Angle As Single, Diff As Single) As D3DVECTOR
Dim Dir as D3DVECTOR
Dir = vec3(-Sin(Angle) * Cos(Diff), Sin(Diff), Cos(Angle) * Cos(Diff))
GetRayDirection = Dir
End Function

А если нет углов поворота, тогда незнаю!
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.01.2006 (Пт) 16:41

Код: Выделить всё
Dim SinA As Single, CosA As Single, SinD As Single, CosD As Single

Private Sub CalcAngleDiff()
Dim v As D3DVECTOR
  d3dDevice.GetTransform D3DTS_VIEW, Mtrx
  D3DXMatrixInverse Mtrx, 1, Mtrx
  D3DXVec3TransformNormal v, vec3(0, 0, 1), Mtrx
'  D3DXVec3Normalize v, v   'Эта строка возможно не понадобится
  SinD = v.y
  CosD = Sqr(1 - SinD * SinD)
  SinA = -v.x / CosD
  CosA = v.z / CosD
End Sub

Это я уже выкладывал недавно. Из матрицы, содержащейся в D3DTS_VIEW, получает синус и косинус углов поворота и наклона.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.01.2006 (Пт) 16:45

Нужно ли говорить, что:
y = SinD
x = SinA * CosD
z = CosA * CosD
Возможны варианты со знаками + или -, в зависимости от типа проекции.

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 15.01.2006 (Вс) 11:06

Это код для матрицы вида, а, насколько я знаю, для матрицы вращения (из которой потом получается D3DTS_WORLD) код будет несколько другим. :!:

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 15.01.2006 (Вс) 11:09

Хотя и за тот код спасибо :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.01.2006 (Вс) 13:16

mdx
Демонстрируешь полное непонимание сути вопроса :(
Матрицы вращения, перемещения, масштабирования и т. д. - это именно матрицы, то есть математическое понятие.
А вид, мир и проекция - это стандартные трансформации D3D. В любую трансформацию можно загрузить любую матрицу, в том числе в ТРАНСФОРМАЦИЮ вида можно загрузить МАТРИЦУ вращения.
Приведенный пример вычисляет углы зрения, не зависимо от матрицы, загруженной в VIEW.
Если ты про трансформация WORLD, куда ты грузишь некую матрицу вращения (ты же не уточнил), то код будет проще:

Код: Выделить всё
Private Sub CalcAngleDiff()
Dim v As D3DVECTOR
  D3DXVec3TransformNormal v, vec3(0, 0, 1), Mtrx
'  D3DXVec3Normalize v, v   'Эта строка возможно не понадобится
  SinD = v.y
  CosD = Sqr(1 - SinD * SinD)
  SinA = -v.x / CosD
  CosA = v.z / CosD
End Sub

Убрана инверсия матрицы, так как действие VIEW противоположно действию WORLD.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 15.01.2006 (Вс) 17:23

На будущее: Сначала подробно разберись с каждой строчкой написанного нами кода, а потомы уже пиши возражение
P.S. Сам таким был... :lol:
#define ROFL 0xDDDD

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 16.01.2006 (Пн) 9:58

DirectXManiac
убей себя с разбегу :evil:

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 16.01.2006 (Пн) 13:33

nekeda писал(а):DirectXManiac
убей себя с разбегу :evil:

Может с разгона? :lol: :wink:
#define ROFL 0xDDDD


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron