Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Puede VB.net desarrollar un pequeño software de visualización de gráficos 3D?

¿Puede VB.net desarrollar un pequeño software de visualización de gráficos 3D?

Se puede programar con DirectX. Los motores 3D gratuitos son difíciles de encontrar. En términos generales, no son tan rápidos como el DX acelerado por hardware. Lo que es particularmente problemático es que generalmente no hay documentos VB que tengan este ideal y escribe uno él mismo...

¡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.

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