Gracias Gracias:  0
Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 16

Tema: alienar en rotacion objetos

  1. #1
    Senior Member
    Fecha de ingreso
    Feb 2005
    Ubicación
    por ahi ando
    Mensajes
    2,235

    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 tonteria 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
    H = E + L
    Fecha de ingreso
    Mar 2004
    Ubicación
    Entre dos vectores
    Mensajes
    870

    Re: 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} = (
    	local x = objA.transform.row1
    	local y = objA.transform.row2
    	local z = objA.transform.row3
    	local w = objA.transform.row4
    
    	if axes.numberSet == 2 or axes.numberSet == 3 do (
    		if axes[1] do x = objB.transform.row1
    		if axes[2] do y = objB.transform.row2
    		if axes[3] do z = objB.transform.row3
    	
    		if axes.numberSet == 2 do (
    			if axes[1] and axes[2] then (
    				z = normalize (cross x y)
    			)
    			else if axes[1] and axes[3] then (
    				y = normalize (cross z x)
    			)
    			else if axes[2] and axes[3] do (
    				x = normalize (cross y z)
    			)
    		)
    	)
    	
    	local mat = Matrix3 x y z w
    	
    	objA.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é qué 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 20:17

  3. #3
    Senior Member
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,637

    Re: Alienar en rotación objetos

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

  4. #4
    H = E + L
    Fecha de ingreso
    Mar 2004
    Ubicación
    Entre dos vectores
    Mensajes
    870

    Re: 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
    Senior Member
    Fecha de ingreso
    Feb 2005
    Ubicación
    por ahi ando
    Mensajes
    2,235

    Re: Alienar en rotación objetos

    Muchas gracias a los 2.Voy probarlo ahora mismo.

  6. #6
    Senior Member Avatar de Crazy
    Fecha de ingreso
    Aug 2005
    Mensajes
    170

    Wink Re: 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
    Senior Member
    Fecha de ingreso
    Feb 2005
    Ubicación
    por ahi ando
    Mensajes
    2,235

    Re: Alienar en rotación objetos

    Cita Iniciado por Crazy
    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 se como 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
    Senior Member
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,637

    Re: 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 esta 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 tu 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 coords. 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
    H = E + L
    Fecha de ingreso
    Mar 2004
    Ubicación
    Entre dos vectores
    Mensajes
    870

    Re: Alienar en rotación objetos

    La verdad es que siempre dí por hecho que las matrices de transformación en MAX 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 MAX 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 15:50

  10. #10
    Moderador Avatar de Klópes
    Fecha de ingreso
    Jul 2005
    Ubicación
    Estuve el día que llovió en los Monegros
    Mensajes
    7,988

    Re: 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
    H = E + L
    Fecha de ingreso
    Mar 2004
    Ubicación
    Entre dos vectores
    Mensajes
    870

    Re: Alienar en rotación objetos

    Cita Iniciado por Klópes
    (no ortonormal, demos oportunidad al escalado )
    Exacto.

  12. #12
    Miembro
    Fecha de ingreso
    Sep 2006
    Ubicación
    Uruguay
    Mensajes
    73

    Re: 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 como se hace para contrarrestar eso, y que queden bien alineados.
    Estoy trabajando en un match ik/fque 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
    Senior Member
    Fecha de ingreso
    Apr 2005
    Mensajes
    1,637

    Re: 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 coords.=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
    reBorn Avatar de promineo
    Fecha de ingreso
    Dec 2004
    Ubicación
    Tenerife
    Mensajes
    3,402

    Re: Alienar en rotación objetos

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

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

  15. #15
    H = E + L
    Fecha de ingreso
    Mar 2004
    Ubicación
    Entre dos vectores
    Mensajes
    870

    Re: Alienar en rotación objetos

    No lo he dicho antes pero eliminar la escala de una matriz de transformación en MAX 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 = (
    
    	local invsx = 1.0/scale.x
    	local invsy = 1.0/scale.y
    	local invsz = 1.0/scale.z
    	
    	invScaleMat = scaleMatrix [invsx, invsy, invsz]
    	
    	return (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} = (
    
    	-- Eliminamos la escala de ambos objetos
    	local matA = removeScale objA.transform objA.scale
    	local matB = removeScale objB.transform objB.scale
    
    	local x = matA.row1
    	local y = matA.row2
    	local z = matA.row3
    	local w = matA.row4
    
    	if axes.numberSet == 2 or axes.numberSet == 3 do (
    		if axes[1] do x = matB.row1
    		if axes[2] do y = matB.row2
    		if axes[3] do z = matB.row3
    	
    		if axes.numberSet == 2 do (
    			if axes[1] and axes[2] then (
    				z = normalize (cross x y)
    			)
    			else if axes[1] and axes[3] then (
    				y = normalize (cross z x)
    			)
    			else if axes[2] and axes[3] do (
    				x = normalize (cross y z)
    			)
    		)
    	)
    	
    	local mat = Matrix3 x y z w
    	
    	-- Volvemos a aplicar la escala
    	mat = (scaleMatrix objA.scale) * mat
    	
    	objA.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 17:22

Página 1 de 2 12 ÚltimoÚltimo

Temas similares

  1. Blender Objetos no conservan su rotación.
    Por blendernauta en el foro Problemas con Programas
    Respuestas: 2
    Último mensaje: 30-08-2015, 20:37
  2. Problema rotacion objetos
    Por Cova_Q en el foro Animación y Rigging
    Respuestas: 2
    Último mensaje: 19-03-2013, 18:38
  3. Problema para rotacion de objetos en 3ds Max
    Por WushuShaolin en el foro Problemas con Programas
    Respuestas: 4
    Último mensaje: 31-05-2010, 09:18
  4. Posicionar Pivot y rotacion de objetos
    Por Pacorson en el foro Modelado
    Respuestas: 8
    Último mensaje: 28-09-2009, 18:54
  5. Cómo acelerar la rotación de los objetos
    Por Maulen en el foro Infografía General
    Respuestas: 4
    Último mensaje: 14-01-2003, 14:28

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