Jump to content

Duplicating RBD objects in SOP Solver

John Svensson

Recommended Posts



I'm trying to recreate something like the duplicating treasure from Harry Potter. I've got a pretty good start but i've run in to a couple of problems. Each generating more problems.


The first is that I haven't succeeded to constrain my duplicating effect to only solve once a frame for each object. And the other, more important, I haven't managed to successfully give my duplicated DOP objects unique names. 

It works for the first couple of duplications but after a while it all falls apart, this leading to incorrect velocity etc.


I'm using packed objects in combination with a object_merge in a foreach sop in a sopsolver for this, an area that I'm not at all comfortable (DOPs).


If someone wanted to take a look I'm grateful. And / Or if someone is trying to do something similar, I think I'm up to a decent start here. (Could be wrong)




/ John


Link to comment
Share on other sites

Check out my last hip from this thread, maybe it could help; http://www.sidefx.com/index.php?option=com_forum&Itemid=172&page=viewtopic&t=31855


Tanks for your replay eetu.


I looked at your file and mine look a lot like yours, but I've tried to take it one step further than your example.


I do get an error with your file tough, at frame 30 one of the spheres duplicates and then the Rigid Body Solver gets an error due to the name attribute that doesn't exist on the newly created sphere. And on the next frame everything disappears.


I just opened my original file on my home computer instead at work and now I get a similar result, when the name attribute conflicts the rbd solver blanks out. 


This is the result I got now, and due to the naming problem this is expected, at frame 137 two cubes are created both name attribute set to "piece9". And the next frame everything blanks out.




In my file i tried to tackle the unique name attribute problem with an Attrib Wrangle Sop with an VEX expression thats suppose to lookup how many primitives there are and use that as the name.

s@name = "piece" + itoa(nprimitives(2));

I think that it works up until that point there is more than one new object created each frame.


Any ideas how to get a solid unique name attribute?


Edited by John Svensson
Link to comment
Share on other sites

Ah I didn't really look at your scene before, just remembered a similar topic.. :)


You could think of it a bit like a hash, something like

 s@name = "piece" + itoa(nprimitives(2)*11911 + 91*point(1, "id", 0));

didn't seem to give any duplicates up to few hundred, when I checked. You can probably figure out a safer one :)


edit: For me it does not complain even if there were duplicate names, interesting.


Edited by eetu
Link to comment
Share on other sites

Ah nice! That will suffice for now. Thank you eetu :) But still, I would like to get this nprimitives to work for future purposes.


I tried using the attribute wrangle with nprimitives again but with an absolute path to the node, just any node up the chain in this case. But that still didn't work when multiple instances was created on the same frame 

i@num = nprimitives("op:/obj/AutoDopNetwork_Duplicate_Cubes/sopsolver_duplicate_1/dop_geometry");

The problem is when i middle mouse button click on my sopsolver on a frame where something was just duplicated the sop solver has the correct count of primitives and points. But when dive inside it and middle mouse button click on the dop_geometry node (Dop Import) it has a lower number, as if it hasn't cooked yet or something.

If I step forward one frame and then back the number is updated and correct.... Weird, so my absolute path to the dop_geometry node doesn't help me. And I cant get the path to work for the sop solver or the multisolver one level up.


How to you with Vex or Hscript get something like the number of primitives in any of these Dop nodes, such as a Multisolver?

Link to comment
Share on other sites

What is your workflow for creating multiple objects at once? Why dont you just nprims + number of new instance?

I think you can dive into pop source/rbd point object dop to check what is the default solution

Link to comment
Share on other sites

  • 1 month later...

Hi again! I've been away so I haven't had a chance to work on this. Anyway thanks for your answer.


I use a Multisolver with RBD solver and a SOP Solver, in the SOP Solver I loop through all the objects in the sim with a ForEach SOP each frame and if a condition is met, like once every 25 frame I Object Merge in a new cube at the current cubes location.


I think the problem is when 2 cubes is created at the same frame, this happens in different cooks of the ForEach SOP so I cant take "nprims + number".

I tried to jump up two levels, out from the ForEach and query the DOP Import of the SOP Solver. But the same thing happens when 2 instances is created on the same frame.


What I think might be a solution is query the Multiple Solver for the number of primitives. I've been on google for the past 2 hours trying to figure out how to use all the hscript functions like dopfield, dopnumobjects and so on without any success. I think I might be missing something with these DOP nodes.


How do you query number of prims or points in DOP node?


When i middle mouse click on my Multiple Solver it says:


geo1 - Geometry : 11 points; 11 prims.


How do I get that using HScript or VEX?



Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...