Gracias Gracias:  0
Resultados 1 al 13 de 13

Tema: [MaxScript] - orientar objeto a normal de un vertice

  1. #1
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    3dsmax [MaxScript] - orientar objeto a normal de un vertice

    Hola que tal, estoy trabajando en un script que estoy necesitando, en principio para linkear un objeto a un vértice de una malla.

    utilizando dependsOn en un script controller en position transform

    dependsOn $box01
    (
    polyop.getvert $box01 1
    )
    funciona perfecto.

    ahora el segundo paso es conseguir que este objeto este orientado a la normal de este vértice seleccionado pero no lo consigo,

    se puede extraer la normal del vértice con getNormal pero tengo dos problemas,

    -el primero es que getNormal funciona con Editable_mesh y no con Editable_Poly

    - y el segundo problema es que tengo conflictos con euler vs quaternios, intente convertirlos pero no tuve exito....

    la idea es que este objeto que ahora esta linkeado al vértice seleccionado, pueda rotar en función de la orientacion de este vértice o el objeto del que depende...

    se les ocurre alguna idea para poder resolver esta cuestion?

    muchas gracias por adelantado!!
    saludos
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

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

    Re: [MaxScript] - orientar objeto a normal de un vertice

    utilizando dependsOn en un script controller en position transform funciona perfecto.
    Yo te recomendaría (si trabajas con un max superior a la versión 8 ) que averigues sobre los nodos porque entre otras cosas te permitiran independencia de nombres en el script

    -el primero es que getNormal funciona con Editable_mesh y no con Editable_Poly
    Puedes acceder a la trimesh en lugar del nodo agregando un ".mesh", de esta forma debería funcionar también con editable poly.
    Ejemplo:
    getNormal $.mesh 6 --Retorna el vector normal del vértice 6 en el objeto seleccionado

    - y el segundo problema es que tengo conflictos con euler vs quaternios, intente convertirlos pero no tuve exito....
    Lo que pasa es que getNormal te retorna el vector de la normal del vértice pero no directamente el ángulo. Yo en tu lugar reconstruiría directamente toda la matriz de transformación, seguramente este tutorial te sirva mucho para hacerte una mejor idea de como funciona el tema.

    Saludos

  3. #3
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    3dsmax Re: [MaxScript] - orientar objeto a normal de un vertice

    bien getNormal $.mesh funciona perfecto, ya no hay problemas entre editable poly y editable mesh...

    con respecto a la orientacion, sigo sin poder solucionarlo....

    ahora comprendo que getNormal devuelve el vector y no el ángulo, por lo tanto no se puede tan sencillamente....

    entonces lo que hay que hacer con el vector que devuelve getNormal es calcular el ángulo para poder asignarlo al objeto.

    aca esta el problema. lei la explicación varias veces, hice algunas cuantas pruebas pero sigo sin comprenderlo del todo.

    hice un intento de reconstruir la matrix3 algo así como:

    dependsOn $box01
    (
    pos= polyop.getvert $box01 1;

    rot=getNormal $box01.mesh 1

    matrix3 [1,0,0] [0,1,0] [0,0,1] pos

    )
    pero no hay caso, logicamente me falta calcular el ángulo....

    gracias por todo Cesar!
    Última edición por Leandro Salerno; 12-10-2008 a las 05:00
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

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

    Re: [MaxScript] - orientar objeto a normal de un vertice

    Aunque tuvieras la normal te hace falta un vector que te indique la tangente y luego mediante un producto cruz de las matrices sacar un tercer vector perpendicular a los anteriores para generar los 3 vectores necesarios en tu matriz de transformación, 3D implica 3 ejes

    Leete el tutorial que te mencionaba en el mensaje anterior que te va a ayudar mucho a entender que es y como funcionan las matrices de transformación, a mi me fue muy muy útil.

  5. #5
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    como te comentaba lei el tutorial varias veces y creo comprender que son las matrices de transformación.... pero según me decis. para conseguir la orientacion hay que relizar varios cálculos matematicos con ciertas formulas que por ahora desconozco.

    supongo que de alguna manera lo resolvere

    gracias por todo
    saludos!
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

  6. #6
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    bueno luego de leer bastante llegue a un resultado que funciona parcialmente bien....

    primero en lugar de intentar alinear a un vertice, lo hago con una cara....

    por ejemplo un ScriptController en transform, para la cara 76 de la sphere02

    dependsOn $Sphere02
    (
    Pos= polyop.getFaceCenter $sphere02 76
    Norm = (polyop.getFaceNormal $sphere02 76)

    worldUpVector = [0,0,1]

    rightVector = normalize(cross worldUpVector Norm)
    upVector = normalize(cross rightVector Norm)
    matrix3 rightVector upVector Norm Pos
    )
    el objeto queda alineado a la normal y rota también. a primera vista perfecto.... pero en determinadas circunstancias el objeto alineado rota en un eje.
    estoy cerca pero falta....
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

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

    Re: [MaxScript] - orientar objeto a normal de un vertice

    Ahora si! el código tiene mucho más sentido

    Yo creo que el problema es que tomas como base para calcular la matriz un worldUpVector que no viene a nada, simplemente es un vector que apunta hacia arriba pero no tiene relación con la orientación del componente en particular al que quieres "pegarle" el helper. Yo cuando hice un script parecido en lugar de usar un worldUpVector usé un vector entre el componente seleccionado y su vecino (en el fondo la tangente de la superficie), de esta forma puedes calcular los 3 vectores y siempre tendrán relación con la orientación del componente.

    Saludos

  8. #8
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    pero la tangente de la superficie no seria el rightVector? y el rightVector no lo tengo que calcular con el worldUpVector?

    no comprendo bien.

    probé usando:

    Código:
    worldUpVector = normalize(cross pos Norm)
    funciona perfecto cuando el objeto lo muevo o roto.... pero si lo que se mueven son los vértices. o uso algún modificador.... nuevamente aparecen errores en la rotación local del "point" pegado .... obviamente tampoco es la solucion....

    creo que ya se me esta escapando el tema.

    saludos
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

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

    Re: [MaxScript] - orientar objeto a normal de un vertice

    Cita Iniciado por Leandro Salerno Ver mensaje
    pero la tangente de la superficie no seria el rightVector? y el rightVector no lo tengo que calcular con el worldUpVector?

    no comprendo bien.
    Me preguntas por el nombre de la variable o lo que realmente estas calculando? si es por el nombre de tus variables tiene sentido que la tangente a la superficie se llame rightVector.

    Yo a lo que me refería antes es que con esa solución cuando gires la esfera el dummy no va a quedar fijo ya que depende de un vector inventado que simplemente apunta hacia arriba del mundo, haz la prueba y gira tu esfera hacia abajo (veras como mientras la giras la esfera va cambiando la rotación en Z de tu dummy). Es lo mismo que cuando usas un constraint y tienes que establecer tu propio upNode (o upVector o como se llame en max). Yo te recomendaría que en lugar de usar un vector inventado apuntando hacia arriba del mundo uses un vector que apunte hacia el polígono/componente vecino.

    probé usando:
    Código:
    worldUpVector = normalize(cross pos Norm)
    No quiero parecer rudo pero sabes que estas haciendo exactamente con esa linea? estas normalizando el producto cruz entre el vector de la normal y la posición. Es un poco como mezclar peras con manzanas.

  10. #10
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    no te preocupes, eso no es ser rudo.... no me molesta mezlcar peras con manzanas o bananas.... equivocarse y seguir equivocandose hace que se encuentre el camino y se aprenda. así que no pasa nada. saludos y gracias por tu tiempo!
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

  11. #11
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    bueno seguramente me siga equivocando pero ahora llegue a esto....
    aparentemente lo veo funcionar muy bien... pero no se si me estoy engañando...

    Código:
    dependsOn $Teapot01
    (
    Pos= polyop.getFaceCenter $Teapot01 858
    Pos2= polyop.getFaceCenter $Teapot01 844
    Norm =  (polyop.getFaceNormal  $Teapot01 858)
    
    worldUpVector = pos - pos2
    
    rightVector = normalize(cross worldUpVector Norm)
    upVector = normalize(cross rightVector Norm)         
    matrix3 rightVector upVector Norm Pos
    )
    Cesar gracias por tu orientacion, comentarios y tu tiempo. me hiciste pensar mucho! abrazo grande!
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

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

    Thumbs up Re: [MaxScript] - orientar objeto a normal de un vertice

    Esta muy bien!

    Lo único que creo te faltaría es normalizar el vector entre los 2 componentes, procurar de hacer locales tus variables para evitar problemas de evaluación cuando tengas varios objetos con el script de forma simultanea y en lugar de usar directamente el $teapot01 usar un nodo que te permitira no amarrarte a nombres y va a evaluar un poco más rapido.

    Código:
    -- forma de calcular el vector normalizado entre 2 puntos
    -- y guardarlo en una variable local:
    
    local worldUpVector = (pos - pos2)/Length(pos - pos2)
    Por casualidad estas usando max 8? si es así probablemente el script no te tomara los modificadores sobre el editable poly (en versiones posteriores funciona bien), si quieres hacerlo más compatible yo te recomendaría seguir el mismo criterio que llevas hasta ahora pero usando comandos que funcionen sobre trimesh (como el primer mensaje), el concepto es exactamente el mismo. Casí lo tienes!

    Felicidades!

  13. #13
    Miembro Avatar de Leandro Salerno
    Fecha de ingreso
    Apr 2007
    Ubicación
    Buenos Aires, Argentina
    Mensajes
    36

    Re: [MaxScript] - orientar objeto a normal de un vertice

    Excelente!
    Si estoy con la versión 2009 así que no hay problema.
    Es cierto, tengo pendiente el tema de los nodos, pero tengo que leer un poco sobre ese tema, no lo tengo muy claro todavía.... lo importante ahora es que en principio el código funciona genial....
    Por lo que estuve probando también, surge un pequeño problema y es que si a la geometría le sumas un modificador como el meshsmooth o un turbosmooth el orden de las caras cambia... entonces el dummy cambia de posición....
    Pero bueno por ahora esto me sirve, hasta que tenga que poner un TurboSmooth jeje....

    gracias!
    Leandro Salerno
    PostMedia
    http://www.postmedia.com.ar/

Temas similares

  1. Rotar un vértice de una línea (sub-objeto).
    Por gervalengar en el foro Animación y Rigging
    Respuestas: 0
    Último mensaje: 08-03-2015, 16:15
  2. Respuestas: 1
    Último mensaje: 04-01-2013, 14:14
  3. Houdini Como orientar un objeto con otro
    Por mundo 3d en el foro Animación y Rigging
    Respuestas: 4
    Último mensaje: 22-03-2011, 18:05
  4. vincular vertice de spline a objeto
    Por luis_cuvi en el foro Animación y Rigging
    Respuestas: 1
    Último mensaje: 25-03-2010, 10:23
  5. linkear objeto a vertice de spline
    Por r-l-a-v en el foro Programación y Scripts
    Respuestas: 1
    Último mensaje: 04-03-2010, 16:31

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