Как рассчитать 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;
Другие вопросы по тегам