Logo POVRay...
Instrucciones para "MMPD.inc" v1.0

Donación de Rafael Angel Campos Vargas, en el año 2018, a la Biblioteca de objetos de POV-Ray.  Este proyecto se encuentra actualmente suscrito a la patente LGPL;  para libre uso comercial y no comercial del software.

CC-GNU LGPL
The primary purpose of this collection is to make items publicly available under a common license that permits use, modification and re-distribution. To support this contributions are donated to the collection with consent for their use under the terms of the Creative Commons - Lesser General Purpose License (CC-GNU LGPL).
Chris Bartlett 2007

La versión actual v1.0 de "MMPD.inc" (ModeloMaderaParaDibujo) dibuja un hombrecillo de madera para dibujante. La macro permite girar las diversas articulaciones. Se pueden modificar algunas texturas y liberarlo de su base. No es compatible con POV-Ray 3.1.

Indice de página:

  1. Instalación de Archivos
  2. Instrucciones básicas
  3. Características del objeto
  4. Modificadores
  5. Notas y Advertencias
  6. Sugerencias de modificación
  7. Sobre LibreN3D

Instalación de Archivos

El procedimiento siguiente es completamente optativo, corresponde simplemente al estándard de la Biblioteca de objetos POV-Ray.
  1. Cree el subdirectorio "ObjectCollections".  Se sugiere un subdirectorio del folder POV-Ray, creado por el instalador en algunas versiones en la sección de documentos o bien en la de código.
  2. Copie todos los archivos "*.inc" en dicho subdirectorio, dieciocho en total;  únicamente estos son necesarios.  En cuanto a la documentación y demás puede colocarla si desea en el mismo subdirectorio, el estándar ha sido diseñado para evitar problemas de compatibilidad. La lista exhaustiva de los archivos necesarios: "MMPD.inc", "MMPD_AU1.inc", "MMPD_AU2.inc", "MMPD_I01.inc", "MMPD_I02.inc", "MMPD_I03.inc", "MMPD_I04.inc", "MMPD_I05.inc", "MMPD_I06.inc", "MMPD_I07.inc", "MMPD_I08.inc", "MMPD_I09.inc", "MMPD_I10.inc", "MMPD_I11.inc", "MMPD_I12.inc", "MMPD_I13.inc", "MMPD_I14.inc" y "MMPD_I15.inc".
  3. Actualice los archivos buscados por POV-Ray, en algún archivo ini pertinente.  Por ejemplo "POVRay.ini";  agregue el comando Library_Path="C:\FDOS\POVRAY31\ObjectCollections"; o el que corresponda a su sistema operativo.  POV-Ray ofrece muchas formas de realizar esto.  Si no sabe cómo, probablemente convenga leer el manual de referencia en la sección "Command-line options".   Cada sistema operativo presenta sus propias variantes.
Nota:  El archivo de prueba "MMPD.pov" puede ejecutarse sin ningún proceso de instalación.  Unicamente debería estar ubicado en el mismo folder que los dieciocho archivos "*.inc" de esta distribución.


Instrucciones básicas

Modelo de madera
Desplegar el objeto en estado de reposo es bastante simple, deberá incluir el archivo principal y ubicar el objeto.  Además requiere un llamado previo a una macro de inicialización de objetos. El siguiente ejemplo ilustra el procedimiento básico.
    #if ( version >= 3.7 )
      #version 3.7;
    #end
    global_settings { assumed_gamma 1.0 }  

    #include "stdinc.inc"
    #include "stdcam.inc"
    #include "MMPD.inc"
    
    MMPD_InicializarObjetos( on )

    object      {
      MMPD_DibujarModelo( true, MMPD_MovimientosSolicitadosNULL )
      rotate            180*y
      translate         <-1.94,+1.53,-4.75>
    }

Los objetos de la unidad se inicializan con la siguiente macro que debe utilizarse una sola vez. Llamados sucesivos a la macro serán ignorados.

    #macro MMPD_InicializarObjetos( ModoN3D ) 
ModoN3D :
off define las rotaciones en los nodos al estilo POV-Ray. on provoca que las rotaciones de los ejes se acumulen en el orden X-Y-Z; el eje Y rotará con el giro X antes de su propia rotación, y el eje Z rotará con el giro X y Y antes de su propia rotación.

La siguiente es la macro principal, que se encarga de dibujar el objeto.

    #macro MMPD_DibujarModelo( ModoFijo, ArregloPosiciones )
