| Latest Threads |
Non destructive blueprint...
Forum: General
Last Post: Qriva0
Yesterday, 02:40 PM
» Replies: 5
» Views: 131
|
How did they do with with...
Forum: Obi Cloth
Last Post: josemendez
Yesterday, 09:04 AM
» Replies: 1
» Views: 61
|
Anisotropic Particle Dens...
Forum: Obi Softbody
Last Post: josemendez
03-03-2026, 08:22 AM
» Replies: 1
» Views: 115
|
Alternative methods to an...
Forum: Obi Softbody
Last Post: midivagrant
27-02-2026, 04:50 PM
» Replies: 2
» Views: 377
|
Burst job schedule overhe...
Forum: General
Last Post: Qriva0
23-02-2026, 02:23 PM
» Replies: 4
» Views: 626
|
Trying to make obi fluids...
Forum: Obi Fluid
Last Post: josemendez
20-02-2026, 03:55 PM
» Replies: 5
» Views: 854
|
VR Fishing Project
Forum: Made with Obi
Last Post: astro.domine
19-02-2026, 07:49 PM
» Replies: 0
» Views: 172
|
Emit rope like silly stri...
Forum: Obi Rope
Last Post: josemendez
19-02-2026, 12:01 PM
» Replies: 18
» Views: 3,216
|
Procedurally applying dif...
Forum: Obi Cloth
Last Post: josemendez
18-02-2026, 11:50 AM
» Replies: 1
» Views: 301
|
Softbody High Particle Co...
Forum: Obi Softbody
Last Post: Eritar
13-02-2026, 02:15 PM
» Replies: 6
» Views: 918
|
|
|
| Non destructive blueprint regeneration |
|
Posted by: Qriva0 - Yesterday, 10:03 AM - Forum: General
- Replies (5)
|
 |
Hi, this thread mentioned destructive nature of blueprint generation, I noticed too that iteration based on mesh changes is really slow because of this, adding one vertex to softbody or cloth requires regeneration.
My proposition is to add feature to map existing data to newly generated particles.
To be precise, there would be checkbox next to "Generate" button (or button dropdown similar to lightmap bake) and this mode would keep old blueprint data cached, then after generation it mapsnew particles to old one by finding the closest particle. So things like weight, radius, groups would be copied from previous setup. Also groups - it would keep groups, but replace indices with new one that fit previous positions. In this case adding single vertex to mesh would require minimal changes, if any. In case of meshes with similar surface (but different density of particles) the same would apply, because 99% of data would fit previous setup.
This is not critical feature, but I think it would sagnificantly help many users and make iterations way shorter.
|
|
|
| Anisotropic Particle Density on Characters |
|
Posted by: Eritar - 02-03-2026, 01:55 PM - Forum: Obi Softbody
- Replies (1)
|
 |
Hi!
Could you please advise me on what would be the best solution to have a blueprint optimized for a full soft body character, because isotropic particle density is an inefficient approach IMO.
Ideally - Blueprint window could support a "density" map, akin to skin weights map, because it doesn't make sense to have the same particle density for a thigh, or a spine, as for example for fingers, or face, or other fine-detailed extremities.
Splitting the character into different meshes with their own different blueprints is a workaround I have found working sort of well, but you can't reliably "stitch" the mesh to be visibly watertight, and have it have continuous simulation, so there are gaps (for example on a wrist where more high-particle hand meets low-particle arm) in the mesh.
Could please advise if there already is a way to solve this issue?
Thank you very much!
|
|
|
| Alternative methods to anchor a softbody (and skeleton sampling) |
|
Posted by: midivagrant - 25-02-2026, 07:06 PM - Forum: Obi Softbody
- Replies (2)
|
 |
Hello,
I'm making a pet simulator game where you use a rigidbody hand object to pet/poke/punch/etc. a little softbody slime guy.
I need the slime's bottom half to stay locked into one place, and it seems like the default way in Obi Softbody v7.1 is to use particle attachment and paint some particles to be used as anchors. But I am still in the process of trying to figure out what the best settings for the softbody are, and every time I go to make an edit to the blueprint, I must then re-generate and repaint the anchor particles which is extremely tedious. Is there a better way to anchor a softbody without having to repaint them every time it gets regenerated?
There does seem to be one other solution to this, which is shown in the FullBodyVolumetricSoftbody demo using the skeleton sampling feature to keep much of the softbody locked in place exactly how I'd want it to be. However when I import some bones and weight painting for my model, it seems to only anchor one small specific point on my softbody model to the skeleton for some reason. I have even gone so far as to use the exact same skeleton that the big_guy demo mesh uses and data-transferred the weight paint and vertex groups from that armature to my model, but this same effect still happens. I'm not able to find much documentation on how the skeleton sampling works outside of what's on the softbody setup documentation page; am I missing some info about what determines how much influence a skeleton has on the softbody volume and surface particles? Would this pipeline of creating a few simple bones to use as anchor points for my softbody be a viable solution in the first place?
Thanks in advance!
|
|
|
| Burst job schedule overhead |
|
Posted by: Qriva0 - 20-02-2026, 04:00 PM - Forum: General
- Replies (4)
|
 |
