Notifications
Clear all

[Closed] Extract Deltas For 3ds Max?

Hello,

I’ve been using Maya recently along with the Extract Deltas plug-in from Brave Rabbit which allows you to extract corrective meshes to be loaded into a blendShape node underneath a skinCluster and was wondering if there was something similar to it for 3ds Max? I know Skin Morph allows you to model on top of the Skin modifier but after using Extract Deltas, I would prefer to extract a mesh and load it into a Morpher modifier below Skin.

Thanks,
-Harry

2 Replies

I looked at that extractDeltas video and it seems to be the equivalent to Kees Rijnen’s MorphX2, which used to be a free/shareware/donationware/whatever plugin at (what was his site) www.Lumonix.com

Unfortunately Lumonix is no more and you get redirected to his ShaderFX site.

With it you could model morph corrections on a duplicate of the animated joint, and then select it as a morph, pretty much like extractDeltas.

There’s also Grant Adam’s surfaceMorph

http://rpmanager.com/plugins/SurfaceMorph.htm

but I haven’t used it so I don’t know if it allows the same workflow.

TC

Hello,

Thanks for the reply, I had heard of MorphX2 but not Surface Morph, it looks interesting but what I’m really after is a method to extract the difference between two meshes where one is skinned and the other is the corrected, modelled mesh.

I had a go at creating something myself based on the assumption that the positions of the resultant mesh’s vertices could be given as
theCorrectedVertPos[i] – theSkinVertPos[i] + theInitialVertPos[i]
where i loops over the number of vertices on the mesh and theInitialVertPos is the mesh in its original modelled state before rigging.

This turns out not to work for what I want, however it does work for generating fixer meshes for morph targets (correcting the appearance of, say, LCornerMouthUp and LCornerMouthOut).

It’s a basic script, I didn’t spend long on it so I didn’t include some necessary checks like the three meshes need to have equal vertex counts:


(
	global correctiveMorph
	try (destroyDialog correctiveMorph) catch()
	
	local theInitialMesh, theSkinMesh, theFixerMesh, theInitialVertPos = #(), theSkinVertPos = #(), theFixerVertPos = #()
	
	rollout correctiveMorph "Corrective Morph"
	(
		pickButton initialPBtn "Select Initial Mesh..." autoDisplay:true align:#center width:156
		pickButton skinPBtn "Select Posed Mesh..." autoDisplay:true align:#center width:156
		pickButton fixerPBtn "Select Fixer Mesh..." autoDisplay:true align:#center width:156
		button createBtn "Create Fixer Morph" align:#center width:156 enabled:false
		
		function PBtnFn =
		(
			if initialPBtn.object != undefined and skinPBtn.object != undefined and fixerPBtn.object != undefined then
				createBtn.enabled = true
			else
				createBtn.enabled = false
		)
		
		on initialPBtn picked obj do
		(
			theInitialMesh = snapshotAsMesh obj
			theInitialVertPos = for i in 1 to (getNumVerts theInitialMesh) collect (getVert theInitialMesh i)
			
			PBtnFn()
		)
		on skinPBtn picked obj do
		(
			theSkinMesh = snapshotAsMesh obj
			theSkinVertPos = for i in 1 to (getNumVerts theSkinMesh) collect (getVert theSkinMesh i)
			
			PBtnFn()
		)
		on fixerPBtn picked obj do
		(
			theFixerMesh = snapshotAsMesh obj
			theFixerVertPos = for i in 1 to (getNumVerts theFixerMesh) collect (getVert theFixerMesh i)
			
			PBtnFn()
		)
		
		on initialPBtn rightClick do
		(
			initialPBtn.object = undefined
			PBtnFn()
		)
		on skinPBtn rightClick do
		(
			skinPBtn.object = undefined
			PBtnFn()
		)
		on fixerPBtn rightClick do
		(
			fixerPBtn.object = undefined
			PBtnFn()
		)
		
		on createBtn pressed do
		(
			theObj = initialPBtn.object
			theFixerTarget = convertToMesh (copy theObj)
			for i in 1 to (getNumVerts theFixerTarget) do
				setVert theFixerTarget i (theFixerVertPos[i] - theSkinVertPos[i] + theInitialVertPos[i])
		)
	)
	
	createDialog correctiveMorph width:165
)

-Harry