Как при текущем разрешении монитора получить нормализованные ([-1;+1]) экранные координаты точки объекта (X, Y, Z известны) ?
Буду признателен за короткий пример.
Здравствуйте 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)
Здравствуйте 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) вертиксы.