SnUrik
а зачем на матрицу проекции домножать ? необходимо ведь перевести координаты точки экрана в координаты окна проекции по формула:
dir.x = ((2*Point.x)/width)-1)/proj._11;
dir.y = ((-2*Point.y)/height)+1)/proj._22;
dir.z = 1;
в качестве начала луча берем позицию камеры, а далее домножаем направление на инвертированную матрицу вида, а затем умножаем позицию и направление на инвертированную мировую матрицу объекта так ?
и ещё вопрос появился, в функцию XMMatrixInverse() в качестве детерминанта что отправлять ? а то она NULL не воспринимает, подскажите пожалуйста ?
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 треугольник. Разницу в производительности не тестил, но не думаю что должно сильно отставать.
SnUrik
подскажите пожалуйста в функцию XMMatrixInverse() в качестве детерминанта что отправлять ? а то на 9-ом как я вижу что отправляется NULL, а тут не принимает.. это я видел в SDK но всеравно не помогает.
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.
жаль, может кто знает, а то приходится вместо инверсии делать транспонирование, может в этом и есть ошибка(
Наконец-то разобрался, в качестве детерменанта достаточно было отправить просто XMVECTOR и все заработало, проблема была в инверсии матрицы
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.
Чуть опоздал =)
SnUrik
просто мне казалось что в некоторых случаях это одно и тоже)
Для матрицы поворота это должно быть одно и то же.
Тема в архиве.