|
|
Efficiently determine actor under ray |
Posted by: 4ringz - 12-06-2024, 11:47 PM - Forum: General
- Replies (2)
|
|
Hi,
I'd appreciate some quick advice re: whether there's a more performant way to accomplish what I'm trying to do OOTB. For a first-person "grabbing" system I need to get the particle and related Actor (specifically softbody, but right now code works w/ all actors) closest to an origin point with a given ray.
My current code (adapted crudely from the particle picker example scripts) works, but as it's iterating through A) all particle positions and then B) an undetermined number of softbodies and each of their particles again to relate the particle to an Actor, it's quite inefficient, as I may need many softbodies as well as non-softbody particles in my scenes.
If there are cached bounds/extents per Obi actor I could cluster them into volumes, cast the ray through volumes, and then only iterate over each of their particles, but if those structures exist in ObiActor I can't seem to locate them.
Appreciate any help, thanks!
Code: public ObiActor GetActor(ObiSolver solver, int particleIndex){
foreach (ObiActor actor in solver.actors){
for (int i = 0; i < actor.solverIndices.count; i++){
if (actor.solverIndices[i] == particleIndex){
return actor;
}
}
}
return null;
}
public int Raycast(ObiSolver solver, Ray ray, float radiusScale, float maxDistance, Vector3 origin){
if (solver == null) return 1;
int hitParticle = -1;
float closestMu = float.MaxValue;
float closestDistance = float.MaxValue;
Matrix4x4 solver2World = solver.transform.localToWorldMatrix;
// Find the closest particle hit by the ray
for (int i = 0; i < solver.positions.count; ++i){
Vector3 worldPos = solver2World.MultiplyPoint3x4(solver.positions[i]);
if (Vector3.Distance(worldPos, origin) > maxDistance) continue;
float mu;
Vector3 projected = ObiUtils.ProjectPointLine(ray.origin, ray.origin + ray.direction, worldPos, out mu, false);
float distanceToRay = Vector3.SqrMagnitude(worldPos - projected);
// Disregard particles behind the camera:
mu = Mathf.Max(0, mu);
float radius = solver.principalRadii[i][0] * radiusScale;
if (distanceToRay <= radius * radius && distanceToRay < closestDistance && mu < closestMu){
closestMu = mu;
closestDistance = distanceToRay;
hitParticle = i;
}
}
return hitParticle;
|
|
|
Towel simulation in Quest |
Posted by: balaji.v - 12-06-2024, 07:31 AM - Forum: Obi Cloth
- Replies (13)
|
|
Hi,
I am working on a VR project where I need to grab a towel using a controller and then fold and unfold it, as well as rub the cloth on other objects with collision.
Could you please suggest possible ways to achieve the above simulation?
Thanks.
|
|
|
DIINotFoundException when attempting to import ObiRope |
Posted by: orangefire - 11-06-2024, 05:21 AM - Forum: Obi Rope
- Replies (4)
|
|
Hello,
I was trying to use ObiRope in Unity 2022.3.18f1 URP. When importing the package via Package Manager, I encountered the following errors
Code: DllNotFoundException: libOni assembly:<unknown assembly> type:<unknown type> member:(null)
Obi.OniBackend.CreateSolver (Obi.ObiSolver solver, System.Int32 capacity) (at Assets/Obi/Scripts/Common/Backends/Oni/OniBackend.cs:17)
Obi.ObiSolver.Initialize () (at Assets/Obi/Scripts/Common/Solver/ObiSolver.cs:883)
Obi.ObiSolver.AddActor (Obi.ObiActor actor) (at Assets/Obi/Scripts/Common/Solver/ObiSolver.cs:1148)
Obi.ObiActor.AddToSolver () (at Assets/Obi/Scripts/Common/Actors/ObiActor.cs:348)
Obi.ObiActor.OnEnable () (at Assets/Obi/Scripts/Common/Actors/ObiActor.cs:323)
DllNotFoundException: libOni assembly:<unknown assembly> type:<unknown type> member:(null)
Obi.ObiProfiler.DisableProfiler () (at Assets/Obi/Scripts/Common/Utils/ObiProfiler.cs:84)
Obi.ObiFixedUpdater.Update () (at Assets/Obi/Scripts/Common/Updaters/ObiFixedUpdater.cs:67)
Not sure how to resolve, as the example scenes don't seem to work (I don't see any rope appearing). Some of the materials are also failing to convert to URP (namely the VertexColor one). Would appreciate any help in resolving this!
EDIT: Reading thru the documentation, I made sure Burst, Jobs, Mathematics, and Collections packages are imported as well. However, when I'm trying to open my project again, I get the following compile error
Assets/Obi/Scripts/Common/Backends/Burst/DataStructures/NativeMultilevelGrid.cs(74,46): error CS1061: 'UnsafeList<K>' does not contain a definition for 'length' and no accessible extension method 'length' accepting a first argument of type 'UnsafeList<K>' could be found (are you missing a using directive or an assembly reference?)
I was able to quickly change the code from contents.length to contents.Length to fix this. Afterwards project was able to open, but I still get the above DIINotFoundException when attempting to play the example scenes.
|
|
|
Rope Collision Detection |
Posted by: kripa1415 - 10-06-2024, 08:18 AM - Forum: Obi Rope
- Replies (3)
|
|
Hi,
I have 3 ropes tanged. I am untangling first rope and avoided collision from the other 2 ropes. How do I detect this ?
I have the on collision subscribed on the solver and getting the contacts. But I want to filter rope wise
RopeGenerator.solver.OnParticleCollision += Solver_OnParticleCollision;
private void Solver_OnParticleCollision(ObiSolver solver, ObiSolver.ObiCollisionEventArgs contacts)
{
if (contacts.contacts.Count <= 0)
{
}
else
{
}
}
|
|
|
Softbody vehicle with many meshes |
Posted by: protomor - 08-06-2024, 07:15 AM - Forum: Obi Softbody
- Replies (3)
|
|
Howdy! I'm aiming to do BeamNG like crash damage and come to the conclusion that the Obi Softbody for Unity is the best option for that kind of deformation. The cars come in FBX files with multiple meshes under it. Is there a way to programatically load all of them in one go or some guidance on how to create all of this at runtime? Ideally, the meshes will deform and things like doors will come off. It might be simpler to create primative objects that bind to the overall meshes. Any guidance is appreciated.
|
|
|
Rope Cut not working |
Posted by: kripa1415 - 07-06-2024, 08:04 AM - Forum: Obi Rope
- Replies (5)
|
|
Hi,
I've attached video reference here of what happened while trying to cut the rope.
I've used RopeSweepCut. Its working in the sample scene. But If I use the same script for my Rope which is created dynamically at runtime, it not working.
When I swipe to cut, I can see the line renderer and on release, there's a shake happening in rope but its not actually cutting the rope.
I added log inside the below function. Log printed as expected but cut doesn't work
https://drive.google.com/file/d/1EqPp-hm...sp=sharing
Code: private void ScreenSpaceCut(Vector2 lineStart, Vector2 lineEnd)
{
// keep track of whether the rope was cut or not.
bool cut = false;
// iterate over all elements and test them for intersection with the line:
for (int i = 0; i < rope.elements.Count; ++i)
{
// project the both ends of the element to screen space.
Vector3 screenPos1 = cam.WorldToScreenPoint(rope.solver.positions[rope.elements[i].particle1]);
Vector3 screenPos2 = cam.WorldToScreenPoint(rope.solver.positions[rope.elements[i].particle2]);
// test if there's an intersection:
if (SegmentSegmentIntersection(screenPos1, screenPos2, lineStart, lineEnd, out float r, out float s))
{
cut = true;
rope.Tear(rope.elements[i]);
Debug.Log("cut");
}
}
// If the rope was cut at any point, rebuilt constraints:
if (cut) rope.RebuildConstraintsFromElements();
}
|
|
|
Cannot generate a blueprint asset for a mesh |
Posted by: Gustorvo - 06-06-2024, 09:54 PM - Forum: Obi Softbody
- Replies (2)
|
|
When trying to generate a blueprint on any mesh (read/write checkbox is enabled in import settings) I always get an Null ref error:
NullReferenceException: Object reference not set to an instance of an object
Obi.ObiActorBlueprintEditor.Refresh () (at Assets/Obi/Editor/Common/Blueprints/ObiActorBlueprintEditor.cs:416)
Obi.ObiActorBlueprintEditor.Generate () (at Assets/Obi/Editor/Common/Blueprints/ObiActorBlueprintEditor.cs:143)
Unity 2022.3.29f
Obi Softbody 6.5.4
|
|
|
|