Basis Curves mesh

Hey All,

Working on an animated curve mesh within Issac sim which requires detection by the lidar collider system for a ML model.

I have created the curve from the action graph example with a custom script running 10 x-form positions to generate the curve prim targets. Following the method described in

“Action Graph and USD Curves Extension Overview in Omniverse Create”

This is all working perfectly with no issues. I am using this as a reference curve, as I dont see anyway to wrap a mesh around the curve from the input prim. Not sure if this is possible?

I did some testing with the constant width cubic basis curves method.

Using custom points from the above mentioned script and altering the normal3f normals to match the point count. I encountered some issues in detection and curve shape / mesh mismatch

I have two main issues with this.

  1. Initially the curve mesh is not registered by the collider, I used a test cube to check I wasn’t making a simple mistake, which is being detected by the lidar detector.

I found the following post,

Sadly I’m not any closer to understanding what the issue is here but I believe the basis curves usda, doesn’t actually have faces?

  1. The basis curves is based on points, which have no direction. For the reference curve prim I used a system of parent position x-forms and child x-forms then a “get look at rotation” system to provide the direction of curve thru the animation.

You can see in the attached picture that the reference curve and mesh are not aligned properly.

fucked curve

I’m wondering what is the best way to fix this can I make a mesh with user defined diameters to run smoothly along the prim curve and be detected by the collider system?

Thanks for the help, I’m pretty close to finishing my model now so it would be a massive help to get this one over the line!!!

Hi @Sirens_uk. I’m not sure about support for curves/tubs as colliders for physics. Let me check with the physics team.

Thanks @mati-nvidia ,

I’m looking into the difference in the code between the cylinder mesh with collider api applied and the basis curves. Obviously its not a simple fix and goes into the whole API and how that integrates with curve data.

Unfortunately this is a problem I need to solve for my application.

So it maybe creating a custom mesh that has the mesh apiSchemas integrated somehow.

I have a few ideas on how to do this already, probably using point on curve and tangents to create the base mesh, I do need to spend more time wrapping my head around the other factors here.

Either way its something I need to make work.

@bruno.vetter managed to do something similar.

I’ll have a look over the code in more detail and try to see what is the best way to approach this. Again, I didn’t expect this to be a simple fix…


def Mesh “Cylinder” (
prepend apiSchemas = [“PhysicsCollisionAPI”, “PhysxCollisionAPI”, “PhysxTriangleMeshCollisionAPI”, “PhysicsMeshCollisionAPI”, “PhysxCookedDataAPI:triangleMesh”]
int faceVertexCounts =
int faceVertexIndices =
normal3f normals = [)] (
interpolation = “faceVarying”
uniform token physics:approximation = “none”
bool physics:collisionEnabled = 1
uchar physxCookedData:triangleMesh:buffer =
point3f points =
float2 primvars:st = (
interpolation = “faceVarying”
uniform token subdivisionScheme = “none”
quatd xformOp:orient = (1, 0, 0, 0)
double3 xformOp:scale = (1, 1, 1)
double3 xformOp:translate = (573.0354549314634, 163.12963864387802, 230.6513311166948)
uniform token xformOpOrder = [“xformOp:translate”, “xformOp:orient”, “xformOp:scale”]

def BasisCurves “Product_mesh”
uniform token basis = “bezier”
int curveVertexCounts = [13]
normal3f normals = [(1, 0, 0), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 5), (1, 0, 0)] (
interpolation = “varying”
uniform token orientation = “leftHanded”
point3f points = [(-1000, -395.86743, 1099.8506), (-1000, -395.86743, 1099.8506), (-703.05194, -143.77454, 931.54944), (-477.3563, 27.366976, 801.979), (-304.27237, 127.12922, 701.55835), (-165.15952, 165.08429, 620.7064), (-41.37713, 150.80429, 549.84216), (85.71542, 93.86132, 479.38452), (234.75879, 3.8274844, 399.75256), (424.3936, -109.72513, 301.36514), (673.26044, -237.22441, 174.64131), (1000, -369.09824, 10), (1000, -369.09824, 10)]
color3f primvars:displayColor = [(1, 1, 1)]
bool primvars:doNotCastShadows = 0
bool primvars:enableShadowTerminatorFix = 0
bool primvars:isVolume = 0
bool primvars:wireframe = 0
uniform token type = “cubic”
token visibility = “invisible”
float widths = [50] (
interpolation = “constant”
uniform token wrap = “nonperiodic”
float3 xformOp:rotateXYZ = (0, 0, 0)
float3 xformOp:scale = (1, 1, 1)
float3 xformOp:translate = (0, 0, 0)
uniform token xformOpOrder = [“xformOp:translate”, “xformOp:rotateXYZ”, “xformOp:scale”]

You have the right idea. Physics team said that for now, you’ll want to convert your curves to UsdGeomMesh to use them as colliders.

@mati-nvidia appreciate it.

I’ll close this out and come back to you guys when I hit my next snag point.

I need to do some research on my own before I can progress on this.

kind regards,

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.