Bien nuestro último paso es crear algo que maneje correctamente todas estas situaciones de la cámara, la proyección etc. Para eso vamos a Motor y definimos las siguientes matrices para trabajar.
Private Matriz_Vista As Matrix
Private Matriz_Proyeccion As Matrix
Private Matriz_Mundo As Matrix
Private Matriz_Proyeccion As Matrix
Private Matriz_Mundo As Matrix
Una vez hecho esto vamos a crear un SUB:
Public Sub Control_Matrices(ByRef VC As Vector3, ByRef DP3 As Direct3D.Device)
Try
Matriz_Vista = Matrix.LookAtLH(VC, New Vector3(0, 0, 0), New Vector3(0, 1, 0))
DP3.Transform.View = Matriz_Vista
Matriz_Proyeccion = Matrix.PerspectiveFovLH(FOV, Ratio, Z_Cerca, Z_Lejos)
DP3.Transform.Projection = Matriz_Proyeccion
Catch ex As Exception
End Try
End Sub
Try
Matriz_Vista = Matrix.LookAtLH(VC, New Vector3(0, 0, 0), New Vector3(0, 1, 0))
DP3.Transform.View = Matriz_Vista
Matriz_Proyeccion = Matrix.PerspectiveFovLH(FOV, Ratio, Z_Cerca, Z_Lejos)
DP3.Transform.Projection = Matriz_Proyeccion
Catch ex As Exception
End Try
End Sub
Este "Control_Matrices" va a recibir dos cosas, por un lado VC que es un vector3D que representa la posición de la cámara en el espacio (WORLD). Con LookAtLH creamos una matriz 4x4 que indica 3 valores: donde está la cámara (VC), hacia donde está mirando la cámara (0,0,0) y cual es la parte de arriba del mundo (el vector con la componente Y = 1).
Por otra parte la matrix de proyección emplea los valores que vimos de FOV, Ratio y Z_Cerca y Lejos).
El último paso para que esto funcione es incluir el control de la cámara dentro del bucle principal, pero tendremos que definir dentro de FORM1:
Private PosicionCamara As New Vector3
Y modificar el SUB Bucle para que quede asi:
Private Sub Bucle()
Try
Do While Start = True
Engine.Control_Matrices(PosicionCamara, Dispo3D)
Engine.Render(Dispo3D)
Application.DoEvents()
Loop
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
El último paso para que esto funcione es incluir el control de la cámara dentro del bucle principal, pero tendremos que definir dentro de FORM1:
Private PosicionCamara As New Vector3
Y modificar el SUB Bucle para que quede asi:
Private Sub Bucle()
Try
Do While Start = True
Engine.Control_Matrices(PosicionCamara, Dispo3D)
Engine.Render(Dispo3D)
Application.DoEvents()
Loop
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
No hay comentarios:
Publicar un comentario