Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Object Picking, DirectX 
:(
    Опции темы
dAlex
Дата 22.5.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Пытаюсь сделать Objext Picking. Читала статью  (спасибо DYUMON =) ) 
в общем алгоритм понятен, вот только никак не получается правильно определить луч взгляда.

Код

D3DXVECTOR3 LineEnd,CameraSpacePos;
float NMouseX,NMouseY,det;
D3DXMATRIX matView;

NMouseX=1.0 - 2.0*MouseX/640;
NMouseY=1.0 - 2.0*MouseY/480;

//is FOV in radians
CameraSpacePos.y=(NMouseY*tan(FOV/2.0));
CameraSpacePos.x=((-NMouseX/AspectRatio)*tan(FOV/2.0));

LineEnd.x=range*CameraSpacePos.x;
LineEnd.y=range*CameraSpacePos.y;
LineEnd.z=range;

lpDevice->GetTransform(D3DTRANSFORMSTATE_VIEW,(D3DMATRIX *)&matView);
D3DXMatrixInverse(&matView,&det,&matView);
D3DXVec3TransformCoord(&LineEnd,&LineEnd,&matView);
return LineEnd; 


Но Студия ругается на FOV. Что это и откуда это можно взять? Со стереометрией у меня не очень :(
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
dAlex
Дата 22.5.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Поняла, FOV - это угол обзора.
Пишу вот что:

                        
Код

                        float NMouseX=1.0 - 2.0*GET_X_LPARAM(lParam)/800;
            float NMouseY=1.0 - 2.0*GET_Y_LPARAM(lParam)/800;

            D3DXVECTOR3 cameraspace;
            cameraspace.y = NMouseY*tan(D3DX_PI/4 / 2.0); 
            cameraspace.x =(-NMouseX)*tan(D3DX_PI/4/2.0);

            D3DXVECTOR3 LineEnd;
            LineEnd.x=cameraspace.x*200;   
            LineEnd.y=cameraspace.y*200;
            LineEnd.z=200; 


Но все равно не получается :(
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
dAlex
Дата 22.5.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Поняла, нужно было еще добавить 

Код

pDev -> GetTransform(D3DTRANSFORMSTATE_VIEW,(D3DMATRIX *)&matView);
            D3DXMatrixInverse(&matView, NULL ,&matView);
            D3DXVec3TransformCoord(&LineEnd,&LineEnd,&matView); 


Но теперь студия ругается на константу D3DTRANSFORMSTATE_VIEW. Откуда ее взять?
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
dAlex
Дата 26.5.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 3.8.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 2



Все, нашлась куча глюков, теперь все в основном работает, но иногда криво определяется луч взгляда.
Код

D3DXVECTOR3 vPickRayDir;
        D3DXVECTOR3 vPickRayOrig;

        
        LPDIRECT3DSURFACE9 pBackBuf = NULL;
        D3DSURFACE_DESC d3dsdBackBuffer;
        pDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuf);
        pBackBuf->GetDesc(&d3dsdBackBuffer);
        pBackBuf->Release();


        // Get the Pick ray from the mouse position
        

        D3DXMATRIXA16 matProj;
        pDev->GetTransform( D3DTS_PROJECTION, &matProj );

        POINT ptCursor;
        GetCursorPos( &ptCursor );
        ScreenToClient( hWnd, &ptCursor );

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

        // Get the inverse view matrix
        D3DXMATRIX matView;

        pDev->GetTransform(D3DTS_VIEW, &matView);

        D3DXMATRIX mWorldView =  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;
        
        iCurrent = NumOfIntrsectedSquare(vPickRayOrig, vPickRayDir);    


:-?
--------------------
eof()
PM WWW ICQ GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.