Я должен преобразовать координаты точки на экране в их 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?