Descargar

Informática gráfica aplicada. Módulo DirectX (página 2)

Enviado por Pablo Turmero


Partes: 1, 2
edu.red

Módulo DirectX – Direct3D Interfaz gráfica para hardware 3D Permitir gráficos tridimensionales interactivos en aplicaciones de Windows 2 Modos: Inmediato API 3D de bajo nivel Independiente del dispositivo Programadores experimentados Retenido Desarrollo rápidos Capa superior del inmediato

edu.red

Módulo DirectX – Direct3D Conceptos Básicos Sistemas de coordenadas 3-D Left-handed (mano izquierda) Podemos simular el right-handed Transformaciones 3-D Traslación Rotación Escalado Polígonos Normales de cara y vértice Modos de sombreado Interpolaciones de triángulos

edu.red

Módulo DirectX – Direct3D Conceptos Básicos Triángulos Reglas de rasterización de triángulos

edu.red

Módulo DirectX – Direct3D (Modo Inmediato) Tipos de Objetos IDirectDraw IDirectDrawSurface IDirect3Ddevice IDirect3Dmaterial IDirect3Dviewport IDirect3Dlight IDirect3DexecuteBuffer

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMAnimation Define como será modificada una transformación acorde al valor tiempo La animación es ajustada mediante el método SetTime

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMAnimationSet Permite a IDirect3DRMAnimation que haya agrupación Compartirán el mismo parámetro tiempo

Dim anim As IDirect3DRMAnimationSet D3DRM.CreateAnimationSet anim anim.Load App.Path & "anim.x", 0, 0, 0, 0, animframe anim.SetTime 1

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMDevice Representa la visualización final del Render creado Soporta Devices que renderizan directamente a la pantalla, ventana o memoria de vídeo Dim Device As IDirect3DRMDevice D3DRM.CreateDeviceFromSurface …

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMFace Representa un único objeto en un mesh

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMFrame Posiciona objetos en una escena y define las posiciones y orientaciones de los objetos visuales Escena: frame que no tiene "padre", define el frame de referencia para todos los demás objetos Jerarquías y Motion (rotación y velocidad intrínseca)

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMInterpolator Guarda acciones y las aplica a otros objetos mediante cálculos automáticos Ej.: Background en el espacio tiempo 0 el color rojo y en el 10 el color verde. Coloreará de forma automática las escenas sucesivas para fundir desde el rojo al verde

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMLight Define uno de los 5 tipos de luces que son utilizadas para iluminar los objetos visuales de la escena Ambiente, Point, Spotlight, Directional y Parallel point La luz va contenida en un frame y consume mucho proceso de CPU

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMMaterial Define cómo una superficie refleja la luz IDirect3DRMMesh Podemos utilizarlo para manipular grupos de caras y vértices IDirect3DRMMeshBuilder Nos permite trabajar con vértices y caras individuales de un mesh. Realmente formará un objeto 3D en la escena

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMPickedArray Identifica un objeto visual que corresponde a un punto 2D determinado IDirect3DRMPicked2Array Suele ser utilizado para colisiones entre objetos IDirect3DRMShadow Define una sombra emitida por otro

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMObject Clase base utilizada por todos los demás objetos del modo retenido IDirect3DRMProgressiveMesh Permite la carga de objetos 3D mediante pequeñas porciones IDirect3DRMTexture Consta de un array rectangular de píxeles coloreados

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMViewport Define cómo la escena 3D es renderizada en un plano 2D (como una ventana de Windows) Cámara: renderiza lo que es visible a lo largo del eje Z positivo, con la dirección ascendente representada en el eje Y positivo Viewing Frustum: cámara en el pico de la pirámide. Serán visibles los objetos entre el front y el back clipping

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMVisual Representa cualquier cosa que pueda ser renderizada en una escena

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMWrap Calcula las coordenadas de textura para una cara o mesh. Tipo Frame de referencia Origen Vector de dirección Vector de altura Factores de escalado Origen para las coordenadas de textura

edu.red

Módulo DirectX – Direct3D (Modo Retenido) IDirect3DRMWrap Tipos Wrapping Flags Flat Cylindrical Spherical Chrome

edu.red

