Как рассчитать 3D-точку (World Coordinate) из 2D-точки, щелкнувшей мышью, в Openscenegraph?
Я пытался поместить сферу в трехмерное пространство от выбранной пользователем точки на 2-мерном пространстве экрана. Для этого я пытаюсь вычислить 3d-точку из 2-й точки, используя приведенную ниже технику, и эта техника не дает правильного решения.
mousePosition.x = ((clickPos.clientX - window.left) / control.width) * 2 - 1;
mousePosition.y = -((clickPos.clientY - window.top) / control.height) * 2 + 1;
тогда я умножаю mousePosition
с Inverse of MVP matrix
, Но получить случайное число в результате.
для расчета MVP Matrix:
osg::Matrix mvp = _camera->getViewMatrix() * _camera->getProjectionMatrix();
Как я могу продолжить? Благодарю.
1 ответ
В предположении, что положение мыши нормализовано в диапазоне [-1, 1] для x и y, следующий код даст вам 2 точки в мировых координатах, спроецированных из ваших координат мыши: nearPoint
это точка в 3D, лежащая на усеченной камере рядом с плоскостью, farPoint
на заднем плане дальнего самолета.
Затем вы можете вычислить линию, проходящую мимо этих точек и пересекающую ее с вашей плоскостью.
// compute the matrix to unproject the mouse coords (in homogeneous space)
osg::Matrix VP = _camera->getViewMatrix() * _camera->getProjectionMatrix();
osg::Matrix inverseVP;
inverseVP.invert(VP);
// compute world near far
osg::Vec3 nearPoint(mousePosition.x, mousePosition.x, -1.0f);
osg::Vec3 farPoint(mousePosition.x, mousePosition.x, 1.0f);
osg::Vec3 nearPointWorld = nearPoint * inverseVP;
osg::Vec3 farPointWorld = farPoint * inverseVP;