ModoFijo :
on coloca el modelo fijo sobre un soporte de madera. off dibuja el modelo libre de su soporte.
ArregloPosiciones :
Se trata de un arreglo bidimensional de reales array [TotalMovimientos][4 o 5] que permite girar las articulaciones del objeto. Utilice MMPD_MovimientosSolicitadosNULL para ningún giro. Cada renglón se define por cuatro o cinco números reales: { MMPD_IndiceIdentificadorMovimientoSolicitado, MMPD_IndiceRotarXMovimientoSolicitado, MMPD_IndiceRotarYMovimientoSolicitado, MMPD_IndiceRotarZMovimientoSolicitado [, MMPD_IndiceActivoMovimientoSolicitado] }. Define una lista de solicitudes, que opcionalmente podrían desactivarse individualmente si se requiere.
MMPD_IndiceIdentificadorMovimientoSolicitado Remite al identificador de nodo afectado. Puede usar un valor negativo para ignorar el renglón. Llamadas múltiples al mismo nodo se sobreescriben anulando al anterior.
MMPD_IndiceRotarXMovimientoSolicitado Rotación X a asignar a la articulación.
MMPD_IndiceRotarYMovimientoSolicitado Rotación Y a asignar a la articulación.
MMPD_IndiceRotarZMovimientoSolicitado Rotación Z a asignar a la articulación.
MMPD_IndiceActivoMovimientoSolicitado on el giro se aplica, off no se aplica. El arreglo puede definirse sin este campo.

El siguiente ejemplo incluye una solicitud de giros.

    #if ( version >= 3.7 )
      #version 3.7;
    #end
    global_settings { assumed_gamma 1.0 }  

    #include "stdinc.inc"
    #include "stdcam.inc"
    #include "MMPD.inc"  
    
    MMPD_InicializarObjetos( on )  
    
    #declare MyGiros            = array [2][4]
       { { MMPD_NodoBrazoDerecho    ,-20,  0, 30 },
         { MMPD_NodoAnteBrazoDerecho,-40,  0,  0 } }

    object      {
      MMPD_DibujarModelo( true, MyGiros )
      rotate            180*y
      translate         <-1.94,+1.53,-4.75>
    }


Características del objeto

Mis dibujos están en unidades L (Lisa).  1 L equivale a 0.055063 pulgadas definido como 0.001 para POVRAY.  El modelo en reposo se encuentra contenido entre las siguientes coordenadas:
    Mínimo (sin soporte)	= < - 30,    0, -  9 >*L	
    Máximo (sin soporte)	= < + 30, +215, + 24 >*L	
    Mínimo 			= < - 30,    0, - 28 >*L	
    Máximo			= < + 30, +229, + 31 >*L	

En posición de reposo los ejes de giro de todos los nodos descansan en el plano YZ. El soporte desplaza los ejes unos 6.6*L en Z+.

El objeto es simétrico respecto al plano XZ. La cabeza en reposo mira hacia Z+, con gravedad Y-.

La siguiente es la lista de articulaciones en el modelo:

Constante Valor numérico
MMPD_NodoBasal 10
MMPD_NodoCintura 1000
MMPD_NodoCinturaSup10 1010
MMPD_NodoCinturaSup20 1020
MMPD_NodoCinturaSup30 1030
MMPD_NodoCinturaSup40 1040
MMPD_NodoCinturaSup50 1050
MMPD_NodoCinturaSup60 1060
MMPD_NodoTroncoSup 1100
MMPD_NodoCinturaInf10 1210
MMPD_NodoCinturaInf20 1220
MMPD_NodoCinturaInf30 1230
MMPD_NodoCinturaInf40 1240
MMPD_NodoCinturaInf50 1250
MMPD_NodoCinturaInf60 1260
MMPD_NodoTroncoInf 1300
MMPD_NodoHombroDerecho (*) 2000
MMPD_NodoBrazoDerecho 2050
MMPD_NodoCodoDerecho (*) 2100
MMPD_NodoAnteBrazoDerecho 2150
MMPD_NodoEsferaManoDerecha (*) 2200
MMPD_NodoManoDerecha 2300
MMPD_NodoHombroIzquierdo (*) 3000
MMPD_NodoBrazoIzquierdo 3050
MMPD_NodoCodoIzquierdo (*) 3100
MMPD_NodoAnteBrazoIzquierdo 3150
MMPD_NodoEsferaManoIzquierda (*) 3200
MMPD_NodoManoIzquierda 3300
MMPD_NodoEsferaPiernaDerecha (*) 4000
MMPD_NodoPiernaDerecha 4050
MMPD_NodoRodillaDerecha (*) 4100
MMPD_NodoPiernaBajaDerecha 4150
MMPD_NodoEsferaPieDerecho (*) 4200
MMPD_NodoPieDerecho 4300
MMPD_NodoEsferaPiernaIzquierda (*) 5000
MMPD_NodoPiernaIzquierda 5050
MMPD_NodoRodillaIzquierda (*) 5100
MMPD_NodoPiernaBajaIzquierda 5150
MMPD_NodoEsferaPieIzquierdo (*) 5200
MMPD_NodoPieIzquierdo 5300
MMPD_NodoCuello (*) 10000
MMPD_NodoCabeza 11000

