Matt Leishman

05-08-2003, 05:21 PM

Hello All!!

I come to this forum of maya mel guru's in hopes of a solution. I'm not the mel scripter I need to be so I am asking for your help.

I have found this script on highend3d that does exactly what I want it to do, except for the fact that it only works with nurbs cv's. I need the script to do what it is supposed to do, but do it with poly points. Can anyone point me in the right direction in terms of what I need to do to edit this script so that it works with poly points instead of nurbs cv's? Thanks in advance for any help y'all can give.

I hope this isn't too inappropriate to post this script here, if it is please let me know and I'll find a more appropriate means of getting an answer to my inquiry.

// Select three CVs first as pins

// any other cvs selected after the first two will be moved

// onto the plane defined by the pins

// useful for smoothing corners where patches meet

// by Matthew Gidney 2000

//

global proc mPlanarCvs() {

string $parents[] = `filterExpand -ex true -sm 28 `;

int $numberOfCvs = `size $parents`;

if ( $numberOfCvs < 4) {

print("mPlanarCvs(): You must pick at least 4 Cv's to align \n");

return;

}

float $CVPin1[3] = `xform -q -worldSpace -t $parents[0]`;

float $CVPin2[3] = `xform -q -worldSpace -t $parents[1]`;

float $CVPin3[3] = `xform -q -worldSpace -t $parents[2]`;

// first define the plane by its normal

vector $pin1To2 = <<($CVPin1[0]-$CVPin2[0]),($CVPin1[1]-$CVPin2[1]),($CVPin1[2]-$CVPin2[2])>>;

vector $pin1To3 = <<($CVPin1[0]-$CVPin3[0]),($CVPin1[1]-$CVPin3[1]),($CVPin1[2]-$CVPin3[2])>>;

vector $normal = cross ($pin1To2,$pin1To3);

float $magNormal = mag ($normal);

vector $unitNormal = unit ($normal);

// next resolve the points onto the plane via the normal

for ($cnt = 3; $cnt < ($numberOfCvs); $cnt++) {

float $point[3] = `xform -q -worldSpace -t $parents[$cnt]`;

vector $pointToPin1 = <<($point[0]-$CVPin1[0]),($point[1]-$CVPin1[1]),($point[2]-$CVPin1[2])>>;

float $magPointToPin1 = mag ($pointToPin1);

float $dotProduct = dot ( $normal,$pointToPin1);

vector $moveVectorRel = -1.0 * $unitNormal * ($dotProduct / $magNormal);

xform -worldSpace -r -t ($moveVectorRel.x) ($moveVectorRel.y) ($moveVectorRel.z) $parents[$cnt];

}

}

I come to this forum of maya mel guru's in hopes of a solution. I'm not the mel scripter I need to be so I am asking for your help.

I have found this script on highend3d that does exactly what I want it to do, except for the fact that it only works with nurbs cv's. I need the script to do what it is supposed to do, but do it with poly points. Can anyone point me in the right direction in terms of what I need to do to edit this script so that it works with poly points instead of nurbs cv's? Thanks in advance for any help y'all can give.

I hope this isn't too inappropriate to post this script here, if it is please let me know and I'll find a more appropriate means of getting an answer to my inquiry.

// Select three CVs first as pins

// any other cvs selected after the first two will be moved

// onto the plane defined by the pins

// useful for smoothing corners where patches meet

// by Matthew Gidney 2000

//

global proc mPlanarCvs() {

string $parents[] = `filterExpand -ex true -sm 28 `;

int $numberOfCvs = `size $parents`;

if ( $numberOfCvs < 4) {

print("mPlanarCvs(): You must pick at least 4 Cv's to align \n");

return;

}

float $CVPin1[3] = `xform -q -worldSpace -t $parents[0]`;

float $CVPin2[3] = `xform -q -worldSpace -t $parents[1]`;

float $CVPin3[3] = `xform -q -worldSpace -t $parents[2]`;

// first define the plane by its normal

vector $pin1To2 = <<($CVPin1[0]-$CVPin2[0]),($CVPin1[1]-$CVPin2[1]),($CVPin1[2]-$CVPin2[2])>>;

vector $pin1To3 = <<($CVPin1[0]-$CVPin3[0]),($CVPin1[1]-$CVPin3[1]),($CVPin1[2]-$CVPin3[2])>>;

vector $normal = cross ($pin1To2,$pin1To3);

float $magNormal = mag ($normal);

vector $unitNormal = unit ($normal);

// next resolve the points onto the plane via the normal

for ($cnt = 3; $cnt < ($numberOfCvs); $cnt++) {

float $point[3] = `xform -q -worldSpace -t $parents[$cnt]`;

vector $pointToPin1 = <<($point[0]-$CVPin1[0]),($point[1]-$CVPin1[1]),($point[2]-$CVPin1[2])>>;

float $magPointToPin1 = mag ($pointToPin1);

float $dotProduct = dot ( $normal,$pointToPin1);

vector $moveVectorRel = -1.0 * $unitNormal * ($dotProduct / $magNormal);

xform -worldSpace -r -t ($moveVectorRel.x) ($moveVectorRel.y) ($moveVectorRel.z) $parents[$cnt];

}

}