ПрограммированиеФорумГрафика

Выбор объекта мышью (2 стр)

Страницы: 1 2
#15
17:53, 7 сен 2013

SnUrik
а зачем на матрицу проекции домножать ? необходимо ведь перевести координаты точки экрана в координаты окна проекции по формула:
dir.x = ((2*Point.x)/width)-1)/proj._11;
dir.y = ((-2*Point.y)/height)+1)/proj._22;
dir.z = 1;
в качестве начала луча берем позицию камеры, а далее домножаем направление на инвертированную матрицу вида, а затем умножаем позицию и направление на инвертированную мировую матрицу объекта так ?

#16
21:19, 7 сен 2013

и ещё вопрос появился, в функцию XMMatrixInverse() в качестве детерминанта что отправлять ? а то она NULL не воспринимает, подскажите пожалуйста ?

#17
21:38, 7 сен 2013

NEvOl
> а зачем на матрицу проекции домножать ? необходимо ведь перевести координаты
> точки экрана в координаты окна проекции по формула:
хм, действительно, сейчас посмотрел pick sample, там луч берется так:

// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / pd3dsdBackBuffer->Width ) - 1 ) / pmatProj->_11;
v.y = -( ( ( 2.0f * ptCursor.y ) / pd3dsdBackBuffer->Height ) - 1 ) / pmatProj->_22;
v.z = 1.0f;

// Get the inverse view matrix
const D3DXMATRIX matView = *g_Camera.GetViewMatrix();
const D3DXMATRIX matWorld = *g_Camera.GetWorldMatrix();
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMATRIX m;
D3DXMatrixInverse( &m, NULL, &mWorldView );

// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
vPickRayDir.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
vPickRayDir.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;

У себя делал проще - трансформил меш в пространство экрана и тестил 2d треугольнички. В DirectX функции IntersectTriangle-  4 dot + 2 cross на треугольник. У меня умножение на матрицу для каждой точки- 4 dot на точку, а учитывая что 1 точка принадлежит нескольким треугольниками, то ~4 dot на треугольник + несложный тест на попадание точки в 2d треугольник. Разницу в производительности не тестил, но не думаю что должно сильно отставать.

#18
21:50, 7 сен 2013

SnUrik
подскажите пожалуйста в функцию XMMatrixInverse() в качестве детерминанта что отправлять ? а то на 9-ом как я вижу что отправляется NULL, а тут не принимает.. это я видел в SDK но всеравно не помогает.

#19
22:05, 7 сен 2013

NEvOl
> подскажите пожалуйста в функцию XMMatrixInverse() в качестве детерминанта что
> отправлять ? а то на 9-ом как я вижу что отправляется NULL, а тут не
> принимает.. это я видел в SDK но всеравно не помогает.
не знаю, в мсдн:
>pDeterminant [out, optional]
>Address of a vector, each of whose components is the determinant of M. This parameter can be a nullptr.

#20
22:07, 7 сен 2013

жаль, может кто знает, а то приходится вместо инверсии делать транспонирование, может в этом и есть ошибка(

#21
22:19, 7 сен 2013

Наконец-то разобрался, в качестве детерменанта достаточно было отправить просто XMVECTOR и все заработало, проблема была в инверсии матрицы

#22
22:21, 7 сен 2013

NEvOl
> жаль, может кто знает, а то приходится вместо инверсии делать транспонирование,
> может в этом и есть ошибка(
Это как бы две разные операции =)
только что заметил:
>Note For XNAMATH version 2.04 and earlier, the pDeterminant parameter isn't optional. That is, for XNAMATH version 2.04 and earlier, you can't set pDeterminant to a nullptr.
так и передавай туда XMVECTOR*, а потом проверяй на 0.
Чуть опоздал =)

#23
8:55, 8 сен 2013

SnUrik
просто мне казалось что в некоторых случаях это одно и тоже)

#24
9:04, 8 сен 2013

Для матрицы поворота это должно быть одно и то же.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.