You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* General content improvements from feedback
* Update model-viewer from 3.5.0 to 4.1.0
* Add support for playback of multiple animations at once.
* Add tone-mapping to maintain rendering consistency in model-viewer 4.1.0 upgrade.
Signed-off-by: Matias Codesal <mcodesal@nvidia.com>
Copy file name to clipboardExpand all lines: docs/asset-modularity-instancing/authoring-point-instancing/point-instancing-intro.md
+21-2Lines changed: 21 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,7 @@ See the {usdcpp}`UsdGeomPointInstancer Details` documentation to learn more abou
12
12
13
13
Compared to [scenegraph instancing](../authoring-scenegraph-instancing/scenegraph-instancing-intro.md), PointInstancers can be less user-friendly and trickier to refine because most of scene description is hidden away in large arrays that are not as human-readable.
14
14
15
-
Point instancing is designed for massive numbers of simpler items where the overhead of an instance outweights the benefits of reuse. What does this mean? Think about leaves on a tree. You might have a 100,000 leaves on a tree. If you started down the path of using scenegraph instancing for this, you would need to define each leaf repetition and you would end up with 100,000 {term}`instanceable <Instanceable>` prims: "Leaf_000001", "Leaf_000002", "Leaf_000003", etc. Do you really need this in your scenegraph? Is this useful data for anyone?
15
+
Point instancing is designed for massive numbers of simpler items where the overhead of an instance outweighs the benefits of reuse. What does this mean? Think about leaves on a tree. You might have a 100,000 leaves on a tree. If you started down the path of using scenegraph instancing for this, you would need to define each leaf repetition and you would end up with 100,000 {term}`instanceable <Instanceable>` prims: "Leaf_000001", "Leaf_000002", "Leaf_000003", etc. Do you really need this in your scenegraph? Is this useful data for anyone?
16
16
17
17
That's where point instancing is a clear winner.
18
18
@@ -102,4 +102,23 @@ over "PackingPeanuts"
102
102
}
103
103
```
104
104
105
-
Keep this in mind as you perform downstream overrides and considerations you may need to make about things like USD {term}`layers <Layer>` format (i.e. USDA vs {term}`USDC <Crate File Format>`).
105
+
Keep this in mind as you perform downstream overrides and considerations you may need to make about things like USD {term}`layers <Layer>` format (i.e. USDA vs {term}`USDC <Crate File Format>`).
106
+
107
+
## Computing Instance Transforms
108
+
109
+
When you specify `positions` on a PointInstancer, you're defining positions in the PointInstancer's local coordinate space. However, when USD computes the final world-space position of each instance, it combines multiple transforms together.
110
+
111
+
For each instance, USD applies the following transforms in order from most local to least local:
112
+
113
+
1.**Prototype root transform**: The local-to-parent transformation of the prototype root is applied most locally.
114
+
2.**Instance-specific transforms**: The per-instance transformation is applied next, in this order:
115
+
-`scales[i]` (if authored)
116
+
-`orientations[i]` (if authored)
117
+
-`positions[i]`
118
+
3.**PointInstancer prim transform**: The transformation authored on the PointInstancer prim itself is applied least locally.
119
+
120
+
This means that you can move an entire PointInstancer around your scene by transforming the PointInstancer prim, and you can have prototypes with their own local transforms that will be incorporated into each instance's final position.
121
+
122
+
```{seealso}
123
+
For the complete details on how instance transforms are computed, including handling of velocities and angular velocities, see the {usdcpp}`UsdGeomPointInstancer` documentation.
This approach uses `ComputeInstanceTransformsAtTime()` to get the complete transform matrix for instance `1228`, which automatically combines the prototype root transform and the instance-specific transform (positions, velocities, orientations, angularVelocities, scales). This is still slightly simplified because we did not account for the PointInstancer prim's transformations. In this case, it's ok because the PointInstancer is at the origin.
125
+
109
126
The box looks just like it did before in the Viewport, but now we have a new prim hierarchy in the scenegraph where we can author new {term}`opinions <Opinions>` to manipulate this asset.
Copy file name to clipboardExpand all lines: docs/asset-modularity-instancing/refining-scenegraph-instances/scenegraph-deinstance-refinement.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@ The simplest way to edit or override an instance is to disable instancing for th
8
8
Deinstance refinement
9
9
```
10
10
11
-
At any point downstream, we can enable or disable instancing on a {term}`prim <Prim>`. If we have a use case where we just need to open one box, what we'll do is we'll set `instanceable = false` and now we can apply the overrides to open thet box.
11
+
At any point downstream, we can enable or disable instancing on a {term}`prim <Prim>`. If we have a use case where we just need to open one box, what we'll do is we'll set `instanceable = false` and now we can apply the overrides to open that box.
12
12
13
13
If you just have one thing that needs to be promoted to be treated uniquely from the rest of the copies, it's totally reasonable to deinstance it in a stronger {term}`layer <Layer>`.
Copy file name to clipboardExpand all lines: docs/beyond-basics/custom-properties.md
+59Lines changed: 59 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -65,6 +65,12 @@ Custom properties are the easiest and most flexible way to adapt OpenUSD to spec
65
65
We often recommend custom properties instead of metadata or `customData` metadata for prototyping because the former requires plugin-based schema development which is less portable and the later is more costly for composition because it is a composable dictionary data type.
66
66
```
67
67
68
+
### Grouping Related Properties
69
+
70
+
Namespace prefixes provide a way to logically group related properties together on a single prim. This is especially useful when working with data from other sources that have compound or structured types (like structs, records, or grouped fields). Since USD doesn't have a native struct type, namespace-prefixed attributes serve as the standard convention for representing this kind of grouped data.
71
+
72
+
You can even use nested namespaces to create a hierarchical organization. For example, sensor readings from an IoT device might be organized as `acme:sensor:temperature`, `acme:sensor:humidity`, and `acme:sensor:pressure`. Here, `acme:` identifies your organization and `sensor:` groups the related properties—the combined prefix makes it clear both where the data originated and that these attributes belong together conceptually. This approach is particularly valuable in data exchange workflows where you need to map complex data models from other formats into OpenUSD.
### Example 3: Grouping Related Properties with Namespaces
204
+
205
+
When working with grouped or compound data from other sources, namespace-prefixed attributes provide a clean way to organize related properties together. This example demonstrates how to store sensor readings using namespace prefixes.
206
+
207
+
Notice the double namespacing pattern `acme:sensor:temperature`. The first namespace (`acme:`) identifies the organization that created these custom properties, while the second namespace (`sensor:`) groups related properties together. This hierarchical approach allows you to both claim ownership of your custom properties and logically organize them into functional groups. It's a common pattern when mapping compound data types from other formats into USD.
# Document the custom properties to describe their purpose and units
228
+
temperature.SetDocumentation("Temperature reading in degrees Celsius")
229
+
humidity.SetDocumentation("Relative humidity as a percentage (0-100)")
230
+
pressure.SetDocumentation("Atmospheric pressure in kilopascals (kPa)")
231
+
timestamp.SetDocumentation("ISO 8601 formatted timestamp of the sensor reading")
232
+
233
+
# Set sensor readings
234
+
temperature.Set(22.5)
235
+
humidity.Set(45.0)
236
+
pressure.Set(101.3)
237
+
timestamp.Set("2025-01-09T14:30:00Z")
238
+
239
+
# Print grouped sensor data
240
+
print("Sensor Readings:")
241
+
print(f" Temperature: {temperature.Get()}°C")
242
+
print(f" Humidity: {humidity.Get()}%")
243
+
print(f" Pressure: {pressure.Get()} kPa")
244
+
print(f" Timestamp: {timestamp.Get()}")
245
+
246
+
stage.Save()
247
+
```
248
+
249
+
```{code-cell}
250
+
:tags: [remove-input]
251
+
DisplayCode(file_path)
252
+
```
253
+
254
+
Notice how all the sensor-related attributes share the `acme:sensor:` prefix. The nested namespace structure (`organization:group:property`) makes it immediately clear both where these properties came from and that they belong together as a logical group, even though they're separate attributes. This pattern is especially useful when mapping structured data types (like structs or records) from other data sources into USD.
255
+
197
256
## Key Takeaways
198
257
199
258
Custom properties in OpenUSD provide a versatile way to extend the functionality of scene descriptions, making them adaptable to various specialized needs. By understanding how to create, set, and retrieve custom properties, we can enhance our OpenUSD workflows and better manage complex data in our projects, significantly improve the precision and efficiency of digital models, and build USD pipelines that are tailored to specific use
Copy file name to clipboardExpand all lines: docs/beyond-basics/index.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,7 @@ By the end of this module, you'll understand how to:
13
13
-**Utilize {term}`model <Model>` {term}`kinds <Kind>`** - structure assets using {term}`component <Component>`, {term}`assembly <Assembly>`, and {term}`group <Group>` hierarchies
14
14
-**{term}`Traverse stages <Stage Traversal>`** - implement high-performance iteration through complex scene graphs
15
15
-**Understand {term}`Hydra <Hydra>` rendering** - work with USD's flexible rendering architecture and multiple backends
16
+
-**Handle units in USD** - work with `metersPerUnit`, `upAxis`, `timeCodesPerSecond`, and understand automatic vs. manual unit reconciliation during composition
0 commit comments