OpenGL Отсечение, глубина и камера
Возникли проблемы с отсечкой / просмотром не уверен
Я просто пытаюсь повернуть и масштабировать прямоугольную рамку (линий, а не квадратов) в форме окон (используя OpenTK). Это достаточно просто, но когда я масштабирую / масштабирую части линии, они обрезаются, когда не должны
Попробовал поиграть с перспективой, диапазоном глубины и т. Д., А также с просмотром, масштабированием чертежа вместо перемещения камеры и т. Д. Но я, кажется, не могу получить желаемое поведение.
Видео проблемы: http://www.youtube.com/watch?v=sDV4_LKOgVc&feature=youtu.be
Private Sub GlControl1_Paint(sender As Object, e As PaintEventArgs) Handles GlControl1.Paint
If (_STARTED = False) Then Return
'Set Up
GL.Clear(ClearBufferMask.ColorBufferBit)
GL.Clear(ClearBufferMask.DepthBufferBit)
Dim eye = New Vector3(cam_x, cam_y, cam_z)
Dim lookat = New Vector3(cam_x - Pan_X / GlControl1.Width, cam_y - pan_Y / GlControl1.Height, cam_z + look_z)
Dim camera = Matrix4.LookAt(eye, lookat, Vector3.UnitY)
TextBox1.Text = cam_x.ToString + ", " + cam_y.ToString + ", " + cam_z.ToString
GL.MatrixMode(MatrixMode.Modelview)
GL.LoadIdentity()
GL.LoadMatrix(camera)
'Draw Items
'Perform panning action
'Applies to all items in GL window
GL.Translate(Pan_X / GlControl1.Width, pan_Y / GlControl1.Height, 0.0)
'Initial View Angle
'GL.Rotate(45, 1.0, 1.0, 0.0)
If show_axes Then draw_axes()
GL.PushMatrix() 'Save matrix
'Perform rotations
GL.Rotate(CType(_Part.XRotation, Single), 1.0F, 0.0F, 0.0F)
GL.Rotate(CType(_Part.YRotation, Single), 0.0F, 1.0F, 0.0F)
GL.Rotate(CType(_Part.ZRotation, Single), 0.0F, 0.0F, 1.0F)
'Resize
'GL.Scale(Zoom, Zoom, Zoom)
GL.PushMatrix() ' Save Matrix for center translation
GL.Translate(-_Part.Length / 2, -_Part.Thickness / 2, _Part.Width / 2) 'Center Object
'Draw the box
draw_object(CSng(_Part.Length), CSng(_Part.Width), CSng(_Part.Thickness))
GL.PopMatrix()
GlControl1.SwapBuffers()
End Sub
Private Sub GlControl1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
If e.Delta > 0 Then
'Zoom = CSng(Zoom + Zoom_inc)
cam_z -= cam_inc
Else
'Zoom = CSng(Zoom - Zoom_inc)
cam_z += cam_inc
End If
GlControl1.Invalidate()
End Sub
2 ответа
Я понял. Я правильно понял, но OpenTK хочет, чтобы вы объявили о такой перспективе
Затемнить перспективу1 как Matrix4 = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, _CSng((GlControl1.Width) / (GlControl1.Height)), 0,1, 1000)
GL.LoadMatrix (perspective1)
Это кажется странным. Использование MathHelper.PiOver4 вместо 45.0f решило проблему
Если вы используете что-то вроде gluPerspective()
удостовериться zNear
является положительным и ненулевым.