Desplazar sobre superficie
Buenas a todos, tengo la siguiente duda. Intento hacer que un dummie se desplace sobre la superficie de una esfera, parecido a lo que hace el surface constrains, pero que en vez de controlar su posición UV con los spinner del controlador, se mueva con la herramienta de transformación mover.
Espero haberme explicado bien.
Alguien me puede arrojar un halo de luz en el tema que me indique el camino a investar para poder resorverlo? Gracias.
Desplazar sobre superficie
Hay fórmulas y procesos para convertir un espacio UV en un espacio XYZ (encontré esto buscando por ahí):
https://www.foro3d.com/images/upload.../2010/06/3.png
https://www.foro3d.com/images/upload.../2010/06/4.png
Pero como después de probarlo así a lo bruto, los resultados no son lo que buscamos, se me ocurren dos maneras distintas (que funcionan):
1.- Ray casting.
A) no sé si conoces el concepto de Ray casting. Básicamente, tienes la esfera y un punto. Pues bien, Maxscript tiene funciones para lanzar un rayo desde la posición del punto a la de la esfera. La función ray necesita la posición inicial del objeto, y una dirección (que obtenemos restando las posiciones del punto y de la esfera):
Código:
oray = ray p1.position (SPH, position - P1.position)
B) ¿Qué hacemos con esto? Usar la función intersectray: dándole como argumentos de entrada la esfera y el rayo, te devuelve la posición en que ese rayo intersecta la esfera:
Código:
ointersect = intersectray SPH oray
C) y una de las propiedades de intersectray es .pos, que es la posición que buscas:
Código:
p2.position = ointersect, pos
Esto puedes ponerlo dentro de un script controller en p2, que es el punto que quieres que esté siempre sobre la superficie de la esfera. No olvides poner p1 y SPH (esfera) como variables (nodo, por ejemplo), porque de lo contrario la posición no se actualizara en tiempo real.
2.- Look At.
Esto es mucho más sencillo: si tienes una esfera de radio x, crea un hueso de esa longitud, y hazle un Look At al punto que vas a mover por ahí. Coloca el punto que quieres que esté sobre la esfera a esa distancia x del centro, y vincúlalo al hueso, o usa un position constraint al nub que se creó (así no tienes posible problemas por la torsión del hueso derivados del upnode).