Módulo DirectX Programación Direct3D Ejemplo 1 Ejemplo 2

edu.red

Programación Direct3D Decidir entre Clipper o FullScreen La programación se basa en frames. Puede contener uno o más objetos Cada objeto 3D debe ir enlazado a un frame determinado Cinco objetos básicos Device Viewport Scene World Camera

edu.red

Programación Direct3D

 

Inicio del Programa   Option Explicit

Objeto Direct3D M. retenido   Dim D3DRM As IDirect3DRM3 Dim Scene As IDirect3DRMFrame3 Frame de escena Dim Camera As IDirect3DRMFrame3 Frame de cámara Dim clipper As IDirectDrawClipper Objeto Clipper Dim Device As IDirect3DRMDevice3 Objeto Device Dim Viewport As IDirect3DRMViewPort Objeto Viewport Dim LightFrame As IDirect3DRMFrame3 Frame de Luz Dim Light As IDirect3DRMLight Objeto Luz Dim Globe As IDirect3DRMMeshBuilder3 Mesh (objeto 3D) Dim globeframe As IDirect3DRMFrame3 Frame del Mesh Dim salir As Boolean Fin de la aplicación

edu.red

Programación Direct3D Inicializar los objetos Direct3D Modo Retenido, Clipper, Viewport y Device. Se crean los frames correspondientes a la escena y la cámara, enlazando el frame cámara a de la escena para que la visualización sea posible Sub init_clipper()

Creamos el objeto Direct3D Modo Retenido Direct3DRMCreate D3DRM

Creamos el frame de la escena sin enlazarlo a ningún frame, puesto que será el frame padre D3DRM.CreateFrame Nothing, Scene

Creamos el frame de cámara enlazándolo directamente al de la escena y lo posicionamos en 0,0,0 de X, Y y Z. Variando estos valores podremos mover la cámara hacia diferentes puntos de vista de la escena que hemos creado. D3DRM.CreateFrame Scene, Camera Camera.SetPosition Scene, 0, 0, 0

Creamos el clipper (ventana) DirectDrawCreateClipper 0&, clipper, Nothing clipper.SetHWnd 0, Me.hWnd

Creamos el Device y el Viewport. El Device debemos enlazarlo al Clipper para que los gráficos 3D sean volcados en el mismo. En la creación del Viewport es necesario señalar el frame del Device y la cámara que utilicemos. D3DRM.CreateDeviceFromClipper clipper, ByVal 0&, 320, 200, Device D3DRM.CreateViewport Device, Camera, 0, 0, 320, 200, Viewport End Sub

edu.red

Programación Direct3D ApplyTexture es un procedimiento encargado de crear el wrapper (envoltura) y la textura que se aplicarán a un objeto determinado. Los parámetros son: Meshbuilder que asigna el objeto que se verá afectado por la textura y StrTextureFileName que pasa el nombre del fichero que contiene la textura a aplicar Sub ApplyTexture(MeshBuilder As IDirect3DRMMeshBuilder3, ByVal strTextureFileName As String)

Dim Box As D3DRMBOX Volumen del objeto Dim MaxY As Single Valor máximo Dim MinY As Single Valor mínimo Dim Height As Single Valor de alto Dim Wrap As IDirect3DRMWrap Wrapper Dim texture As IDirect3DRMTexture Textura

Tomamos el objeto para crear una caja imaginaria que lo cubra MeshBuilder.GetBox Box MaxY = Box.Max.Y MinY = Box.Min.Y Height = MaxY – MinY

edu.red

Programación Direct3D

Creamos el wrapper con los valores obtenidos anteriormente D3DRM.CreateWrap D3DRMWRAP_CYLINDER, Nothing, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, MinY / Height, 1, -1 / Height, Wrap

Aplicamos el wrapper al objeto Wrap.Apply MeshBuilder

Cargamos la textura con la variable texture D3DRM.LoadTexture strTextureFileName, texture MeshBuilder.SetTexture texture Set texture = Nothing End Sub

Mediante Form_Keypress detectamos si se ha pulsado una tecla para salir del programa automáticamente Private Sub Form_KeyPress(KeyAscii As Integer) salir = True End Sub

edu.red

Programación Direct3D

En este procedimiento de formulario iniciamos los valores necesarios pare crear los objetos que conformarán la escena 3D. Además, también gestionamos el bucle principal que permitirá la visualización de la escena en pantalla Private Sub Form_Load()

Llamamos a init_clipper para crear los frames y el clipper init_clipper

El método SetBack se aplica al frame Viewport. Se encarga de establecer el espacio en el cual es posible visualizar los objetos. Si un objeto, o parte de él, sobrepasa este valor, no será representado en pantalla Viewport.SetBack 5000

Asignamos la calidad de Render al dispositivo Device.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD Creamos un Frame en la escena para asignar una fuente de luz D3DRM.CreateFrame Scene, LightFrame

Creamos un objeto de luz tipo direccional D3DRM.CreateLightRGB D3DRMLIGHT_DIRECTIONAL, 0.8, 0.8, 0.8, Light

Asignamos el objeto al frame anterior LightFrame.AddLight Light

edu.red

Programación Direct3D

Dim light2 As IDirect3DRMLight Objeto luz ambiente

Es necesario crear una luz de tipo ambiente para definir la claridad por defecto que ofrecerá el Render. Sin luz ambiente no lograremos visualizar bien la escena D3DRM.CreateLightRGB D3DRMLIGHT_AMBIENT, 0.4, 0.4, 0.4, light2

Aplicamos la luz en la escena Scene.AddLight light2

Posicionamos la luz direccional en la escena LightFrame.SetPosition Scene, 0, 0, 0

Posicionamos la cámara para ajustar el punto de vista Camera.SetPosition Scene, 0, 0, 0 Camera.SetOrientation Scene, 0, 0, 1, 0, 1, 0

Creamos el objeto visual (Esfera) y su frame correspondiente D3DRM.CreateFrame Scene, globeframe D3DRM.CreateMeshBuilder Globe

Mediante el método Load asignamos el path que contiene el objeto Globe.Load App.Path & "globe.x", 0, D3DRMLOAD_FROMFILE, 0, 0

Establecemos la calidad que tendrá el objeto de cara al Render Globe.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD

edu.red

Programación Direct3D

Dependiendo del punto de vista del observador, hay veces en que las texturas de los objetos parecen descolocarse u ofrecen una representación visual muy distinta a la que deberían tener en un principio. Mediante la corrección de perspectiva se soluciona este pequeño problema. Para ello, hay que establecer en true el método SetPerspective que apliquemos al objeto Globe.SetPerspective 1

Asignamos el objeto a su frame y establecemos sus posiciones en la escena globeframe.AddVisual Globe globeframe.SetPosition Scene, 0, 0, 5 globeframe.SetOrientation Scene, 0, 0, 1, 0, 1, 0

Ponemos una rotación al objeto para animarlo constantemente globeframe.SetRotation Scene, 1, 1, 1, 0.17

Le asignamos la textura ApplyTexture Globe, App.Path & "fire.bmp"

Vaciamos los objetos que representan las Fuentes de luz Set LightFrame = Nothing Set Light = Nothing

edu.red

Programación Direct3D

 

Bucle principal While salir = False

Dibuja en pantalla el render obtenido redraw_clipper DoEvents Wend

Descarga el formulario cuando se acabe la aplicación vacia_clipper Unload Me End Sub

Descarga los objetos DirectX creados Sub vacia_clipper() Set Scene = Nothing Set Camera = Nothing Set Viewport = Nothing Set Device = Nothing Set D3DRM = Nothing Set clipper = Nothing End Sub

edu.red

Programación Direct3D

  Dibuja en pantalla el Render obtenido. Recordemos que el Render se alberga primero en el backbuffer y luego se vuelca automáticamente a la ventana Public Sub redraw_clipper() On Error GoTo mi_Error

Aplica las rotaciones y velocidades para todos los frames de la jerarquía Scene.Move 1

Borra el Viewport con el color actual del background Viewport.Clear

Renderiza una jerarquía de frames al Viewport utilizado. Sólo serán renderizados aquellos objetos visuales que estén en esa jerarquía de frames Viewport.Render Scene

Copia la imagen que ha sido renderizada a la pantalla o buffer de destino Device.Update

Exit Sub mi_Error: Resume End Sub

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente