Bezier curves mediante maxscript

Mensajes de los cursos de junio y octubre del año 2010.

Moderadores: David, Tutores

DavidAlvarez
Junior
Junior
Mensajes: 25
Registrado: Mié Oct 06, 2010 10:33 am

Bezier curves mediante maxscript

Mensajepor DavidAlvarez » Lun Nov 29, 2010 3:02 am

Hola tengo una duda, en principio para la columna como para los twist estoy generando una spline mediante maxscript con un codigo como el siguiente

Código: Seleccionar todo

--Creo ik Spline ss= line() ss = SplineShape pos:ListaControles[1].pos -- posiciono la spline -- añado nuevos elementos a la spline que de momento estaba vacia addNewSpline ss -- añado los puntos necesarios for i=1 to listaControles.count do ( addKnot ss 1 #smooth #curve listacontroles[i].pos ) updateShape ss -- actualizo la spline ss.name = "C_mario_Rig"+ substrings[3] +"_" +"SpineSpline"+ "_SH" -- definio SplineIKcontrol myIkControl = Spline_IK_Control() myIkControl.box = ON -- myIkControl.helper_axistripod = on myIkControl.helper_size = (distance ListaControles[1].pos ListaControles[2].pos/1) -- myIkControl.helper_list = listaControles myIkControl.linkTypes = 2 -- se lo aplico al spline addmodifier ss myIkControl ss.spline_ik_control.createHelper (ss.spline_ik_control.getKnotCount()) -- redefino los helpers creados TwistHelper_list = #() for i = 1 to ss.spline_ik_control.getKnotCount() do ( twistHelper = ss.spline_ik_control.helper_list[i] -- voy identificando cada elemento de la lista insertItem twistHelper TwistHelper_list i twistHelper.name = "C_mario_Rig_"+ substrings[3] +"_" +"twistHelper"+ "0"+ i as string + "_DH" -- voy renombrandolos twistHelper.transform = listaControles[i].transform --recoloco helpers twistHelper.parent = ControlSpine_list[i] )
Mi pregunta es si alguien sabe como generar una curva pero en este caso bezier mediante maxscript, he estado buscando info al respecto y de momento no encontré nada.

Un saludo

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Re: Bezier curves mediante maxscript

Mensajepor ikerJ » Lun Nov 29, 2010 2:16 pm

Luego lo miro mejor en casa, pero por lo pronto...

Código: Seleccionar todo

addKnot <shape> <spline_index_integer> \ ( #smooth | #corner | #bezier | #bezierCorner ) \ ( #curve | #line ) <position_point3> \ [invec_point3 outvec_point3] \ [where_integer] Adds a new knot (control point) to the indexed spline and returns an integer reflecting the index of the newly added knot. The 3rd argument specifies the type of the knot, the 4th specifies the type of the segment leaving the knot. The 5th specifies the coordinates for the new point (given in the current working coordinate system). If the knot type is bezier or bezierCorner, you must give the in-vector and out-vector handle coordinates as the 6th and 7th arguments. In the same way as splines are indexed in a shape, knots are indexed in a spline. The optional last argument lets you specify where in the knot order the new knot is to be inserted, defaulting to the end of the spline if you leave this argument off.

DavidAlvarez
Junior
Junior
Mensajes: 25
Registrado: Mié Oct 06, 2010 10:33 am

Re: Bezier curves mediante maxscript

Mensajepor DavidAlvarez » Lun Nov 29, 2010 4:20 pm

Vale, me he explicado mal Iker, me refiero a la curva nurb que tu implementabas para una de las columnas. Perdon por la confusión.

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Re: Bezier curves mediante maxscript

Mensajepor ikerJ » Lun Nov 29, 2010 10:19 pm

Me costó bastante en su día dar con una función para poder crear una curva NURBS a partir de una serie de puntos dados. Espero que te sirva:

Código: Seleccionar todo

fn drawNurbsCurve thePoints = ( -- if thePoints.count == 5 do ( -- create an empty NURBSSet object nset = NURBSSet () -- create a new NURBSCVCurve and set the knots and CVs c = NURBSCVCurve name:"CV Curve" order:5 numCVs:5 numKnots:10 for k in 1 to 5 do ( setKnot c k 0; setKnot c (k+5) 1 ) cv = NURBSControlVertex thePoints[1].pos setCV c 1 cv cv.pos = thePoints[2].pos setCV c 2 cv cv.pos = thePoints[3].pos setCV c 3 cv cv.pos = thePoints[4].pos setCV c 4 cv cv.pos = thePoints[5].pos setCV c 5 cv -- add the NURBSCVCurve object to the set appendObject nset c -- create the NURBS object from the NURBSSet n = NURBSNode nset name:"nurbs01" pos:[0,0,0] return n ) )
Esta función crea una curva con 5 'CVs', que corresponde a un 'vértice-control' por cada punto seleccionado. Si quieres más o menos 'controles', cambia los valores que son 5 por lo que necesites, y haz que el valor de numKnots sea el doble del valor que escogiste.

Debería funcionar :)

DavidAlvarez
Junior
Junior
Mensajes: 25
Registrado: Mié Oct 06, 2010 10:33 am

Re: Bezier curves mediante maxscript

Mensajepor DavidAlvarez » Mié Dic 08, 2010 9:18 pm

Gracias Iker, por fin me he podido mirar esto con mas detalle, voy a ver si puedo integrarlo dentro de mi script. De momento así ha quedado para que funcione con un numero variable de puntos

Código: Seleccionar todo

fn drawNurbsCurve thePoints = ( ( nPuntos = thepoints.count -- create an empty NURBSSet object nset = NURBSSet () -- create a new NURBSCVCurve and set the knots and CVs c = NURBSCVCurve name:"CV Curve" order:nPuntos numCVs:nPuntos numKnots:(nPuntos*2) for k in 1 to nPuntos do ( setKnot c k 0; setKnot c (k+nPuntos) 1 ) for i = 1 to nPuntos do (cv = NURBSControlVertex thePoints[i].pos ; setCV c i cv) -- add the NURBSCVCurve object to the set appendObject nset c -- create the NURBS object from the NURBSSet n = NURBSNode nset name:"nurbs01" pos:[0,0,0] return n ) ) drawnurbscurve $


Volver a “Convocatorias 2010”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado