![]() |
|
Bienvenido a Foros 3DPoder.. Usted esta viendo este foro como invitado, no esta registrado todavía, lo que limita su visión del foro. Si quiere unirse gratis a la mayor comunidad del diseño gráfico de habla hispana, tener acceso a publicar y responder mensajes, tener mensajes privados con otros miembros(PM), responder encuestas, publicar sus imágenes para que las vea el resto del mundo, tener acceso a los video_tutoriales, y muchas cosas más, no lo dude. Registrarse es rápido, simple y gratuito, agregate hoy a la mayor comunidad 3D de habla hispana! ! Si usted tiene algún problema con su registro, por favor , díganoslo aquí.
|
![]() ¿Te ayudo? |
|
|||||||
|
|
|
|
#1 |
|
Senior Member
Fecha de Ingreso: febrero-2005
Ubicación: politecnico/3D,3D/politecnico
Mensajes: 1,970
|
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 rotacion 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 |
|
|
|
| Enlaces patrocinados |
|
|
#2 |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
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
)
Código:
alignOrientation $BoxA $BoxB Código:
alignOrientation $BoxA $BoxB axes:#{1,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 heredará. 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 fecha: 09 oct 2006 a las 13:17. |
|
|
|
|
|
#3 |
|
Senior Member
Fecha de Ingreso: abril-2005
Ubicación: Madrid
Mensajes: 674
|
probad algo como esto:
Código:
kk=$box02.pos $box02.rotation=$box01.rotation $box02.pos=kk
__________________
Aquel que pregunta, es tonto un rato. Aquel que no pregunta, es tonto toda la vida. |
|
|
|
|
|
#4 |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
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 |
|
Senior Member
Fecha de Ingreso: febrero-2005
Ubicación: politecnico/3D,3D/politecnico
Mensajes: 1,970
|
Muchas gracias a los 2.Voy probarlo ahora mismo.
|
|
|
|
|
|
#6 |
|
Miembro
Fecha de Ingreso: agosto-2005
Mensajes: 72
|
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 | |
|
Senior Member
Fecha de Ingreso: febrero-2005
Ubicación: politecnico/3D,3D/politecnico
Mensajes: 1,970
|
Cita:
Me siento un poco pardillo Half voy a tener que mirarme mejor el script que has puesto porque asi de entrada me cuesta pillarlo.Gracias. |
|
|
|
|
|
|
#8 |
|
Senior Member
Fecha de Ingreso: abril-2005
Ubicación: Madrid
Mensajes: 674
|
El problema que veo con la funcion, 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 demas, creo que en la ayuda de MAXScript viene un ejemplo para hacer eso y es practicamente 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 |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
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 fecha: 10 oct 2006 a las 08:50. |
|
|
|
|
|
#10 |
|
12 meses, 12 pagas
Fecha de Ingreso: julio-2005
Ubicación: Bajo el sol monegrino
Mensajes: 5,093
|
No me parece serio que la matriz de un objeto no sea ortogonal, (no ortonormal, demos oportunidad al escalado
![]()
__________________
La clave es coger la vida por los cojones, apurar cada día como si fuera el último. Hubert Farnsworth |
|
|
|
|
|
#11 | |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
Cita:
|
|
|
|
|
|
|
#12 |
|
Miembro
Fecha de Ingreso: septiembre-2006
Ubicación: Uruguay
Mensajes: 72
|
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/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 |
|
Senior Member
Fecha de Ingreso: abril-2005
Ubicación: Madrid
Mensajes: 674
|
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 |
|
reBorn
Fecha de Ingreso: diciembre-2004
Ubicación: Tenerife
Mensajes: 2,949
|
Alinear objetos en orientacion es bastante sencillo, hace tiempo me tope con un problema que me llevo varios dias, alinear solo el punto de pivote en orientacion e un objeto a otro, telita...
|
|
|
|
|
|
#15 |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
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) ) 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
)
Saludos. Última edición por HalfVector fecha: 11 oct 2006 a las 10:22. |
|
|
|
![]() |
| Etiquetas Identificativas |
| alienar, objetos, rotacion |
| Usuarios activos actualmente viendo este tema: 1 (0 miembros y 1 visitantes) | |
| Herramientas | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Trucos y Tips sobre Blender | Mars Attacks | Infografía General | 60 | 20 jun 2008 14:45 |
| Ayuda para crear Objetos en Java 3D | luquini13 | Problemas con Programas | 1 | 01 jun 2006 11:48 |
| Vray y animación con objetos en movimiento | sssjosue | Render, Iluminación y Cámaras | 1 | 15 mar 2006 06:28 |
| canviar eje de rotacion en la animacion | cuaresma | Animación y Rigging | 0 | 14 ene 2006 17:42 |
| Manual 3dsMax | 3dpoder | 3DStudio Max | 0 | 13 ago 2005 09:45 |
|
|