3D -> 2D ???
От: VGP Россия  
Дата: 24.03.02 20:24
Оценка:
Как при текущем разрешении монитора получить нормализованные ([-1;+1]) экранные координаты точки объекта (X, Y, Z известны) ?

Буду признателен за короткий пример.
Re: 3D -> 2D ???
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.03.02 01:50
Оценка:
Здравствуйте VGP, Вы писали:

VGP>Как при текущем разрешении монитора получить нормализованные ([-1;+1]) экранные координаты точки объекта (X, Y, Z известны) ?


VGP>Буду признателен за короткий пример.


Это преобразование выполняет матрица проекции.


x,y,z - координаты точки которую надо спроецировать на экран

ah - угол горизонтального обзора ( 0 < ah < pi )
av - угол вертикального обзора ( 0 < av < pi )

w = ctg(ah/2) котангенс, тригономерическая функция равная cos/sin
h = ctg(av/2)

X,Y - координаты на экране, есть ещё координата Z но она не используется

Zmax,Zmin - максимальная и минимальная z координаты (от 1 до 0 !!!)

q = Zmax/(Zmax-Zmin) без перспективы (без перспективных искажений) q=1

P это матрица 4х4

[                     ]
[ w     0     0     0 ]
[                     ]
[ 0     h     0     0 ]
[                     ]
[ 0     0     q     1 ]
[                     ]
[ 0     0  -q*Zmin  0 ]
[                     ]

Вектор [X,Y,Z,1] = [x,y,z,1]*P;

то есть

X = x*w/((z-Zmin)*q)

Y = y*h/((z-Zmin)*q)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: 3D -> 2D ???
От: Sashko Россия http://www.dc.baika.ru/
Дата: 25.03.02 02:14
Оценка:
Здравствуйте VGP, Вы писали:

VGP>Как при текущем разрешении монитора получить нормализованные ([-1;+1]) экранные координаты точки объекта (X, Y, Z известны) ?


Пример на DirectX, но математика везде одна и та же

//    D3DXVECTOR3 v;

    D3DXMATRIX mW, mV, mP;
    D3DXMATRIX mWV, mT;
    D3DXVECTOR4 vT;

    m_pd3dDevice->GetTransform(D3DTS_WORLD, &mW);
    m_pd3dDevice->GetTransform(D3DTS_VIEW, &mV);
    m_pd3dDevice->GetTransform(D3DTS_PROJECTION, &mP);

    D3DXMatrixMultiply(&mWV, &mW, &mV);
    D3DXMatrixMultiply(&mT, &mT, &mP);

    D3DXVec3Transform(&vT, &v, &mT);

    float x = vT.x / vT.w;
    float y = vT.y / vT.w;


Плюс, если нужно сделать трансформировать сразу большое количество вершин, то можно воспользоваться методом IDirect3DDevice8::ProcessVertices. В выходном буфере у тебя как раз будут трансформированные (D3DFVF_XYZRHW) вертиксы.
Re: 3D -> 2D ???
От: MadMax  
Дата: 25.03.02 13:19
Оценка:
Здравствуйте VGP, Вы писали:

VGP>Как при текущем разрешении монитора получить нормализованные ([-1;+1]) экранные координаты точки объекта (X, Y, Z известны) ?


VGP>Буду признателен за короткий пример.


D3DVIEWPORT7 vp;
D3DMATRIX PrjMatrix,CameraMatrix;
D3DVECTOR PtInCamera,PtInPrj;
float CW = 2,CH = 2;


Device->GetTransform( D3DTRANSFORMSTATE_VIEW, &CameraMatrix );
Device->GetTransform( D3DTRANSFORMSTATE_PROJECTION, &PrjMatrix );
Device->GetViewport( &vp );

D3DMath_VectorMatrixMultiply(PtInCamera,ScenePoint,CameraMatrix );
D3DMath_VectorMatrixMultiply(PtInPrj,PtInCamera,PrjMatrix);
return CPoint(PtInPrj.x * vp.dwWidth / CW + vp.dwWidth/2.0f,-PtInPrj.y * vp.dwHeight / CH + vp.dwHeight/2.0f);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.