XM Magdalena 3D print, GGeorgy (3D)
LC #42 Pipers Alley

View Full Version : quickly add points

12-20-2010, 11:45 PM
hello everyone. i'm a lighting artist so my background isnt in computer programming - i hope you'll bare with me :)

I'm trying to come up with a way to efficicenty add points to models so they can have the same number of verticies and be used for blendshapes (this is just one part of a larger task)

i've come up with a way but it is dreadfully slow. right now i'm doing comparison's inside a while loop to determine the number of verticies - then performing a "polyPoke" on faces untill the vert count matches up. this takes FOREVER to run and this is just with two objects of similar topology - im potentially looking at objects with a million vert difference later on.

any suggestions for a quicker way? I've thought about writing a function that will generate different split polygon commands (only dividng one edge) - maybe that will be faster?

anyways, heres the code i wrote ( formatting is correct - pasting not a good idea..):

import pymel.core as pm
import random

def subdivideRandomFace(obj):
randFaceNum = str(random.randint(0,pm.polyEvaluate(obj, v = True)))
randFace = obj + ".f["+randFaceNum+"]"
pm.polyPoke(randFace, ch = 0)

leadObj = pm.ls(sl = True)[0]
compareObj = pm.ls(sl = True)[1]

leadVertNum = pm.polyEvaluate(leadObj, v =True)
compareVertNum = pm.polyEvaluate(compareObj, v = True)

while leadVertNum != compareVertNum:
leadVertNum = pm.polyEvaluate(leadObj, v =True)
compareVertNum = pm.polyEvaluate(compareObj, v = True)
if leadVertNum == compareVertNum:
print "same number of verticies"
print "lead object vert = ", leadVertNum, " and compare object vert = ", compareVertNum
print "different number of verticies"
print "lead object vert = ", leadVertNum, " and compare object vert = ", compareVertNum

12-21-2010, 12:14 AM

out of curiosity, does this actually work for you, once both objects share the same vert count? - i would have assumed it wouldn't, since the vertex order wouldn't be the same, but im not sure of the context.

12-21-2010, 12:55 AM
I'm with Matt on this one, but either way, doing the same history operation multiple times in a loop on individual components is far slower and less efficient then performing ONE history opreration on a list of components.

try to make your loop simply construct the items to act upon, and then at the end simply act on them all simultaneously (once).


12-21-2010, 02:36 AM
matt your probably right - only one way to see..

great tip guys !!! thx !

12-21-2010, 06:22 PM

this takes an average of 18 seconds for a difference of 1.6 million vertices. (10 seconds for 1.1 million)
my computer died when i tried it on 6 million :(

int $undoState = 0;
if(`undoInfo -q -state`)
$undoState = 1; undoInfo -state 0;

$startTime = `timerX`;
string $sel[] = `ls -sl`;
int $src[] = `polyEvaluate -vertex $sel[0]`;
int $tgt[] = `polyEvaluate -vertex $sel[1]`;
int $faces[] = `polyEvaluate -face $sel[1]`;
int $i = $src[0] - $tgt[0];

if($i > $faces[0])
polyPoke -ch 0 ($sel[1] + ".f[0:" + ($faces[0]-1) + "]");
int $count[] = `polyEvaluate -vertex $sel[1]`;
$i -= ($count[0] - $tgt[0]);
polyPoke -ch 0 ($sel[1] + ".f[0:" + ($i-1) + "]");

$tgt = `polyEvaluate -vertex $sel[1]`;
$faces = `polyEvaluate -face $sel[1]`;

$totalTime = `timerX -startTime $startTime`;
print ("Total Time: "+$totalTime+"\n");
{ warning("pick source, then target.\n"); }

undoInfo -state 1;

CGTalk Moderation
12-21-2010, 06:22 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.