Is there currently a way to import 3D Gaussian Splatting data into Reality Composer Pro?

Hello,

As far as I understand, RealityKit now supports 3D Gaussian Splatting through GaussianSplatComponent.

I would like to ask whether there is currently a way to use 3D Gaussian Splatting data directly in Reality Composer Pro, for example by importing a .ply file containing Gaussian splats.

More specifically:

  1. Can Reality Composer Pro import a 3D Gaussian Splatting .ply file?

  2. Is there a way to create or assign a GaussianSplatComponent to an entity directly within Reality Composer Pro?

  3. If this is not currently supported, is there any recommended workflow for creating a .usdz containing Gaussian Splatting data that can be opened in the Preview app on iPhone/iPad and displayed as an AR object?

I tried opening the sample plant.usdz on an iPhone using the Preview app. However, the AR preview appears to be empty, so it seems that the Preview app may not currently support rendering the Gaussian Splatting content contained in that USDZ.

My desired workflow would be:

Gaussian Splatting .ply → Reality Composer Pro / USDZ → iPhone Preview → AR

Is this workflow currently possible?

If not, is there an official or recommended way to package a GaussianSplatComponent and its associated Gaussian splat data into a USD/USDZ file for AR preview on iOS?

If the above functionality is not currently supported, does the development team have any plans to add or improve support for these features in future versions of Reality Composer Pro or the Preview app?

Any clarification regarding the current capabilities, limitations, or future plans would be greatly appreciated.

Thank you!

Hello @LING_RIXU , thank you for your question!

If you are using macOS 27, Preview.app can export .ply data as USD data (File > Export... > save your asset with a .usdz file extension). Note that if you do not see your splat rendering correctly, you can try setting the rendering backend to "Storm" (View > 3D Rendering > OpenUSD Storm). Also keep in mind that converting from PLY to USD isn't a standardized process, and you may see data loss.

An alternative method is to build your own app that can load PLY files into a GaussianSplatResource.BufferResource that can then be displayed on an Entity with a GaussianSplatComponent and saved to a Reality File using write(to:). This is documented in the Gaussian splats on visionOS sample (Gaussian splat APIs are also available on macOS and iOS).

Let me know if that helps! Thank you!

Hello, thank you very much for your solution.

I was able to successfully render the PLY file on my Mac using the OpenUSD Storm renderer in Preview. However, I am still encountering the following issues:

  1. The rendering result looks very strange. All of the Gaussian splats appear to have become circular shapes, and it seems that the Gaussian anisotropic shapes are not being rendered correctly.

  2. The exported USDZ file still cannot be previewed on my iPhone. It also seems that the iPhone version of Preview does not provide an option to choose the rendering backend, so I cannot switch to OpenUSD Storm there.

By the way, I am a 3D artist. My goal is to publish my 3D Gaussian Splatting artwork so that my followers can easily view it correctly.

At the moment, Apple's AR workflow seems to be the most suitable and convenient solution for this purpose. While building a dedicated app using RealityKit may indeed be technically feasible, I don't think it is an ideal workflow for distributing and viewing artwork. Requiring users to install a dedicated app would add an unnecessary barrier for simply viewing a 3D artwork.

What I would really prefer is an out-of-the-box workflow where I can provide a USDZ file, and users can simply open it on their iPhone and immediately view the Gaussian Splat in AR, without needing to install a dedicated app or perform any additional setup.

Is there currently any recommended way to achieve this kind of workflow while preserving the Gaussian Splat data and rendering it correctly on iOS?

Thank you again for your help!

Hello, thank you again for pointing me to the Gaussian splats on visionOS sample and suggesting the workflow of loading PLY data into GaussianSplatResource.BufferResource, attaching it to a GaussianSplatComponent, and then saving the Entity using write(to:).

I followed this workflow on macOS 27 Beta with Xcode 27 Beta, and I can successfully render the Gaussian splat at runtime. However, I am encountering an issue when saving and reloading the Reality File.

My workflow is:

PLY → parse 85,050 Gaussian splats → LowLevelBufferGaussianSplatResource.BufferResourceGaussianSplatResourceGaussianSplatComponentEntityEntity.write(to:).reality

The runtime rendering works correctly, and I can see all 85,050 splats in RealityView.

However, after calling:

try await entity.write(to: url)

the resulting .reality file is only 4,619 bytes.

I then reload it with:

let entity = try await Entity.load(contentsOf: url)

The Entity loads successfully and retains its name, but the reloaded Entity no longer contains a GaussianSplatComponent.

I also see these messages during loading:

Failed to set dependencies on asset 14319052529245013681 because NetworkAssetManager does not have an asset entity for that id.

Failed to set dependencies on asset 17573982531972126889 because NetworkAssetManager does not have an asset entity for that id.

The important part is that the original runtime Entity definitely contains the Gaussian splat and renders correctly before write(to:), but the reloaded Entity does not contain the GaussianSplatComponent.

I have also tried writing the Entity using the static:

try await Entity.write([entity], to: url)

but the resulting Reality File is similarly very small and the Gaussian splat data is not restored after loading.

So I would like to clarify something about the workflow you mentioned:

  1. Is GaussianSplatResource.BufferResource currently expected to be serializable by Entity.write(to:) into a .reality file?

  2. Does GaussianSplatResource created from a BufferResource require some additional asset/resource registration step before calling Entity.write(to:)?

  3. Since GaussianSplatResource references the underlying LowLevelBuffer, is the underlying LowLevelBuffer data expected to be embedded into the Reality File automatically by write(to:), or does the developer need to persist the splat buffer separately?

  4. Is this behavior a current limitation/bug of the Gaussian Splat APIs in macOS 27 / RealityKit Beta?

  5. If the workflow described in your previous answer is expected to work, could you point me to the specific part of the Gaussian splats on visionOS sample that demonstrates saving a GaussianSplatComponent created from a BufferResource to a Reality File and then loading that Reality File back with the Gaussian splat data intact?

For reference, the relevant runtime state in my test is:

Gaussian count: 85,050
Buffer stride: 92 bytes
Raw Gaussian data: 7,824,600 bytes

Runtime:
GaussianSplatResource.BufferResource: valid
GaussianSplatComponent: valid
RealityView rendering: works correctly

After Entity.write(to:):
.reality file size: 4,619 bytes

After Entity.load():
Entity: loaded successfully
GaussianSplatComponent: missing
Gaussian splat: not restored

I would especially appreciate clarification on whether a GaussianSplatResource.BufferResource backed by LowLevelBuffer is supposed to be persisted by Entity.write(to:).

Thank you!

Is there currently a way to import 3D Gaussian Splatting data into Reality Composer Pro?
 
 
Q