(*) Sugerimos no utilizar los nodos con asterisco pues solo son esferas, y el nodo siguiente está definido en el mismo centro de giro.

Considere a MMPD_NodoBasal como ubicado en el piso, y a MMPD_NodoCintura cercano al centro del tronco.

Para la modificación de los nodos anteriores puede ser útil la siguiente variable modelo:

    #declare MMPD_ModeloGiros		= array [27][5]	 
Sirve como parámetro para ArregloPosiciones. En su estado actual no produce ningún giro, pero se puede modificar a gusto. Los renglones solo se utilizarán si asigna el valor on (Sugerencia: Copie el original con Copy-Paste, cambie nombre, y pruebe algunos valores a gusto como parámetro ArregloPosiciones).

En el siguiente código redefinimos la variable MMPD_ModeloGiros completamente con la ayuda de una edición Copy-Paste. Modificamos algunos valores para concordar con el último ejemplo. Por precaución nosotros recomendamos cambiarle el nombre si, como a continuación, realiza una redefinición completa.

    #if ( version >= 3.7 )
      #version 3.7;
    #end
    global_settings { assumed_gamma 1.0 }  

    #include "stdinc.inc"
    #include "stdcam.inc"
    #include "MMPD.inc"  
    
    MMPD_InicializarObjetos( on )  
    
    #declare MMPD_ModeloGiros            = array [27][5]
      {
        { MMPD_NodoCinturaSup10         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaSup20         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaSup30         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaSup40         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaSup50         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaSup60         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf10         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf20         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf30         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf40         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf50         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCinturaInf60         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoTroncoSup            ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoTroncoInf            ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPiernaDerecha        ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPiernaBajaDerecha    ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPieDerecho           ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPiernaIzquierda      ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPiernaBajaIzquierda  ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoPieIzquierdo         ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoBrazoDerecho         ,  -20.0,    0.0,   30.0, on  },
        { MMPD_NodoAnteBrazoDerecho     ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoManoDerecha          ,  -40.0,    0.0,    0.0, on  },
        { MMPD_NodoBrazoIzquierdo       ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoAnteBrazoIzquierdo   ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoManoIzquierda        ,    0.0,    0.0,    0.0, off },
        { MMPD_NodoCabeza               ,    0.0,    0.0,    0.0, off }
      } 

    object      {
      MMPD_DibujarModelo( true, MMPD_ModeloGiros )
      rotate            180*y
      translate         <-1.94,+1.53,-4.75>
    }

La siguiente macro permite colocar objetos y realizar algunos cálculos simples. Retorna el transform correspondiente al giro solicitado.

    #macro MMPD_UbicacionModelo( NodoSolicitado, ModoFijo, ArregloPosiciones )
NodoSolicitado :
Número de identificación del nodo para evaluar el transform respectivo.
ModoFijo :
on coloca el modelo fijo sobre un soporte de madera. off dibuja el modelo libre de su soporte.
ArregloPosiciones :
Arreglo de posiciones con información de los giros que se solicitarán a las articulaciónes del modelo de madera.

Un vector nulo se ubicaría en la misma posición que el centro del giro, y el resto de las posiciones en forma corresondiente, sin cambios de escala, a las rotaciones del modelo.

