Как рассчитать 3D-точку (мировую координату) из 2D-координаты экрана, по которой щелкнули мышью, в Openscenegraph?

Я пытался поместить сферу в трехмерное пространство из выбранной пользователем точки в двухмерном пространстве экрана. Для этого я пытаюсь вычислить 3D-точку из 2D-точки, используя приведенную ниже технику, и эта техника не дает правильного решения.

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:

 osg::Matrix mvp =   _camera->getViewMatrix() * _camera->getProjectionMatrix();

Как я могу продолжить? Спасибо.


person S.Frank Richarrd    schedule 11.07.2018    source источник
comment
Как вы будете вычислять координату глубины по щелчку мыши?   -  person vincent    schedule 11.07.2018
comment
У меня сейчас плоскость размещена на оси xz. @винсент   -  person S.Frank Richarrd    schedule 11.07.2018
comment
В этом случае вы как бы делаете плоскость отсечения. Обычно для такого рода вычислений используется скалярное произведение.   -  person vincent    schedule 12.07.2018
comment
Не место для вырезки. Iam Запрещает пользователю размещать сферу на этой плоскости.   -  person S.Frank Richarrd    schedule 12.07.2018
comment
Вы не можете умножить 2d-вектор на матрицу 4x4. Пожалуйста, покажите точный код, который вы пробовали, включая соответствующие объявления.   -  person Nico Schertler    schedule 12.07.2018


Ответы (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;
person rickyviking    schedule 12.07.2018