Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Estado del motor

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                Bien, me han preguntado qué tal llevo el motor y he pensado que no estaría mal exponerlo en el foro.

Ahora mismo es perfectamente funcional. Estoy haciendo una demo tecnológica de un avión que tiene que aterrizar en una isla. El mar se crea con un Perlin Noise, lo que da una sensación de realidad muy buena, y ahora estoy implementando el sistema de nubes. Pero bueno, ahora mismo tendemos:

-Carga objetos con jerarquías(esto es fundamental. Si un motor no lo tiene...¡olvídate!)
-Sombras dinámicas utilizando Stencil.
-Reflejos dinámicos.
-Perlin Noise para simular el océano.
-Instancias de mallas, para reutilizar la misma malla.
-Efecto de Lens Flare.
-Octree por objeto.
-LOD automático y configurable.
-Animación de texturas.
-Animación de mallas por key.

Me falta:
-Nubes volumétricas.
-Vertex y Pixel Shaders.

Pero no hay fecha de finalización. ¡Hay que hacer las cosas bien!

[ Este Mensaje fue editado por: Drácula el 2002-07-25 13:01 ]                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

ethernet

                                aprovechando q pones todo eso voy a preguntar lo q no se q es xD:
-Carga objetos con jerarquías <- no se q et refieres con eso, sera muy basico pero no se a q te refieres.
-Animación de mallas por key.<. ¿? xD
por otra parte en otro post comentastes algo sobre algunos ejemplos q usaban perlin noise, te pedi las url pero no has leido el mensaje (quiero creer xD).
Thx, a ver cuando subes otras pruebas para ver el motor en movimiento.
Saludos                                

Drácula

                                Jerarquías:
Imagínate el avión. Está formado por los sig. objetos:
Las hélices, que rotan sobre el eje Z.
Los alerones, que rotan sobre el X.
El timón que rota sobre Y.
El cuerpo del avión.

Animación por Key:
Pues si miras el ejemplo del delfín de DX, verás que son 3 mallas con posiciones diferentes. Pues la animación por KeyFrame es una interpolación entre dos puntos, de forma que con pocas mallas simulas un movimiento completo.


Bien, pues sin jerarquías hay que pegarse una currada para que al mover el cuerpo del avión, LOS OBJETOS RELACIONADOS(hélices,alerones y timón) se muevan con él. Es como si en el MAX tuvieras los objetos por separado, sin agrupar o jerarquizar y movieras sólo uno de ellos. Pues sin jerarquías deberías mover CADA uno de ellos.

Respecto a lo del Perlin Noise, este es el FAQ que utilicé:

http://students.vassar.edu/mazucker/code/p...e-math-faq.html

Creo que es el que usa TODO el mundo!


[ Este Mensaje fue editado por: Drácula el 2002-07-26 09:12 ]                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

ethernet

                                Me referia a los doc's del efecto agua usando perlin noise, no al del perlin noise.
Gracias por las respuestas, ahora lo tengo un poco mas claro aunque en keyframes se podria haber dicho interpolacion xD.
Saludos
                               

Drácula

                                Pues miré muchos docs para buscar el más convincente. Busca en google ocean mesh wave;y te saldrán unos cuantos. Realmente hay varios métodos para hacerlo, pero a mi me gustó más el del Perlin Noise, aunque todavía tengo que pulirlo.

Respecto a lo de interpolación, pues la interpolación siempre es entre keys, pero claro, lo puedes decir de un motón de maneras, por ejemplo:IN-Between es otra!!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

MrColson

                                dracula. Lo de octree por objeto quiere decir que para CUALQUIER objeto que creas, haces un octree ? es decir, si cargas un prsonaje de 800 polys, tb lo metes en un octree? tiene esto ventajas a la hora de ahorrar polygonos en contra de el gasto de cpu que representa? t lo pregunto xq estoy con un problema similar :ojo:                                

Lord Trancos

                                Dracula, ¿tienes ya algun screenshot? ¿que tipo de iluminacion vas a usar? ¿no iras a desaparecer como Emotion, verdad? :riendo:

SaludoteZ!
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Drácula

                                Respecto a lo del Octree, sí lo hago por objeto. Como un Octree se resuelve muy rápidamente, pues en teoría sí debería notarse, aunque todavía no lo he comprado.

Respecto a lo de las fotos, pues estoy haciendo tacita a tacita la demo esta tecnológica. Pero como hay que ser muy exigente hoy en día, pues quiero que tenga un gran nivel. Por ello me compre un nuevo ordenador hace un mes, pero ...¡la tarjeta es una GForce MX que no tiene Pixel Shaders!! Por lo que no puedo generar la iluminación por Shaders. Tampoco voy a implementarla sin Shaders porque hoy en día...¡no tiene ningún sentido! O sea, que voy a potenciar los aspectos de modelado del motor y voy a dejar la iluminación para cuando salga la Radeon 9000 o la GForce 5, y aparezca por supuesto DX9, porque tampoco tiene mucha lógica desarrollar para shaders inferiores al 2.0

Con estas premisas es lógico pensar que el motor va enfocado a tarjetas de altísimo nivel. Eso me da un año para poder desarrollar en condiciones el motor y sus herramientas, que es el plazo mínimo en el cual las tarjetas DX9 empezarán a estar en el mercado a un precio asequible.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Lord Trancos

                               
Citar
Tampoco voy a implementarla sin Shaders porque hoy en día...¡no tiene ningún sentido!  

¿Entonces al final no vas a usar lightmaps? ¿Ya nadie los quiere usar? Hace poco vi un video del UT2003 y parecia que usaba lightmaps...

