Экран 2D указывают на 3D мир - PullRequest
0 голосов
/ 24 октября 2019

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

Вот что я пытаюсь сделать:

Public Shared Function UnProject(ByRef projection As Matrix4x4, view As Matrix4x4, viewport As Size, mouse As Vector2, Optional zIN As Single = 0) As Vector4
    Dim vec As Vector4
    'https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluUnProject.xml
    'https://gamedev.stackexchange.com/questions/51820/how-can-i-convert-screen-coordinatess-to-world-coordinates-in-opentk
    vec.X = ((2.0F * mouse.X) / CSng(viewport.Width)) - 1
    vec.Y = -(2.0F * mouse.Y / CSng(viewport.Height) - 1)
    vec.Z = zIN
    vec.W = 1.0F

    Dim viewInv As Matrix4x4

    Matrix4x4.Invert(view, viewInv)
    Dim projInv As Matrix4x4
    Matrix4x4.Invert(projection, projInv)


    vec = Vector4.Transform(vec, projInv)
    vec = Vector4.Transform(vec, viewInv)

    If vec.W > Single.Epsilon OrElse vec.W < Single.Epsilon Then
        vec.X /= vec.W
        vec.Y /= vec.W
        vec.Z /= vec.W
    End If

    Return vec
End Function

У меня есть панель, где внешняя библиотека рисует сцену OpenGL через panel.handle. В событии mouseUp я получаю матрицы CameraView и CameraProject, получаю размер области просмотра (панель с, высота панели) и вызываю unproject для начальной и конечной точек (я хочу сделать прямоугольное выделение)

Dim vp As New Size(Me.Width, Me.Height)
Dim vm As New Vector2(ox, oy)
Dim v4 As Vector4 = UnProject(m4Proj, m4View, vp, vm, 0)
Dim vm2 As New Vector2(e.X, e.Y)
Dim v42 As Vector4 = UnProject(m4Proj, m4View, vp, vm2, 0)

но X, Y, Z не так точны ... Еще один вопрос? Z: должно быть между -1 и 1? или 0 и 1?

...