¿Puede VB.net desarrollar un pequeño software de visualización de gráficos 3D?
¡Tengo que admitir que los tutoriales sobre cómo escribir DirectX en VB son bastante difíciles de encontrar! Si LZ quiere profundizar en temas de gráficos 3D, debe aprender C++. Incluso si no puede programar en C++, al menos debe poder convertir programas de C++ en programas de VB.
Aprendí programación DX (muy sencilla) en dos o tres meses. Este tipo de programación es un poco difícil de diseñar.
Herramientas: DirectX9 y su biblioteca VB (proyecto-> agregar referencia. Las bibliotecas .NET generalmente tienen bibliotecas DX), VB no sé si actualmente es compatible con DX10 y superior, pero 9 es definitivamente suficiente. .
Idea: Todos los gráficos 3D están hechos de triángulos. No es fácil dibujar un rectángulo con un agujero redondo, supongo que necesitarías al menos 24 triángulos. Debe registrar las coordenadas de estos puntos o simplemente escribirlas en un archivo y leerlas más tarde.
Este es un código incompleto de uno de mis viejos programas DX (que muestra un plano negro), no siempre se compila, así que compruébalo.
Importa Microsoft.DirectX 'Debe ~
FormMain de clase pública
'Inicio de Direct3D
Atenuar d3dpp como nuevo Direct3D.
'Matrix
Dim matWorld, matView, matProj As Matrix 'Matriz de posición mundial, matriz de posición de cámara y matriz de perspectiva.
'Mesh
Public MyPlane as Direct3D.Mesh 'Nuestro objeto
Public VBPlane(3) As Direct3D.CustomVertex.PositionNormalTextured 'Guardar la posición del vértice Array
#Región "DX Core"
Public Sub InitDeviceObjects()
Con d3dpp 'Copie lo siguiente.
.Windowed = True 'No pantalla completa.
.SwapEffect = Direct3D.Windows 7.1.1BackBufferFormat = Direct3D.Format.Unknown
.EnableAutoDepthStencil = True 'Permitir que DX administre automáticamente el búfer de profundidad
.AutoDepthStencilFormat = Direct3D.DepthFormat.D16
Terminar con
MyDevice = Nuevo Direct3D.Device(0, Direct3D.DeviceType.Hardware.BackBufferFormat = Direct3D.Format.Unknown)
.DeviceType.Hardware, Me.Handle, Direct3D.CreateFlags.HardwareVertexProcessing, d3dpp) '¡Cree un dispositivo DX ahora! Por favor copie las dos oraciones siguientes.
MyDevice.SetRenderState(Direct3D.RenderStates.ZEnable, True) 'Z buffer
MyDevice.SetRenderState(Direct3D.RenderStates.NormalizeNormals, True) 'Normaliza las normales, consulta libros de matemáticas relacionados.
End Sub
Public Sub RestoreDeviceObjects()
Dim PlaneIB() As Short = {0, 1, 3, 0, 2, 3} 'Vertex Información del índice.
Dim AttrTable(1) As Direct3D.AttributeRange 'Tabla de atributos del grupo Vertex
AttrTable(0).AttributeId = 0
AttrTable(0).FaceStart = 0
AttrTable(0).FaceCount = 2 ' Hay dos triángulos
AttrTable(0).VertexStart = 0
AttrTable(0).VertexCount = 4 ' Cuatro puntos
' Información de coordenadas de vértice.
Direct3D.MeshFlags.Managed, Direct3D.VertexFormats.Position + Direct3D.VertexFormats.Normal + Direct3D.VertexFormats.Texture1, MyDevice) 'Crear objeto
MyPlane.SetVertexBufferData(VBPlane, Direct3D.LockFlags.None) 'Entrada Datos de coordenadas de vértice
MyPlane.SetIndexBufferData(VBPlane, Direct3D.LockFlags.None) 'Ingresar datos de coordenadas de vértice
MyPlane.SetIndexBufferData(VBPlane, Direct3D.LockFlags.None)SetIndexBufferData(PlaneIB, Direct3D.LockFlags.None) 'Datos de índice de entrada
MyPlane.SetAttributeTable(AttrTable) 'Vértice de entrada SetAttributeTable(AttrTable)
End Sub
Subrenderizado público ( ) 'Llámalo para dibujar
Atenuar vlook como nuevo Vector3(1, 0, 0)
Atenuar vPos como nuevo Vector3(0,0,0)
Atenuar vUp como nuevo Vector3(0, 0, 1)
MatView = Matrix.LookAtLH(vPos)
MatView = Matrix.LookAtLH(vPos)
MatView = Matrix.LookAtLH(vPos)
MatView = Matrix.LookAtLH(vPos)LookAtLH(vPos, vlook, vUp) 'Calcular la matriz de posición de la cámara
Device.SetTransform( Direct3D. TransformType .View, Direct3D.TransformType.View, Direct3D.TransformType.View, Direct3D.TransformType.View)View, MatView) 'Establece la matriz de posición actual de la cámara en MatView.
Dim fAspect As Single = Me. Ancho / Me.Height 'Relación de aspecto de la ventana
matProj = Matrix.PerspectiveFovLH(Math.PI / 4, fAspect, 1.0F, 10001) 'Calcula la matriz de perspectiva MatProj. '
MyDevice.SetTransform( Direct3D.TransformType.Projection, matProj) 'Establece la matriz de perspectiva actual en MatProj.
MyDevice.Clear(Direct3D.ClearFlags.Target + Direct3D.ClearFlags.ZBuff) 'Establece la matriz de perspectiva actual en MatProj.
ClearFlags.ZBuffer, Color.Blue, 1.0F, 0) 'Actualiza primero la pantalla azul
MyDevice.BeginScene() 'Comienza a dibujar
MatWorld = Matrix.Identity 'El objeto es en el origen, sin rotación
Device.SetTransform(Direct3D.TransformType.World, MatWorld) 'Establece la posición del objeto
Me.Mesh.DrawSubset(0) 'Dibuja la posición del objeto
Me.Mesh.DrawSubset(0)DrawSubset(0) 'Dibuja el objeto
MyDevice.EndScene() 'End
MyDevice.Present() ' Visualización en pantalla
p>End Sub
Public Sub DeleteDeviceObjects() 'Finaliza el programa liberando recursos
MyPlane.Dispose()
MyDevice.Dispose()
End Sub
#End Region
Private Sub FormMain_FormClosing(ByVal remitente como objeto, ByVal y como System.Windows. Forms.FormClosingEventArgs) me maneja. p>
DeleteDeviceObjects()
Windows.Forms.Cursor.Show()
End Sub
Privado Sub FormMain_Load(ByVal remitente como objeto, ByVal y como System.EventArgs) maneja Me.Load
InitDeviceObjects()
RestoreDeviceObjects()
Windows.Forms. Cursor.Hide()
Windows.Forms.Cursor.Show()
Fin Sub
Fin SubHide()
Render( )
Finalizar niño
Finalizar clase