Accessing Objects Pivot


#1

At work, when something like trees need to get scattered and have motion added, we make a layout of the trees using a proxy version and then instance point caches or alembics to these proxies inheriting the transforms also. In order to scatter though, we need to create points at the pivots of each of these proxy trees and then instance in Frost. It is very easy to create the points in Thinking Particles or PFlow, and it’s possible to instance without caching by using a PRT Source, but is there a way to do something like this without going through a different particle system first?


#2

Here is a quick and dirty MacroScript. Feel free to add a UI…

macroScript ObjectTM2PRT category:"Krakatoa Particle Stream" 
(
	on isEnabled return selection.count > 0

	on execute do
	(
		local theFile = getSaveFileName filename:"ObjectTMs_" types:"Frantic Films Particle File (*.PRT)|*.prt|Comma Separated Values File (*.CSV)|*.csv" 
		if theFile != undefined do
		(
			progressStart "Saving Objects To PRT..."
			local startTime = animationrange.start.frame
			local endTime = animationrange.end.frame 
			if not (querybox "Click [Yes] to save the current Animation Segment.\nClick [No] to save only the current frame." title:"ObjectTM2PRT - Save Animation?") do 
				startTime = endTime = currentTime.frame
			local theObjects = selection as array
			for t = startTime to endTime do
			(
				at time t
				(
					local theFrameFile = FranticParticles.ReplaceSequenceNumber theFile t
					local theStream =  FranticParticles.CreateParticleOStream theFrameFile #("Position float32[3]", "Orientation float16[4]")
					for o in theObjects do
					(
						local theQuat = o.rotation
						theStream.writeParticle #(o.position, (Point4 theQuat.x theQuat.y theQuat.z theQuat.w) ) 
					)
					theStream.close()
					if not (progressUpdate (100.0*t/(endTime-startTime))) do exit
				)
			)	
			progressEnd()
			if (querybox "Create a PRT Loader and load the saved file?" title:"ObjectTM2PRT - PRT Loader?") do
			(
				local newPRTLoader = KrakatoaPRTLoader name:(uniquename "PRT_Loader_ObjectPositions_")
				newPRTLoader.fileList = #(FranticParticles.ReplaceSequenceNumber theFile startTime)
				newPRTLoader.fileListFlags = #(3)
				newPRTLoader.percentViewport = 100
				newPRTLoader.viewportParticleDisplayMode = 2
				select newPRTLoader
				max modify mode
			)
		)	
	)
)
  • Run the script and assign to a toolbar, menu, QuadMenu or keyboard shortcut.
  • Select one or more scene objects.
  • Launch the script.
  • Answer with Yes for animation range saving, No for current frame only.
  • Wait for the saving to finish, or cancel the progress.
  • Answer with Yes to create a PRT Loader, No for no PRT Loader (e.g. when updating a file where the PRT Loader already exists).
  • Note that Frost uses Uniform Scaling only, so I have not added Scale export yet, just Position and Orientation.