void CurveCreator::MouseMove( float fX, float fY, float fXDelta, float fYDelta , AxisAlignedBoundingBox &a, float )
{
// determine where the user clicked in 3d space
Vector normal,zero,v_up,v_right,pV1,pV2,planeN,v_position,distance,nn,oli;
zero.Set(0, 0, 0);
v_position = Kernel()->Scene()->ActiveCamera()->Forward();
float tulos = m_fSTimes.m_cValue;
v_position.SetLength(tulos);
distance = v_position - zero;
float matka = distance.Length();
distance.SetLength(matka*0.9f);
nn = distance;
nn.Normalize();
v_up = Kernel()->Scene()->ActiveCamera()->Up();
v_right = Kernel()->Scene()->ActiveCamera()->Right();
pV1 = v_up - distance;
pV2 = v_right - distance;
planeN = pV2 & pV1;
planeN.Normalize();
normal = nn;
float xnew, ynew, tValue;
xnew = fX - 1 + 2 * fX*0.5f;
ynew = 1 - fY - 2 * fY*0.5f;
Vector newCoord,newVec,CamVec,ShootVec,final;
newCoord.Set(xnew, ynew, 0.0f);
newVec = Kernel()->Scene()->ActiveCamera()->UnProject(newCoord);
CamVec = Kernel()->Scene()->ActiveCamera()->Position();
ShootVec = newVec - CamVec;
// calc t constant value for vector and plane
tValue = ((normal.m_fX*distance.m_fX) + (normal.m_fY*distance.m_fY) + (normal.m_fZ*distance.m_fZ)-(CamVec.m_fX * normal.m_fX)-(CamVec.m_fY*normal.m_fY)-(CamVec.m_fZ*normal.m_fZ) )/ ((ShootVec.m_fX*normal.m_fX)+ (ShootVec.m_fY*normal.m_fY)+ (ShootVec.m_fZ*normal.m_fZ));
// calc intersection of the line and plane
final.m_fX = CamVec.m_fX + ShootVec.m_fX * tValue;
final.m_fY = CamVec.m_fY + ShootVec.m_fY * tValue;
final.m_fZ = CamVec.m_fZ + ShootVec.m_fZ * tValue;
Hi! Here is the code I have used to change screen space into world space.