Bezier curves mediante maxscript

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

Moderadores: David, Tutores

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

Bezier curves mediante maxscript

Mensaje por DavidAlvarez »

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

Mensaje por ikerJ »

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

Mensaje por DavidAlvarez »

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

Mensaje por ikerJ »

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

Mensaje por DavidAlvarez »

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 $

Responder

Volver a “Convocatorias 2010”