En cuanto a lo de las fotos... tambien tiene su gracia ver como va mejorando en engine... :sonriendo: no se q mania hay con tener el engine requeteacabauuu pa enseñar algo. :lengua:
                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Drácula

                                Pues sí, hay fotos, y subiré alguna porque no me cuesta nada. Pero ahora mismo el disco duro me ha petado y estoy reinstalando todo de nuevo. Pero en unos pocos días...

Respecto a los lightmaps, a mi me sigue pareciendo una buena opción. Creo que se deben mantener pero con iluminación por shader por encima.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Tei

                                Necesito un algoritmo para hacer Lenz Flare con  opengl, supuesto que tubiera una funcion "dibuja aqui una corona de tal tamaño, transpariencia y textura orientada al ojo"

¿alguien me orienta un poco?...                                

Drácula

                                Aquí está mi codigo, pero es para D3D. Me ayudé del ejemplo de flare que aparece en DX7(y que misteriosamente no ha vuelto a aparecer en ningún otro DX!!!)


void CXVideo::RenderFlare(CXEscena *escena,CXVector &luz)
{
   CXVector vLightPt=luz;

   // Veamos si está por detras del plano near. Si es así. no hay flare!!
   if(escena->m_Camara->m_Frustum.PlanoFrontal.EstaDelLadoDeLaNormal(vLightPt)==false) return;

   // Compute the vectors between the from, lookat, and light positions.  
   CXVector vFromPt   = escena->m_Camara->m_From;
   CXVector vViewVec  = escena->m_Camara->m_NAt;
   CXVector vLightVec = vLightPt - vFromPt;
   vLightVec.Normalizar();

   // Compute the vector and center point for the lens flare axis
   float angle =vLightVec.ProductoEscalar(vViewVec);

   if(angle<=0) return;   // Está detrás de nosotros

   // Este ángulo nos dice cuánto miramos directamente al sol
   // Lo usaremos para modificar el Gamma
   // Cuanto mayor sea angle, significa que más directamente miro al sol
   float vr,vg,vb,dif;
   // Tengo que buscar una función que haga la curva muy pronunciada en 1
   if(angle>0.9f) dif=angle/2;
   else if(angle>0.7f) dif=angle/4;
   else dif=angle/8;

   vr=(dif*2*65535);
   vg=(dif*65535);
   vb=(dif*65535);

   EstablecerGamma((long)vr,(long)vg,(long)vb);

   CXVector vCenterPt;
   // Colocamos el centro del flare un poquito delante de la cámara
   vCenterPt=escena->m_Camara->m_From+(escena->m_Camara->m_NAt*escena->m_Camara->m_Frustum.DistanciaPlanoFrontal)*m_DespFlare_Camara;

   CXVector vAxisVec=vLightPt-vCenterPt;
   vAxisVec.Normalizar();

   // Store the lens flares positions for each flare
   for( DWORD i=0; i   {
     // Store the position of the flare along the axis
     m_Flares.vPositionPt = vCenterPt + vAxisVec * m_Flares.fLoc;

     // Store the render size of the flare. This is the lens flare size
     // corrected for the orientation of the flaring axis.
     m_Flares.fRenderSize = m_Flares.fScale;
   }

   CXMALLAVERTEX vertices[4];


   Device()->SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);

   for(i=0;i
        // Set up the emissive color of the flare
      vertices[0].diffuse=m_Flares.diffuse;
      vertices[1].diffuse=m_Flares.diffuse;
      vertices[2].diffuse=m_Flares.diffuse;
      vertices[3].diffuse=m_Flares.diffuse;

      vertices[0].x=-1;vertices[0].y=-1;vertices[0].z=0;vertices[0].tu1=0;vertices[0].tv1=1;
      vertices[1].x=-1;vertices[1].y=1;vertices[1].z=0;vertices[1].tu1=0;vertices[1].tv1=0;
      vertices[2].x=1;vertices[2].y=-1;vertices[2].z=0;vertices[2].tu1=1;vertices[2].tv1=1;
      vertices[3].x=1;vertices[3].y=1;vertices[3].z=0;vertices[3].tu1=1;vertices[3].tv1=0;

      BYTE *dest;

      m_VBFlare->Lock(0,0,(BYTE **)&dest,0);
      memcpy(dest,vertices,4*24);
      m_VBFlare->Unlock();

      Device()->SetStreamSource( 0, m_VBFlare, 24);

      if(m_Flares.wType < 0 ) {
         static dwShineTic = 0;
         if(++dwShineTic>9) dwShineTic = 0;
         m_SkinFlare->m_Animacion[0].m_NFotograma=dwShineTic;
      }
      else {
         m_SkinFlare->m_Animacion[0].m_NFotograma=10+m_Flares.wType;
      }

      m_SkinFlare->Activar();

      CXMatriz mats;float s=m_Flares.fRenderSize;
      
      CXMatriz m=escena->m_Camara->m_MatInvView;
      
      // Establecemos la posición original
      m._41=m_Flares.vPositionPt.x;
      m._42=m_Flares.vPositionPt.y;
      m._43=m_Flares.vPositionPt.z;
      mats.Identidad();
      // Escalamos
      mats._11 = s;
      mats._22 = s;
      mats._33 = 1.0f;

      CXMatriz m2=mats*m;

      Video.Device()->SetTransform(D3DTS_WORLD,&m2);

      Device()->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0,2);

      m_SkinFlare->Desactivar();
   }

}



[ Este Mensaje fue editado por: Drácula el 2002-08-07 15:48 ]                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Tei

                                oye este codigo tiene buena pinta!

aunque me costara pasarlo al bueno y decente opengl. esta lleno de quisicosas directx :sonriendo:                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.