![]() |
|
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 | ||
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
Hola.
Bueno, pues aquí estoy con un tutorial. Algo que tal vez os resulte útil en algún momento. Evidentemente eso dependerá de a qué os vayáis a dedicar. Evidentemente una persona que se dedica exclusivamente a modelar difícilmente se va a encontrar con estas cuestiones pero si uno tira por el camino de la animación/dinámicas, entonces es más que probable que llegue un momento que se tope con este tipo de cosas. Os aseguro que un programador de motores para videojuegos se topa con esto continuamente. Así que, ¿de qué diablos estoy hablando?. Pues se trata de una situación que ya comenté en el hilo que abrí hace unos días, donde explicaba cómo hacer que un objeto mirase a otro haciendo uso de script controllers (sin utilizar el "Look-At Constraint" que viene con MAX, evidentemente). El tema va de destripar la matriz de transformación de un objeto para así conocerla mejor y de esta forma saber qué cosas podemos hacer con ella (¡no seáis mal pensados!. ¿Os imagináis montándoos un rollito con una matriz de transformación?. ¡Qué freaky!). En este caso, como ejemplo, crearé un script controller que hará que un objeto siga un path pero sin hacer uso del "Path Constraint" de MAX. Además de seguir el path, el objeto variará su orientación para que mire en la dirección del desplazamiento. O sea, como si activarais la opción "Follow" del "Path Constraint". Pero antes de pasar a comentar el código del "script controller", voy a hacer una breve introducción a las matrices de transformación de un objeto en MAX. Matrices de transformación. Todo objeto en MAX tiene una matriz de transformación asignada que indica su posición, rotación y escalado. Por ejemplo, cread un cubo en la vista "Perspective" y mantenedlo seleccionado. Entonces abrid el MAXScript Listener (tecla F11) y escribid: Código:
$.transform Código:
(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0]) Código:
[1,0,0] [0,1,0] [0,0,1] [0,0,0] En cualquier caso ésto no era lo que os quería explicar. Lo que quería explicar es el significado de cada fila de la matriz que será lo que nos interese para resolver el problema de que un objeto mire hacia una dirección determinada. Así que yendo al grano, la primera fila de la matriz es el eje local X o vector "right" que indica la orientación del objeto en el eje X de nuestro mundo 3D. Luego tenemos la segunda fila que es el eje local Y o vector "up" que indica la orientación del objeto en el eje Y de nuestro mundo 3D. Casi para terminar, la tercera fila indica el eje local Z o vector "look" o "view" que indica la orientación del objeto en el eje Z de nuestro mundo 3D. ¡Finalmente! tenemos la cuarta fila que indica la posición de nuestro objeto relativa al origen de coordenadas de nuestro mundo 3D. Reescribo la matriz para que lo veáis mejor: Código:
[right.x right.y right.z] [up.x up.y up.z] [look.x look.y look.z] [pos.x pos.y pos.z] Ahora, si seleccionáis el cubo, veréis dibujados los ejes X, Y y Z en forma de flechas. ¡Pero estos ejes no son los ejes locales del cubo sino que son los ejes alineados con los ejes de nuestro mundo 3D!. Para ver los ejes locales que nos dice nuestra matriz de transformación, pulsad el botón derecho del ratón mientras mantenéis pulsada la tecla ALT. Entonces os aparecerá un cuadro desplegable donde tendréis que escoger la opción "Local". De esta forma sí que estaréis visualizando los eje locales del cubo (right, up, look) que son los que nos indica la matriz de transformación, como ya he dicho. Pero un momento, ¡los ejes son iguales que antes de activar el sistema de coordenadas "Local"!. Claro, esto es porque el cubo se crea inicialmente con sus ejes alineados con los ejes de nuestro mundo 3D. Haced una cosa, rotad el cubo 90º en el eje X. Ahora haced lo mismo que antes para poner el sistema de coordenadas en modo "Local". Ahora sí veréis cómo el eje local Y apunta hacia arriba (eje "global" Z) y el eje local Z apunta hacía "fuera de la pantalla", es decir, el eje "global" -Y. Evidentemente el eje X no cambia ya que ha sido el eje de rotación que hemos utilizado. Ahora, teniendo aún seleccionado el cubo, volved al "MAXScript Listener" y volved a ejecutar la orden: Código:
$.transform Código:
(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,0,0]) Código:
[1, 0,0] [0, 0,1] [0,-1,0] [0, 0,0] Ni que decir tiene que si movéis el cubo a otra posición y volvéis a mirar la matriz de transformación, observaréis cómo la fila cuarta de la matriz ha variado y refleja la nueva posición del cubo. Bueno, creo que con esto ya es suficiente para que entendáis el código del script controller. Script controller :: Follow the Path! Sin más preámbulos, aquí tenéis el código. ¡Hala, a palo seco!. Código:
epsilon = 0.0001 position = lengthInterp $Line01 NT tangent = lengthTangent $Line01 NT up = [0,0,1] cosine = dot tangent up if ( cosine > -epsilon and cosine < epsilon ) do up = [0,1,0] right = normalize (cross tangent up) up = cross tangent right matrix3 right up tangent position Código:
epsilon = 0.0001 Cita:
Cita:
Pasamos a la siguiente línea: Código:
position = lengthInterp $Line01 NT Pasamos de línea: Código:
tangent = lengthTangent $Line01 NT Empezamos con el vector "up": Código:
up = [0,0,1] Código:
cosine = dot tangent up Código:
if ( cosine > -epsilon and cosine < epsilon ) do up = [0,1,0] Código:
right = normalize (cross tangent up) En este momento donde voy a explicar por qué hice la comprobación de que el ángulo formado por los vectores "tangent" y "up" no fuera 0. La explicación es bien sencilla. Imaginad que nuestro vector "tangent" hubiera valido [0,0,1] que es precisamente el primer valor que hemos asignado a "up". Ahora hacemos el producto vectorial de ambos vectores. Podéis comprobarlo vosotros mismo escribiendo y ejecutando la siguiente línea en el "MAXScript Listener": Código:
cross [0,0,1] [0,0,1] Código:
cross [0,0,1] [0,1,0] Pasamos línea: Código:
up = cross tangent right ¡Y finalmente llegamos al final!: Código:
matrix3 right up tangent position Código:
[right.x right.y right.z] [up.x up.y up.z] [look.x look.y look.z] [pos.x pos.y pos.z] Código:
[right.x right.y right.z] [up.x up.y up.z] [tangent.x tangent.y tangent.z] [position.x position.y position.z] Adjunto una escena de prueba y este mismo mensaje en formato de texto. Para ver el script controller no tenéis más que seleccionar el cono, ir a la pestaña "Motion", y en la lista que hay, hacer click con el botón derecho del ratón sobre la única entrada que hay ("Transform: Transform Script") y seleccionar "Properties". De esta forma os aparecerá el cuadro de diálogo "Script Controller" donde podéis ver el código del controlador. En fin, espero que ésto os haya resultado de utilidad. Thanks for watching!. Última edición por 3dpoder fecha: Hace 2 Días a las 09:18. |
||
|
|
|
| Enlaces patrocinados |
|
|
#2 |
|
p a l e t o
Fecha de Ingreso: abril-2002
Ubicación: Granada
Mensajes: 13,514
|
Esta noche ya tengo qué estudiar
|
|
|
|
|
|
#3 |
|
Odio donde estoy
Fecha de Ingreso: febrero-2005
Ubicación: Ontinyent, Valencia, España, Europa, La tierra...
Mensajes: 1,191
|
Iker, creo que esto tendría que ser fijo
Magnífico. Genial, aunque me queda mucho que aprender de max antes de meterme a maxscript, aunque nunca está de mas. ![]()
__________________
"Si tienes un sueño, es que existe el tiempo para realizarlo" |
|
|
|
|
|
#4 |
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
Muchas gracias.
Ni que decir tiene que esto no es un tutorial básico de MAXScript sino que es un tema relativamente avanzado que tiene mucho de problema matemático. Lo digo para que no os desaniméis si no lo entendéis. MAXScript se puede utilizar para muchas cosas sin llegar a estos extremos. Saludos. |
|
|
|
|
|
#5 |
|
Senior Member
|
Espectacular!!! Muchas gracias!!
__________________
"nos queda la suerte, que si se balancea un poco, nos puede tocar" E. Bunbury |
|
|
|
|
|
#6 |
|
Senior Member
|
No creo que me meta con el MaxScript, lo dejaremos por el momento. Pero le he estado echando un vistazo al tutorial que preparaste y te agradezco el enorme esfuerzo que hay detrás de éste.
Gracias y un saludo.
__________________
:: Ningun tonto se queja de serlo; no les debe de ir tan mal :: |
|
|
|
|
|
#7 |
|
just another monkey
|
Gracias, lo voy a leer con calma a ver si logro seguirlo, para maxscript no hay mucho (aparte de la ayuda de max claro) y estos aportes son muy valiosos
Gracias Edito: Acabo de darle una primera leída y enhorabuena!, eres un buen profesor, está tan bien explicado que hasta yo lo entiendo
__________________
Blog::Demo Reel '07 ____________________ "Debes practicar hasta que lo dificil resulte fácil, luego practica hasta que lo fácil resulte hermoso" Stephen Covey
Última edición por Cesar Saez fecha: 28 dic 2005 a las 15:44. |
|
|
|
|
|
#8 |
|
Sexador de humanos
Fecha de Ingreso: junio-2003
Ubicación: Castellón
Mensajes: 11,279
|
Podrías hacer cosillas para Blender, que para Max ya hay mucha gente haciendo
|
|
|
|
|
|
#9 |
|
p a l e t o
Fecha de Ingreso: abril-2002
Ubicación: Granada
Mensajes: 13,514
|
Es que hacerlo en MAX es más productivo y satisfactorio
|
|
|
|
|
|
#10 | ||
|
H = E + L
Fecha de Ingreso: marzo-2004
Ubicación: Entre dos vectores
Mensajes: 877
|
Cita:
Cita:
Pero en fín, quién sabe, a lo mejor empiezo a desarrollar en Blender y resulta que me gusta. |
||
|
|
|
|
|
#11 | |
|
El cabreador
Fecha de Ingreso: octubre-2002
Mensajes: 4,387
|
Muy bueno si señor, se agradece un monton...y muy buena explicación.
Cita:
Saluditos. |
|
|
|
|
|
|
#12 |
|
Sexador de humanos
Fecha de Ingreso: junio-2003
Ubicación: Castellón
Mensajes: 11,279
|
Cuando aprendas python, te preguntarás por qué llaman "lenguajes de programación" a todas esas otras cosas
|
|
|
|
|
|
#13 |
|
Senior Member
Fecha de Ingreso: abril-2005
Mensajes: 179
|
hola quisiera saber como hacer para que en max script si yo doy una serie de ordenes a objetos de una escena, por ejm que el box "a" se mueva, el box "b" se le asigne un material y el box "c" se le asigne un uvw map en el caso que en la escena no este el box "a" quiero que el script siga con las otras ordenes que le habia asignado como hago? gracias
|
|
|
|
|
|
#14 |
|
12 meses, 12 pagas
Fecha de Ingreso: julio-2005
Ubicación: Bajo el sol monegrino
Mensajes: 5,017
|
Ah, no, nada. Sólo quería salir en este hilo.
__________________
Y sus discípulos le preguntaron, diciendo: ¿Qué significa esta parábola? Y él dijo: A vosotros os es dado conocer los misterios del reino de Dios; pero a los otros por parábolas, para que viendo no vean, y oyendo no entiendan. Mateo 8, 9-10 |
|
|
|
|
|
#15 |
|
reBorn
Fecha de Ingreso: diciembre-2004
Ubicación: Tenerife
Mensajes: 2,895
|
tio Half te quiero, te sales. snif snif
|
|
|
|
![]() |
| Etiquetas Identificativas |
| matrices, maxscript, transformacion, tutorial |
| Usuarios activos actualmente viendo este tema: 1 (0 miembros y 1 visitantes) | |
| Herramientas | |
|