Gracias Gracias:  1
Resultados 1 al 5 de 5

Tema: animar segun distancias

  1. #1
    Senior Member Avatar de deloeste33
    Fecha de ingreso
    Dec 2008
    Mensajes
    928

    Exclamation Animar según distancias

    He visto muchas animaciones en las que un conjunto de objetos similares cambian alguna característica (color, tamaño, hacen un movimiento específico) cuando otro objeto se les acerca.
    Un ejemplo típico sería una superficie cubierta de objetos oscuros, que al paso de un objeto con una trayectoria definida se aclaran gradualmente cuando éste se les acerca, y vuelven a su color oscuro cuando se les aleja.
    Imagino que en la pista de color de cada objeto oscuro debería haber un controlador distinto al usual, pero no tengo idea de cómo hallar la distancia entre los objetos y convertirla automáticamente en los valores necesarios.
    ¿Alguien sabe cómo se hace este efecto?

  2. #2
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Respuesta: Animar según distancias

    Hola, yo creo que lo que buscas se hace en postproducción, básicamente tienes 2 renders y usas una máscara para mostrar uno u otro (máscara que puede estar dada perfectamente por una luz con atenuación sobre materiales blancos sin textura).

    De todas formas el comando para medir distancias entre 2 nodos es:

    Código:
    distance $objetoA $objetoB
    En ciertos casos donde se quieren lograr efectos muy concretos puede ser útil medir la distancia entre objetos para definir una propiedad, pero sospecho que no es eso a lo que te refieres con la pregunta. Si lo fuera te dejo un ejemplo donde usando la distancia entre múltiples elementos podemos establecer su color (simplemente ejecuta el código en una escena nueva).



    Código:
    (
      animPoint = Point name:"animPoint" box:on
      allSpheres = point name:"allSpheres_grp" box:off
      for x=-100 to 100 by 10 do
        for y=-100 to 100 by 10 do
        (
          mySphere = Sphere pos:[x,y,0] radius:5 name:(uniqueName "sphere") color:[0,0,0]
          mySphere.parent = allSpheres
          mySphere.material = StandardMaterial()
          mySphere.material.name = mySphere.name + "_material"
          mySphere.material.selfIllumAmount = 100
          color = mySphere.material.diffuse.controller = point3_script()
          color.AddNode "self" mySphere 
          color.AddNode "target" animPoint
          txt ="(" + "\n"
          txt+="  local dist = distance self target" + "\n"
          txt+="  local fallof = 40" + "\n"
          txt+="  local color = (fallof-dist)/fallof" + "\n"
          txt+="  [color, color, color]" + "\n"
          txt+=")"
          color.script = txt
        )
      select animpoint
    )
    Saludos
    Miniaturas adjuntadas Miniaturas adjuntadas animar segun distancias-csaez_colorbydist.jpg  
    Última edición por Cesar Saez; 08-03-2009 a las 10:31

  3. #3
    Senior Member Avatar de deloeste33
    Fecha de ingreso
    Dec 2008
    Mensajes
    928

    Unhappy Respuesta: Animar según distancias

    Hola, César!
    Te agradezco la profundidad con que abordaste mi msj.
    Mis conocimientos de MaxScript son prácticamente nulos, de modo que hasta la menor edición me sería incomprensible.

    Sin embargo, me invadió la curiosidad, y pegué el código en una ventana de Listener nueva (imagino que era eso lo que había que hacer) y me tiró el siguiente mensaje en rojo:
    -- Syntax error: at ), expected <factor>
    -- In line: )

    Ahora...
    puede ser útil medir la distancia entre objetos para definir una propiedad, pero sospecho que no es eso ... sí, es algo como esto en verdad.
    Para alterar no sólo el color, sino el tamaño u otras características de los objetos.
    Pero en realidad esperaba que el problema se pudiera resolver con utilidades como el diálogo Parameter Wiring o el Controlador Expresión, por ejemplo. ¿Tenés idea cómo se usa(n), especialmente luego de obtener la distancia entre objetos (que ya sabés usar)?
    Estuve probando, con el código distance $A $B que me pasaste, y a veces no puede convertir los valores a Float, y otras trunca la expresión.
    Obviamente estoy dando manotazos de ahogado, antes que trabajar metódicamente.
    Última edición por deloeste33; 11-03-2009 a las 04:59

  4. #4
    pythonized... Avatar de Cesar Saez
    Fecha de ingreso
    Mar 2004
    Ubicación
    Granada, España
    Mensajes
    3,765

    Respuesta: Animar según distancias

    Hola, no tienes nada que agradecer, este tipo de mini desafíos me resultan sumamente entretenidos de discutir, lastima que no se dan muy a menudo
    Cita Iniciado por deloeste33 Ver mensaje
    ...Sin embargo, me invadió la curiosidad, y pegué el código en una ventana de Listener nueva (imagino que era eso lo que había que hacer) y me tiró el siguiente mensaje en rojo:
    -- Syntax error: at ), expected <factor>
    -- In line: )
    Para ejecutar un código que comprenda más que un par de líneas tendrías que ir al menú MaxScript/New Script y pegar en la nueva ventana el código, para ejecutarlo basta presionar ctrl+E o bien ir al menú File/Evaluate All...

    (no tengo max al frente y los nombres puede diferir levemente, pero se entiende el concepto)

    Cita Iniciado por deloeste33 Ver mensaje
    ...Pero en realidad esperaba que el problema se pudiera resolver con utilidades como el diálogo Parameter Wiring o el Controlador Expresión, por ejemplo. ¿Tenés idea cómo se usa(n), especialmente luego de obtener la distancia entre objetos (que ya sabés usar)?
    Estuve probando, con el código distance $A $B que me pasaste, y a veces no puede convertir los valores a Float, y otras trunca la expresión.
    La verdad es que si se puede hacer de forma gráfica, puedes crear un helper del tipo tape y vinculando sus extremos obtener la distancia entre ellos, luego mediante un WireParameters o el tipo de conexión que más te acomode puedes usar ese valor.

    La forma de usar la distancia para hacer algo útil depende absolutamente de lo que necesites, no hay automatismos en transformar distancia a color o cosas por el estilo (al menos hasta donde entiendo).

    Por ejemplo en el script del mensaje anterior básicamente hice lo siguiente:
    1.- Creo un helper del tipo point que será el control que animaremos
    2.- Creo una serie de esferas (21x21=441 esferas!) que cambiaran su color según la distancia con el helper creado anteriormente.
    3.- Para cada esfera creo un material y se lo asigno (ya que es la forma de darle un color diferente a cada uno)
    4.- En el canal diffuse de cada material crea un controlador tipo point3 script que permite poner cierta lógica a la forma de obtener el color.
    3.- En cada controlador point3 script escribo una pequeña expresión para obtener el color basado en la distancia, las líneas verdes son sólo comentarios descriptivos para explicar que hace cada cosa.
    Código:
    -- En la siguiente línea calculo la distancia entre la esfera y el point.
    dist = distance self target
    -- Establezco un radio de 40 unidades para el decaimiento del color,
    -- puede ser cualquier valor.
    fallof = 40
    -- "Normalización" de la distancia para obtener color, esta es la parte
    -- ingeniosa donde debes buscar una relación entre la distancia y un valor 
    -- entre 0~1 que represente cada componente del color.
    color = (fallof - dist) / fallof
    -- Valor final entregado por el controlador en formato RGB.
    [color, color, color]
    Hacer esto a mano (con helpers para medir distancias y tal) es un proceso largo y tedioso, la lógica sigue siendo totalmente aplicable pero dado que son muchos elementos se tornaría en algo sumamente repetitivo (sin mencionar que tendrías el doble de elementos en tu escena). Por eso te comenté sobre el comando de maxscript para medir distancias en lugar del 'helper taper', a la larga termina siendo una opción mucho más viable para este tipo de cosas

    Saludos
    Última edición por Cesar Saez; 11-03-2009 a las 08:13

  5. #5
    Senior Member Avatar de deloeste33
    Fecha de ingreso
    Dec 2008
    Mensajes
    928

    Unhappy Respuesta: Animar según distancias

    Cita Iniciado por Cesar Saez Ver mensaje
    Hacer esto a mano (con helpers para medir distancias y tal) es un proceso largo y tedioso,
    ¿Te parece? ¿No es posible trabajar con instancias y el controlador Expression?
    Estuve haciendo pruebas con ellos (y con Parameter Wiring), que juntos parecen herramientas flexibles y potentes. Pero justo por eso hay algo que todavía no capto respecto a la sintaxis admitida en la ventana Evaluate expression.
    Mi pregunta iba orientada al posible uso combinado de estas dos herramientas. ¿Las usas a menudo? ¿Puedes decirme cómo hacer que el $A $B (o algo parecido) funcione allí? ¿Conoces la función que convierte coordenadas a floatí
    Imagino que sabiendo eso, se podría usar esto sin necesidad del objeto taper.
    Gracias de antemano.
    Última edición por deloeste33; 13-03-2009 a las 16:40 Razón: otrografía

Temas similares

  1. Script medidor distancias
    Por 3dpoder en el foro Programación y Scripts
    Respuestas: 0
    Último mensaje: 19-05-2014, 10:27
  2. Blender Mi modelo Desaparece a grandes distancias
    Por HydraTeam en el foro Modelado
    Respuestas: 2
    Último mensaje: 23-12-2012, 00:18
  3. spline por distancias
    Por alex222 en el foro Modelado
    Respuestas: 2
    Último mensaje: 31-01-2009, 04:41
  4. distancias de trabajo ojos monitor
    Por neozenit en el foro Hardware
    Respuestas: 6
    Último mensaje: 06-09-2007, 01:31
  5. Distancias solo ortogonales
    Por franquy en el foro Diseño Gráfico y CAD
    Respuestas: 8
    Último mensaje: 02-10-2005, 16:33

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •