Resultados 1 al 16 de 16

Alienar en rotación objetos

  1. #1
    Fecha de ingreso
    Feb 2005
    Mensajes
    2,231

    Alienar en rotación objetos

    Hola. Lo primero decir que tener un foro de script nos va ayudar mucho a la gente que estamos empezando. Al fin dejara de ser un misterio y poco a poco los que tenemos poca idea nos iremos familiarizando con Maxscript y eso es algo muy bueno.

    Bien, os cuento. Estoy intentando hacer esta tontería y no me sale porque no doy con las ordener adecuadas:
    Lo que quiero hacer es bien simple. Tengo 2 cajas boxa y boxb. Bien pues quiero que boxa este alineado solo en rotación con boxb en los x y z por ejemplo.

    He probado con angleaxis, pero no lo consigo y me sale humo de la cabeza ya. Gracias.

  2. #2
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Alienar en rotación objetos

    Me imagino que te refieres a algo similar a lo que hace la herramienta alinear (alinear orientación), ¿no? En ese caso puedes utilizar una función como ésta:
    Código:
    Fn alignorientation obja objb axes:#{1,2,3} = (tlocal x = obja.transform, row1 tlocal y = obja.transform, row2 tlocal z = obja.transform, row3 tlocal w = obja.transform, row4 tif axes, numberset == 2 or axes, numberset == 3 do (t if axes[1] do x = objb.transform, row1 if axes[2] do y = objb.transform, row2 if axes[3] do z = objb.transform, row3 t if axes, numberset == 2 do (t if axes[1] and axes[2] then (t z = normalize (cross x y) ) else if axes[1] and axes[3] then (t y = normalize (cross z x) ) else if axes[2] and axes[3] do (t x = normalize (cross y z) ) ) t) tlocal (*.mat) = matrix3 x y z w tobja.transform = mat.
    )
    Por defecto alinea los 3 ejes del objeto a con el objeto b:
    Código:
    alignorientation $boxa $boxb
    Pero puedes alinear con dos ejes sólo (aunque se podría ampliar y hacerlo para 1 sólo eje):
    Código:
    alignorientation $boxa $boxb axes:#{1,3}
    En este caso alinea los ejes x (1) y z (3).

    Lo que pasa es que no sé que diferencia hay exactamente entre alinear con 2 o 3 ejes porque al fin y al cabo, los 3 ejes acaban siendo los mismos.

    De todas formas, la función tiene un inconveniente y es que, si el objeto b tiene escala, el objeto a también la heredara. Para evitar esto habría que utilizar algún otro método. Incluso se podría utilizar éste mismo, pero descomponiendo la matriz para de esta forma aislar la rotación de la escala. Lo que pasa es que descomponer una matriz no es algo trivial (y no parece que Maxscript tenga esa función).

    Para más información sobre matrices de transformación, puedes echarle un vistazo al tutorial que escribí hace un tiempo. Saludos.
    Última edición por HalfVector; 09-10-2006 a las 19:17

  3. #3
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,621

    Alienar en rotación objetos

    Probad algo como esto:
    Código:
    k=$box02, pues 
    $box02.rotation=$box01.rotation 
    $box02, pues 
    .
    Aquel que pregunta, es tonto un rato. Aquel que no pregunta, es tonto toda la vida.

  4. #4
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Alienar en rotación objetos

    Efectivamente, si se quiere alinear en dos o tres ejes (como dije, me parece que alinear en dos o tres ejes es lo mismo) ese método es mejor, puesto que te evita el problema de la escala. Pero si se quiere alinear en un solo eje habría que utilizar un método similar al que he puesto (aunque puede que existan más métodos). Saludos.

  5. #5
    Fecha de ingreso
    Feb 2005
    Mensajes
    2,231

    Alienar en rotación objetos

    Muchas gracias a los 2. Voy probarlo ahora mismo.

  6. #6
    Fecha de ingreso
    Aug 2005
    Mensajes
    166

    Wink Alienar en rotación objetos

    Porque no pruebas esto.
    $a.rotation, controller[1].value = $b.rotation, controller[1].value.
    $a.rotation, controller[3].value = $b.rotation, controller[3].value.

  7. #7
    Fecha de ingreso
    Feb 2005
    Mensajes
    2,231

    Alienar en rotación objetos

    Porque no pruebas esto.
    $a.rotation, controller[1].value = $b.rotation, controller[1].value.
    $a.rotation, controller[3].value = $b.rotation, controller[3].value.
    Probado, también funciona. Gracias. No sé cómo no se me ha ocurrido.

    Me siento un poco pardillo.

    Half voy a tener que mirarme mejor el script que has puesto porque así de entrada me cuesta pillarlo. Gracias.

  8. #8
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,621

    Alienar en rotación objetos

    El problema que veo con la función, half, es que reconstruye la matriz a base de xproduct, lo cual está muy bien, pero no es muy general. ¿y si la matriz original del objeto no es ortogonal? Por lo demás, creo que en la ayuda de Maxscript viene un ejemplo para hacer eso y es prácticamente calcado de lo que tú has puesto.

    Generalidades:
    En matrices ortogonales alinear 2 o 3 ejes es exactamente lo mismo, siempre que ambas tengan el mismo signo en el determinante.

    En matrices no ortogonales se pueden alinear 2 ejes si forman 90 grados, si no, solo uno, a menos que la matriz de referencia defina el mismo sistema de cords. Entonces o alineas 1 eje o los 3.

    Que alguien me corrija si me equivoco, por favor.
    Aquel que pregunta, es tonto un rato. Aquel que no pregunta, es tonto toda la vida.

  9. #9
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Alienar en rotación objetos

    La verdad es que, siempre di por hecho que las matrices de transformación en 3dsmax formaban una base ortogonal. ¿en qué casos eso no ocurre?
    Por ejemplo, aplicar un skew a través de una matriz sí que generaría una matriz degenerada, pero en 3dsmax el skew se aplica a través de un modificador, por lo que no se altera la matriz de transformación.

    Lo digo porque en todos los exporters de escena que he hecho, nunca se me pasó por la cabeza comprobar que la matriz de transformación de un objeto no fuera ortogonal. Y claro, si eso es así, para la próxima debería llevar más cuidado. Saludos.

    Editado: corregido ortonormal por ortogonal. Gracias Klópes.
    Última edición por HalfVector; 10-10-2006 a las 14:50

  10. #10
    Fecha de ingreso
    Jul 2005
    Mensajes
    7,953

    Alienar en rotación objetos

    No me parece serio que la matriz de un objeto no sea ortogonal, (no ortonormal, demos oportunidad al escalado), eso se carga la posibilidad de exportar una escena correctamente, al menos aprovechando el uso de instancias.
    ...y estaba superbueno.
    Y miré su perfil. Y vi que era amigo de Daniela. Puaf.


    Dos niñas en el parque

    no se elevará, nunca más

  11. #11
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Alienar en rotación objetos

    (No ortonormal, demos oportunidad al escalado).
    Exacto.

  12. #12
    Fecha de ingreso
    Sep 2006
    Mensajes
    73

    Alienar en rotación objetos

    Si usara:
    $box02.rotation=$box01.rotation. Pero cuando lo uso se me gira 90 grados en el eje local y cómo se hace para contrarrestar eso, y que queden bien alineados.

    Estoy trabajando en un match IK/FK logre hacer que se pongan en posición, pero quedan alineados como estaban y lo que quiero es realinearlos para que los controles queden bien orientados. Saludos.

  13. #13
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,621

    Alienar en rotación objetos

    Un ejemplo: Creamos una caja, en la vista top. Rotamos la caja, digamos 30 grados en el eje Z. Escalamos la caja, usando como sistema de cords.=view, sobre el eje x.

    Ya tienes una caja con una matriz no ortogonal.

    Comprobar con $.transform en el Listener.

    Ya sé que no es lo normal, y que estas cosas se deben evitar. Pero conste que digo deben, nadie obliga.
    Aquel que pregunta, es tonto un rato. Aquel que no pregunta, es tonto toda la vida.

  14. #14
    Fecha de ingreso
    Dec 2004
    Mensajes
    3,387

    Alienar en rotación objetos

    Alinear objetos en orientación es bastante sencillo, hace tiempo me tope con un problema que me llevo varios días, alinear solo el punto de pivote en orientación e un objeto a otro, tela.
    PromineoStudios

    Sin riesgos en la lucha, no hay gloria en la victoria

  15. #15
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Alienar en rotación objetos

    No lo he dicho antes, pero eliminar la escala de una matriz de transformación en 3dsmax es muy sencillo ya que max nos da la escala codificada en un Vector. Es tan simple como multiplicar la inversa de la escala por la diagonal principal de la matriz de transformación:
    Código:
    Fn removescale (*.mat) scale = (tlocal invsx = 1.0/scale.x tlocal invsy = 1.0/scale, y tlocal invsz = 1.0/scale, z tinvscalemat = scalematrix [invsx, invsy, invsz] treturn (invscalemat * mat).
    )
    Y luego, modificamos la función que puse unos mensajes más arriba para que la escala no afecte la operación:
    Código:
    Fn alignorientation obja objb axes:#{1,2,3} = (t- Eliminamos la escala de ambos objetos tlocal mata = removescale obja.transform obja.scale tlocal matb = removescale objb.transform objb.scale tlocal x = mata.row1 tlocal y = mata.row2 tlocal z = mata.row3 tlocal w = mata.row4 tif axes, numberset == 2 or axes, numberset == 3 do (t if axes[1] do x = matb.row1 if axes[2] do y = matb.row2 if axes[3] do z = matb.row3 t if axes, numberset == 2 do (t if axes[1] and axes[2] then (t z = normalize (cross x y) ) else if axes[1] and axes[3] then (t y = normalize (cross z x) ) else if axes[2] and axes[3] do (t x = normalize (cross y z) ) ) t) tlocal (*.mat) = matrix3 x y z w t- Volvemos a aplicar la escala tmat = (scalematrix obja.scale) * mat tobja.transform = mat.
    )
    Pero evidentemente, si queremos alinear en dos o tres ejes y siempre dando por hecho que la matriz es ortogonal, lo mejor es utilizar el método que ha puesto Nessito o juako (aunque éste en concreto me imagino que se ciñe a controladores de rotación de tipo Euler, ¿no?) saludos.
    Última edición por HalfVector; 11-10-2006 a las 16:22

  16. #16
    Fecha de ingreso
    Feb 2005
    Mensajes
    2,231

    Alienar en rotación objetos

    Que grande eres half. Tus respuestas son de lo mejor que hay y no es peloteo. Gracias a ti estamos aprendiendo mucho, lo pones todo super claro y ayuda mucho a los pardillos como un servidor. Tankiu bery match.

Temas similares

  1. Objetos no conservan su rotación
    Por blendernauta en el foro Programas de Diseño 3D y CAD
    Respuestas: 2
    : 30-08-2015, 19:37
  2. 3dsMax Problema rotación objetos
    Por Cova_Q en el foro Animación y Rigging
    Respuestas: 2
    : 19-03-2013, 16:38
  3. Problema para rotación de objetos en 3ds Max
    Por WushuShaolin en el foro Programas de Diseño 3D y CAD
    Respuestas: 4
    : 31-05-2010, 08:18
  4. Posicionar pivot y rotación de objetos
    Por Pacorson en el foro Modelado
    Respuestas: 8
    : 28-09-2009, 17:54
  5. Cómo acelerar la rotación de los objetos
    Por Maulen en el foro Programas de Diseño 3D y CAD
    Respuestas: 4
    : 14-01-2003, 12:28