El siguiente ejemplo ubica una esfera roja en el hombro izquierdo por medio de la macro anterior.

    #if ( version >= 3.7 )
      #version 3.7;
    #end
    global_settings { assumed_gamma 1.0 }  

    #include "stdinc.inc"
    #include "stdcam.inc"
    #include "MMPD.inc"  
    
    MMPD_InicializarObjetos( on )        

    union       {
      MMPD_DibujarModelo( true, MMPD_MovimientosSolicitadosNULL )
      sphere              {
        0, 0.01
        pigment { Red }
        MMPD_UbicacionModelo
          ( MMPD_NodoHombroIzquierdo, true, MMPD_MovimientosSolicitadosNULL )
      }
      rotate            180*y
      translate         <-1.94,+1.53,-4.75>
    }

Se generan las siguientes declaraciones que no deberían modificarse.  Para su correcta modificación consulte la sección Modificadores.

MMPD_MovimientosSolicitadosNULL
Para usar como parámetro ArregloPosiciones trivial sin ningún giro.
MMPD_DefaultTexturaPrincipal
Textura principal del modelo de madera.
MMPD_DefaultTexturaBase
Textura para el cilindro soporte de madera.
MMPD_DefaultTexturaMetalica
Textura del alambre rígido que soporta el modelo.


Modificadores

La siguiente es la lista de los modificadores permitidos en la unidad.

    #declare MMPD_ModoCubix			= off;
Si se utiliza deberá definirse antes de llamar a la macro de inicialización de objetos. Si se activa esta bandera el modelo de madera suministrado por defecto, será reemplazado por una estructura más simple de bloques y cilindros. Existe por razones de depuración. Pero puede utilizarse para acelerar animaciones de prueba.

Utilice la siguiente macro para modificar las texturas:

    #macro MMPD_CambiarTexturasModelo
	 ( TexturaModelo, TexturaSoporte, TexturaMetalica ) 
TexturaModelo :
Sustituirá a la textura principal.
TexturaSoporte :
Corresponde a la textura del cilindro de madera soporte.
TexturaMetalica :
Corresponde a la textura metálica del alambre rídigo que soporta el modelo.

El siguiente ejemplo ilustra el uso de los modificadores:

    #if ( version >= 3.7 )
      #version 3.7;
    #end
    global_settings { assumed_gamma 1.0 }  

    #include "stdinc.inc"
    #include "stdcam.inc"
    #include "MMPD.inc"  
    #include "textures.inc"
    
    #declare MMPD_ModoCubix         = on;
    
    MMPD_InicializarObjetos( on )        
    
    MMPD_CambiarTexturasModelo
          ( Sandalwood, Rosewood, Gold_Texture )

    object      {
      MMPD_DibujarModelo( true, MMPD_MovimientosSolicitadosNULL )
      rotate            180*y
      translate         <-1.94,+1.53,-4.75>
    }


Notas y Advertencias

Algunos nodos corresponden simplemente a esferas unidas a otro nodo de articulación. Se puede programar el movimiento en cualquiera de los dos nodos, la diferencia neta es el giro de una esfera sobre su centro.

La incorporación de tantos archivos #include, tuvo como objetivo facilitar el proceso de modificación y adaptación para mis propios juegos de video.

Los descendientes de los giros superior e inferior de la cintura acumulan alejándose del nodo central del tronco MMPD_NodoCintura. Este último nodo no tiene asignado ningún objeto físico.


Sugerencias de modificación


Sobre LibreN3D

Algo hace falta En la actualidad dedico casi unas dos horas todos los días, para desarrollar mis proyectos de animación con el compilador FreePascal para FreeDOS.  Mi propuesta original fue filmar animaciones de "baja" calidad, con progreso lento y paulatino. Desconocía en ese entonces del programa POV-Ray.  Creo que con ayuda de dicho proyecto, podría lograr mucho mejores resultados desde un principio.  Confío que dentro de algunos años pueda lograr animaciones completas de aceptable calidad.   En la actualidad, intento agregarle características elásticas a los objetos.  He tenido numerosos retrasos, así que todavía no funciona.  Lo siento...(25/noviembre/2017), pero me siento muy seguro de que pronto lo lograré.  De momento, no tiene interface con el usuario, pero se encuentra en desarrollo como intérprete de renglón al estilo DOS.

Me sería de muchísima ayuda, que el grupo POV-Ray siguiera desarrollando la versión para DOS.   Los siguientes son enlaces que podrían ser de utilidad para el interesado en los proyectos FreePascal y FreeDOS.
Logo FreeDOS...
Descarga sistema operativo FreeDOS
Logo FreePascal...
Descarga compilador FreePascal