Hi, I noticed huge overhead coming from scheduling jobs and I have got several questions.
First of all I am aware that pushing many large job structs is slow and waking up threads is not free, however I did not expect such a big performance difference.
You can see profiler snapshot of obi simulation scheduling, single frame has 20 substeps and for testing purposes I added callback with job handle to schedule custom job (small blue bottom column).
Observations:
1. Each following substep is longer. For example the first call takes ~0.01ms, while the last one is ~0.1ms. This is huge difference, especially for jobs like particle collision where most of update is taken by them (0.4ms single substep!).
2. Using ScheduleByRef helps a bit, but I think for my custom jobs it's maybe 20% and what is more important I can't see wh huge job structs like friction can take small fraction of frame, while scheduling my job takes several times more time even if it's smaller.
3. I expected that changing Parallel to IJobFor would give me huge boost because it does not need to wake up everything, but it's not true.
4. Calling JobHandle.ScheduleBatchedJobs(); does not change anything, or I can't see visible difference.
In short I fail to see what exactly is causing that and on top of that Iam worried about obi8 - if I write custom constraint I guess it will be the same, so writing like 2-3 custom scripts going to kill the frame rate.
|
|
|
| Procedurally applying different skin constraints to different particles |
|
Posted by: CptnFabulous - 18-02-2026, 10:29 AM - Forum: Obi Cloth
- Replies (1)
|
 |
I have a function that alters skin constraints on a procedurally generated cloth mesh at runtime. The code currently applies the same constraints to the entire cloth, but I’ve realised I need to be able to separate them. Some parts need to be quite tight to prevent creases and crinkles, but tightening everything up prevents other parts of the cloth from moving freely, so it barely looks simulated at all.
I’m looking at the code in ObiSkinnedClothBlueprint for creating constraints, and it’s my understanding that the number of active constraints lines up with the number of clusters in the cloth mesh topology. So I would use each cluster’s vertices to calculate data about the surrounding mesh, and use that to calculate the mesh values.
Is this correct? My code isn’t giving the results I want, but before I redo my own functions to try and fix it, I want to make sure I’m actually applying the values in a way that’s intended. The Obi Cloth code is complicated stuff, and my solution feels suspiciously easy.
Thanks!
Code: public delegate float CalculateClusterData(ObiMesh.Cluster cluster);
public void ApplySkinConstraints(ObiSkinnedClothBlueprint blueprint, CalculateClusterData getSkinRadiusMultiplier = null, CalculateClusterData getBackStopSphereRadiusMultiplier = null, CalculateClusterData getBackstopSphereDistanceMultiplier = null)
{
ObiSkinConstraintsBatch clothSkinConstraintsBatch = blueprint.skinConstraintsData.batches[0];
for (int i = 0; i < clothSkinConstraintsBatch.activeConstraintCount; i++)
{
float skinRadius = this.skinRadius;
float backstopSphereRadius = this.backstopSphereRadius;
float backstopSphereDistance = this.backstopSphereDistance;
ObiMesh.Cluster cluster = blueprint.topology.clusters[i];
if (getSkinRadiusMultiplier != null) skinRadius *= getSkinRadiusMultiplier.Invoke(cluster);
if (getBackStopSphereRadiusMultiplier != null) backstopSphereRadius *= getBackStopSphereRadiusMultiplier.Invoke(cluster);
if (getBackstopSphereDistanceMultiplier != null) backstopSphereDistance *= getBackstopSphereDistanceMultiplier.Invoke(cluster);
clothSkinConstraintsBatch.skinRadiiBackstop[i * 3] = skinRadius;
clothSkinConstraintsBatch.skinRadiiBackstop[i * 3 + 1] = backstopSphereRadius;
clothSkinConstraintsBatch.skinRadiiBackstop[i * 3 + 2] = backstopSphereDistance;
}
}
|
|
|
|