вторник, 15 апреля 2008 г.

Координаты

Долго бились над переводом координат из 3-х мерной системы в 2-у мерную и обратно.
И Вот наконец-то!

/// Расчет проэкции точки экрана на плоскость z=0
Matrix4 camProjectionMatrix,Matrix4 camViewMatrix,Dimension2D screenSize)
{
Vector3D vPickRayDir;
Vector3D vPickRayOrig;

Matrix4 m = camViewMatrix;
m.MakeInverse();

vPickRayDir.X = vX * m.GetM(0, 0) + vY * m.GetM(1, 0) + vZ * m.GetM(2, 0);
vPickRayDir.Y = vX * m.GetM(0, 1) + vY * m.GetM(1, 1) + vZ * m.GetM(2, 1);
vPickRayDir.Z = vX * m.GetM(0, 2) + vY * m.GetM(1, 2) + vZ * m.GetM(2, 2);

vPickRayOrig.X = camPosition.X;
vPickRayOrig.Y = camPosition.Y;
vPickRayOrig.Z = camPosition.Z;

float t = -vPickRayOrig.Z / vPickRayDir.Z;
float Px = vPickRayOrig.X + vPickRayDir.X * t;
float Py = vPickRayOrig.Y + vPickRayDir.Y * t;

return new Vector3D(Px, Py, 0);
}

1 комментарий:

Дмитрий Высочин комментирует...

Обратная ф-ия тут:
http://galaxonline.blogspot.com/2008/04/3d_16.html