KartaVR v4 Freeware Edition  [SUBMITTED]

Moderator: SecondMan

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

KartaVR v4 | Send Geometry to usdview

#76

Post by AndrewHazelden » Mon Nov 11, 2019 10:36 pm

The "KartaVR Scripts | Geometry" atom package was updated to v4.2.1 this evening. This package can be found in Reactor's "KartaVR/Scripts" category.

KartaVR_Scripts_Geometry_Atom_Package.png

Send Geometry to usdview

As part of the KartaVR v4.2.1 update, a new "Send Geometry to usdview" script was added to KartaVR's suite of workflow tools. This script takes AlembicMesh3D nodes that are selected in the Nodes view and sends the .abc models to usdview. You can then playback the Alembic sequence using the usdview timeline controls, navigate through and inspect the scene graph, or export a flattened USDC (Binary Crate)/USDA (ASCII) formatted USD scene from your alembic source model. :)

usdview_menus_kartavr.png

In Resolve's Fusion page this script can be accessed using the "Workspaces > Scripts > KartaVR > Geometry > Send Geometry to usdview" menu item.

In Fusion Standalone this script can be accessed from the "Script > KartaVR > Geometry > Send Geometry to usdview" menu item.

If you would like to adjust the usdview executable that is run by this script, simply link in a new program in the "usdview Path" field in the Askuser dialog.

usdview_askuser.png

What is usdview?

The usdview program is a high-performance asset review tool that lets you navigate through the full scene hierarchy. You can click on any of the "Prim Name" elements in the tree view at the top-left of the usdview window to see a summary of the properties and their values in the lower-left view. usdview provides a wide range of interactive rendering modes that can be adjusted using the "View" menu. Also, it's easy to preview the scene with subdivision smoothing enabled in the realtime viewport.

Note: The PIXAR usdview program needs to be pre-installed on the system and listed in the $PATH environment variable. usdview is primarily used to examine PIXAR OpenUSD USDC/USDA format scene graphs but it can also work with Alembic models too.

usdview_kitchen_set_alembic.png

Pixar usdview SIGGRAPH VIdeo

If you would like to see a tech demo of production grade assets being played back in usdview, then check out the PIXAR SIGGRAPH video Real Time 3D Animation Graphics in Pixar Film Productions.

How do I get started with OpenUSD?

If you are a TD and would like to read detailed instructions on how to compile your own custom build of usdview for CentOS 7.x check out this related WSL article:

The Ultimate Guide to OpenUSD Pipeline Development | Overview
https://www.steakunderwater.com/wesuckl ... 969#p26969
You do not have the required permissions to view the files attached to this post.

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition | Directory Tree Script

#77

Post by AndrewHazelden » Tue Nov 12, 2019 5:15 pm

The "KartaVR Scripts | Viewer" atom package was updated to v4.2.1.

The "Directory Tree" script displays a ui:Tree view that allows you to browse through and quickly import the media assets stored in the same folder hierarchy as your .comp file.

  • Single-click on a row in the tree view to copy the filepath to your clipboard.
  • Double-clicking on a row will import images, image sequences, movies, and FBX/OBJ/Alembic 3D models into your comp.
  • Double-clicking on a .comp file will open it in a new tab.
  • Double-clicking on a .setting file will add the macro node to your current composite.
  • Double-clicking on a .lua script will run it.
  • Double-clicking on an .atom file will open it in the Reactor's Atomizer editor.
  • Double-clicking on an .xyz point cloud file will import it into your current composite as a PointCloud3D node.
  • Double-clicking on a .pts (PTGui v10) file will run the KartaVR PTGui Project Importer script.
  • Double-clicking on a .txt file or .html webpage will open it in the default viewing program.
  • Double-clicking on a folder will open the folder up in a Finder/Explorer/Nautilus folder browsing window.
  • Double-clicking on a LUT file will load it in Fusion.

Directory Tree Screenshot

Directory Tree.png
You do not have the required permissions to view the files attached to this post.

User avatar
ShadowMaker SdR
Fusionista
Posts: 692
Joined: Sun Sep 21, 2014 6:17 am
Answers: 4
Been thanked: 26 times

Re: KartaVR v4 Freeware Edition

#78

Post by ShadowMaker SdR » Wed Nov 13, 2019 1:11 am

Hi Andrew, maybe you should consider putting 'viewer' in another category than KartaVR - it seems useful for quite a lot of things and I never installed it because of the fact that it's labeled under VR which I don't do and have no use for.

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#79

Post by AndrewHazelden » Wed Nov 13, 2019 2:40 am

ShadowMaker SdR wrote:
Wed Nov 13, 2019 1:11 am
...which I don't do and have no use for.
Thanks for sharing your opinion. It's helpful to hear that. :)

What can I say. It is what it is.

I'm slowly working in adding more detailed descriptions to each of the KartaVR sub-package atoms so people know what's in each of the smaller installable items and what secondary uses those tools could be used for. KartaVR was chunked into many smaller packages so people could pick and choose.

The same sort of thing could be said of Krokodove being simply too big and that it should be cut up into 1000 little pieces and de-branded as one item... And that if you don't do 3D mograph you'd never bother to explore all the other things KKD can do...

The "Directory Tree" script was in the commercial version of KartaVR in 2017 and it predates Reactor's existence, and Fusion v9.

The script was previously macOS only since it had the unique capacity to use exotic GUI script automation to fully rebuild and reimport Alembic scenes, FBX scenes, and layered PSDs via scripted usage of the the "File > Import" menu.

It's reason for creation was to avoid needing to use a Loader node's file browser dialog when bringing in multi-view imagery to stitch together matte paintings.

Of which in modern terms a VFX matte painting, texture reprojections, etc are all immersive workflows. Which since you don't do "VR", wouldn't do... :D

The script has linkages for PTGui .pts files to enable one-click importing of panoramic stitching projects to nodes so it's embedded into KartaVR that way. And I have a photogrammetry project importing options for Agi Photoscan/Metashape .psx files, and for RealityCapture files in the works that just need finalizing.

KartaVR tries to provide it's own reimagined version of an affordable Fusion alternative to MistikaVR/Mistika Boutique, Scratch's VR offerings, and NukeX's CaraVR and the new Foundry Volumagic tools. That is a large scope to reach across.

For simple asset management/browsing needs, the other day WSL user nsf linked to a neat script that WSL user "VFX Grace" created which would be more general-purpose for every day VFX artists.

Cheers,
Andrew
Last edited by AndrewHazelden on Wed Nov 13, 2019 4:07 am, edited 1 time in total.

User avatar
ShadowMaker SdR
Fusionista
Posts: 692
Joined: Sun Sep 21, 2014 6:17 am
Answers: 4
Been thanked: 26 times

Re: KartaVR v4 Freeware Edition

#80

Post by ShadowMaker SdR » Wed Nov 13, 2019 2:48 am

Points taken, but still... (can't help the mansplainer in me) Krokodove is in itself a meaningless word. To Fusion users it just means: cool suite of plugins that do awesome stuff. If you put VR in the name I will think: it's VR. You could call a suite of tools the Brightness/Contrast Collection and then add a spline warper to it, but chances are great that noone will find them. You're right there's overlap (sorry) between VR and 'regular' comping, but in this case it reads as a specific file browser on steroids, so I feel it would be cool if more people discovered it.

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#81

Post by AndrewHazelden » Wed Nov 13, 2019 3:21 am

ShadowMaker SdR wrote:
Wed Nov 13, 2019 2:48 am
so I feel it would be cool if more people discovered it.
I can understand where you are coming from... and the sander-splaining is useful and informative.

These choices are just a symptom of the fact I don't do any regular "flat screen" VFX work in Fusion at all. I'm only doing video-photogrammetry, immersive pipeline tasks, stereo, and 360VR/Fulldome stuff. The appearance of IRL normal applications for this tech is purely accidental and unintentional. That's the side-effect of VR's goal of recreating a fully realistic copy of actual reality. :lol:

I have to say (counterintuitively) that usage level metrics and popularity aren't the key driver for me for what I create and then later post on WSL. It's just allowing people to have access to otherwise internal pipeline tools I have already made for my own workflow needs and project-specific R&D efforts. I turned off the donation tag on all my atoms ages ago since Reactor/Fusion/Resolve has a culture of free and so I'm not doing any of these things with the expectation of getting anything back financially. This, for better or for worse, changes the motivation for why something is done dev wise (that sucks up lots of time, is maintained for years, and improved) back over to being personally driven.

When I made the "LifeSaver.fuse" for multi-part and multi-channel EXR saving it was stuck at 3 downloads total for like 4 months of public release, and in its beta version only 1 download by SecondMan was all that there was. And most of the UI Manager example Lua/Python scripts have like 3 - 7 downloads typically yet I still make and post them since I needed them to exist anyway.

If I was doing any of this for any reason other than to allow the handful of *bush oyster* peeps Reactor based access to tech that is already on my hard drive, it would be a fools errand since it's not going to be mainstream, trendy, popular, easy to use, or make me rich.

Most of the stuff is short term workflow "haxies" anyway... I'm just posting a copy of something on WSL so WSL users like avclubvids, Bryan, and a few other people could tear it apart and learn from the tech inside. TBH if you look inside any of the scripts or fuses I post there are usually more code comments then functional code in the file (line-count wise) as it's doubling as a learning tool to fill in for an absence of modern Fusion scripting docs.
Last edited by AndrewHazelden on Wed Nov 13, 2019 5:22 am, edited 7 times in total.

User avatar
ShadowMaker SdR
Fusionista
Posts: 692
Joined: Sun Sep 21, 2014 6:17 am
Answers: 4
Been thanked: 26 times

Re: KartaVR v4 Freeware Edition

#82

Post by ShadowMaker SdR » Wed Nov 13, 2019 4:44 am

AndrewHazelden wrote:
Wed Nov 13, 2019 3:21 am
I have to say (counterintuitively) that usage level metrics and popularity aren't the key driver for me for what I create and then later post on WSL. It's just allowing people to have access to otherwise internal pipeline tools I have already made for my own workflow needs and project-specific R&D efforts.
And that's why we love you!

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#83

Post by AndrewHazelden » Wed Nov 13, 2019 4:50 am

Awww. Thanks, SdR. :)

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#84

Post by AndrewHazelden » Wed Nov 13, 2019 4:56 am

ShadowMaker SdR wrote:
Wed Nov 13, 2019 1:11 am
I never installed it because of the fact that it's labeled under VR which I don't do and have no use for.
@ShadowMaker I think a more interesting topic of conversation would be to deconstruct your personal biases that you don't appear to like VR at all, and have no use for it. That IMHO appears to be a mental filter that is limiting your range of options as an artist. Some of these approaches can be super fun to do! :)

If you talked to a iOS or Google Pixel owning smartphone user they would say that all camera tracked matchmoved videos done with a composited object inserted is actually a form of AR (augmented reality). Or they might possibly say its MR (mixed-reality) if they were an uber-geek. Those types of end-users no longer consider match moving to be "VFX" at all - VFX... ewww... gross. ;)

If you use environment mapping on any 3D rendered elements in Fusion for reflections that's a spherical or cubic panorama. If you use a floating-point image such as an EXR (that is a 16-bit half float, or 32-bit per channel image) that's a branch of HDRI (high dynamic range imagery) that falls under an "immersive" / VR tech umbrella. Same as IBL (image-based-lighting) which is a product created as a result of the HDRshop/lightstage research. And image-based modelling and photogrammetry approaches are also generally classified as VR sector developed technologies too.

Eventually, some of that has to be non-crap and useful to everyday VFX needs. Maybe you've only seen bad content/examples of this tech and it jaded your perceptions? Exploring this zone can be more fun than a barrel of monkeys, and learning any new topic helps to cross-pollinate new ideas/skills, too. Now, that's fun!

User avatar
Midgardsormr
Fusionator
Posts: 1308
Joined: Wed Nov 26, 2014 8:04 pm
Answers: 6
Location: Los Angeles, CA, USA
Been thanked: 115 times
Contact:

Re: KartaVR v4 Freeware Edition

#85

Post by Midgardsormr » Wed Nov 13, 2019 11:01 am

But is it more fun than a barrel of eagles?

I have to admit that I've only barely looked at what's in Karta. I've nabbed a few bits and bobs on occasion, but the whole thing is just so huge that I haven't taken the time to even figure out what all is in there. I know for sure that you've solved problems that people ask me about on occasion, but not having explored it, I can't answer.

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#86

Post by AndrewHazelden » Wed Nov 13, 2019 12:12 pm

Midgardsormr wrote:
Wed Nov 13, 2019 11:01 am
But is it more fun than a barrel of eagles?
BarrelShape3D tries to be a more universal solution for all your animal in a barrel needs. BarrelShape3D in Reactor allows you to add Lightwave sourced eagles, or mesh-based monkeys (if they are willing to connect to the "EagleSceneInput" input). :lol:

User avatar
SecondMan
Site Admin
Posts: 3756
Joined: Thu Jul 31, 2014 5:31 pm
Answers: 7
Location: Vancouver, Canada
Been thanked: 146 times
Contact:

Re: KartaVR v4 Freeware Edition

#87

Post by SecondMan » Sat Nov 16, 2019 12:32 am

Follow this link for Andrew's KartaVR Atom packages listing: https://www.steakunderwater.com/wesuckl ... 105#p27105 :)

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

Re: KartaVR v4 Freeware Edition

#88

Post by AndrewHazelden » Sun Nov 17, 2019 5:04 am

If you update the "KartaVR Scripts | Geometry" atom package in Reactor you will see a new Fusion pipeline script called "Send Geometry to Lightwave Modeler". This script takes the active Nodes view selected FBXMesh3D, FBXExporter, or AlembicMesh3D model and beams it over to Lightwave Modeler in an instant.

Special thanks goes out to @andromeda_girl for sharing the original workflow idea/concept that lead to this script's creation! I had a fun time writing it. :)




Note: This first time you run this script you need to select the exact Lightwave "Modeler.exe" or "Modeler.app" version you've got installed on your system. This value is set using the "Lightwave Modeler Path" text field + browse button in the script's AskUser dialog. After you define this value once, it will be saved into the Fusion preferences automatically so the path will be recalled and used again the next time you launch the script.

User avatar
AndrewHazelden
Fusionator
Posts: 1523
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 6
Location: West Dover, Nova Scotia, Canada
Been thanked: 95 times
Contact:

KartaVR "Export Point Cloud" Script Adds Support for Maya ASCII and USDA ASCII Exports

#89

Post by AndrewHazelden » Mon Dec 02, 2019 9:04 pm

If you update the "KartaVR Scripts | Geometry" Reactor atom package in Fusion/Resolve, you will have access via the Fusion "Script > KartaVR > Geometry > Export Point Cloud" menu item to a script that has an expanded range of volumetric/point cloud export options.

Overview

The KartaVR "Export Point Cloud" script allows you to save your PointCloud3D or FBXMesh3D node OBJ mesh vertices into the XYZ ASCII (.xyz), PLY ASCII (.ply), Maya ASCII (.ma), and PIXAR USDA ASCII (.usda) formats.

MAYA ASCII Export Workflow Summary

Export Point Cloud - Maya ASCII.png

When a Maya ASCII (.ma) point cloud is exported using the KartaVR "Export Point Cloud" script, it's worth taking a moment to adjust the "Maya Locator Size" control so the locators are correctly sized for your Maya scene scale.

Fusion OBJ Mesh.png

One of my favorite things about the "Export to Point Cloud" script is that it can also be used to de-compose a Fusion FBXMesh3D loaded OBJ model into its individual vertices when the point cloud is exported. This approach gives an approximation of a "Distribute Points on Surface" kind of technique with a very low amount of coding effort.

Maya Point Cloud.png

Last night KartaVR added support for .ma (Maya ASCII) based exports from Fusion 3D system PointCloud3D nodes, and OBJ meshes.

Maya ASCII Export.png
This syntax-highlighted text file shows the results from a new Maya ASCII (.ma) export from Fusion.

USDA ASCII Export Workflow Summary

0 Fusion export point cloud.png
Let's try exporting a PointCloud3D, or an FBXMesh3D (OBJ) node's data to a USD ASCII (.usda) file and then open it up in Maya with the PIXAR USD for Maya Plugin.


If you have the latest version of KartaVR installed via Reactor you can copy/paste in this macro snippet that loads an OBJ mesh of a hemispherical dome shape into Fusion's 3D system using an FBXMesh3D node. (This asset is provided by the Reactor based "KartaVR Images" atom package.)
Code: [Select all] [Expand/Collapse] [Download] (FulldomeQuads.setting)
  1. {
  2.     Tools = ordered() {
  3.         FulldomeQuads = SurfaceFBXMesh {
  4.             CtrlWZoom = false,
  5.             NameSet = true,
  6.             Inputs = {
  7.                 ImportFile = Input { Value = "Reactor:/Deploy/Macros/KartaVR/Images/fulldome_quads.obj", },
  8.                 TransformToWorld = Input { Value = 0, },
  9.                 ["ObjectID.ObjectID"] = Input { Value = 1, },
  10.                 ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
  11.             },
  12.             ViewInfo = OperatorInfo { Pos = { 325.222, 80.8586 } },
  13.         }
  14.     },
  15.     ActiveTool = "FulldomeQuads"
  16. }

Select the FBXMesh3D node based "FulldomeQuads" item in the Nodes view area.

FulldomeQuads Node.png

Then run the "Script > KartaVR > Geometry > Export Point Cloud" menu item in Fusion.

Fusion Export Point Cloud Menu Item.png

Set the "Point Cloud Format" to "PIXAR USDA ASCII (.usda)" and click the "Continue" button.

USDA Export Point Cloud Script.png

This is a copy of a successful Fusion point cloud export. The USDA ASCII document has translated copies of the individual point cloud like "vertices" that were present in the KartaVR bundled "Macros:/KartaVR/Images/FulldomeQuads.obj" mesh. These vertices were converted into USD based Xform "Assembly" elements.
Code: [Select all] [Expand/Collapse] [Download] (FulldomeQuads.usda)
  1. #usda 1.0
  2. (
  3.     defaultPrim = "persp"
  4.     doc = """Generated from Composed Stage of root layer /Users/andrew/Desktop/FulldomeQuads.usda"""
  5.     metersPerUnit = 0.01
  6.     upAxis = "Y"
  7. )
  8.  
  9. def Xform "PointCloudGroup" (
  10.     kind = "assembly"
  11. )
  12. {
  13.  
  14.     def Xform "locator0"
  15.     {
  16.         double3 xformOp:translate = (0.578799, 0.578772, -0.578811)
  17.         uniform token[] xformOpOrder = ["xformOp:translate"]
  18.     }
  19.  
  20.     def Xform "locator1"
  21.     {
  22.         double3 xformOp:translate = (-0.578799, 0.578772, -0.578811)
  23.         uniform token[] xformOpOrder = ["xformOp:translate"]
  24.     }
  25.  
  26.     def Xform "locator2"
  27.     {
  28.         double3 xformOp:translate = (0.578799, 0.578772, 0.578811)
  29.         uniform token[] xformOpOrder = ["xformOp:translate"]
  30.     }
  31.  
  32.     def Xform "locator3"
  33.     {
  34.         double3 xformOp:translate = (-0.578799, 0.578772, 0.578811)
  35.         uniform token[] xformOpOrder = ["xformOp:translate"]
  36.     }
  37.  
  38.     def Xform "locator4"
  39.     {
  40.         double3 xformOp:translate = (0.709049, 0.000000, -0.709070)
  41.         uniform token[] xformOpOrder = ["xformOp:translate"]
  42.     }
  43.  
  44.     def Xform "locator5"
  45.     {
  46.         double3 xformOp:translate = (0.000000, 0.708994, -0.709000)
  47.         uniform token[] xformOpOrder = ["xformOp:translate"]
  48.     }
  49.  
  50.     def Xform "locator6"
  51.     {
  52.         double3 xformOp:translate = (-0.709049, 0.000000, -0.709070)
  53.         uniform token[] xformOpOrder = ["xformOp:translate"]
  54.     }
  55.  
  56.     def Xform "locator7"
  57.     {
  58.         double3 xformOp:translate = (0.709005, 0.708988, 0.000000)
  59.         uniform token[] xformOpOrder = ["xformOp:translate"]
  60.     }
  61.  
  62.     def Xform "locator8"
  63.     {
  64.         double3 xformOp:translate = (-0.000000, 0.708994, 0.709000)
  65.         uniform token[] xformOpOrder = ["xformOp:translate"]
  66.     }
  67.  
  68.     def Xform "locator9"
  69.     {
  70.         double3 xformOp:translate = (-0.709005, 0.708988, -0.000000)
  71.         uniform token[] xformOpOrder = ["xformOp:translate"]
  72.     }
  73.  
  74.     def Xform "locator10"
  75.     {
  76.         double3 xformOp:translate = (0.709049, 0.000000, 0.709070)
  77.         uniform token[] xformOpOrder = ["xformOp:translate"]
  78.     }
  79.  
  80.     def Xform "locator11"
  81.     {
  82.         double3 xformOp:translate = (-0.709049, 0.000000, 0.709070)
  83.         uniform token[] xformOpOrder = ["xformOp:translate"]
  84.     }
  85.  
  86.     def Xform "locator12"
  87.     {
  88.         double3 xformOp:translate = (0.000000, 0.000000, -1.003254)
  89.         uniform token[] xformOpOrder = ["xformOp:translate"]
  90.     }
  91.  
  92.     def Xform "locator13"
  93.     {
  94.         double3 xformOp:translate = (0.000000, 1.002254, 0.000000)
  95.         uniform token[] xformOpOrder = ["xformOp:translate"]
  96.     }
  97.  
  98.     def Xform "locator14"
  99.     {
  100.         double3 xformOp:translate = (-0.000000, 0.000000, 1.003254)
  101.         uniform token[] xformOpOrder = ["xformOp:translate"]
  102.     }
  103.  
  104.     def Xform "locator15"
  105.     {
  106.         double3 xformOp:translate = (1.003254, 0.000000, 0.000000)
  107.         uniform token[] xformOpOrder = ["xformOp:translate"]
  108.     }
  109.  
  110.     def Xform "locator16"
  111.     {
  112.         double3 xformOp:translate = (-1.003254, 0.000000, -0.000000)
  113.         uniform token[] xformOpOrder = ["xformOp:translate"]
  114.     }
  115.  
  116.     def Xform "locator17"
  117.     {
  118.         double3 xformOp:translate = (0.665876, 0.344060, -0.665887)
  119.         uniform token[] xformOpOrder = ["xformOp:translate"]
  120.     }
  121.  
  122.     def Xform "locator18"
  123.     {
  124.         double3 xformOp:translate = (0.344048, 0.665857, -0.665854)
  125.         uniform token[] xformOpOrder = ["xformOp:translate"]
  126.     }
  127.  
  128.     def Xform "locator19"
  129.     {
  130.         double3 xformOp:translate = (-0.344048, 0.665857, -0.665854)
  131.         uniform token[] xformOpOrder = ["xformOp:translate"]
  132.     }
  133.  
  134.     def Xform "locator20"
  135.     {
  136.         double3 xformOp:translate = (-0.665876, 0.344060, -0.665887)
  137.         uniform token[] xformOpOrder = ["xformOp:translate"]
  138.     }
  139.  
  140.     def Xform "locator21"
  141.     {
  142.         double3 xformOp:translate = (0.665859, 0.665852, -0.344045)
  143.         uniform token[] xformOpOrder = ["xformOp:translate"]
  144.     }
  145.  
  146.     def Xform "locator22"
  147.     {
  148.         double3 xformOp:translate = (0.665859, 0.665852, 0.344045)
  149.         uniform token[] xformOpOrder = ["xformOp:translate"]
  150.     }
  151.  
  152.     def Xform "locator23"
  153.     {
  154.         double3 xformOp:translate = (0.344048, 0.665857, 0.665854)
  155.         uniform token[] xformOpOrder = ["xformOp:translate"]
  156.     }
  157.  
  158.     def Xform "locator24"
  159.     {
  160.         double3 xformOp:translate = (-0.344048, 0.665857, 0.665854)
  161.         uniform token[] xformOpOrder = ["xformOp:translate"]
  162.     }
  163.  
  164.     def Xform "locator25"
  165.     {
  166.         double3 xformOp:translate = (-0.665859, 0.665852, 0.344045)
  167.         uniform token[] xformOpOrder = ["xformOp:translate"]
  168.     }
  169.  
  170.     def Xform "locator26"
  171.     {
  172.         double3 xformOp:translate = (-0.665859, 0.665852, -0.344045)
  173.         uniform token[] xformOpOrder = ["xformOp:translate"]
  174.     }
  175.  
  176.     def Xform "locator27"
  177.     {
  178.         double3 xformOp:translate = (0.665876, 0.344060, 0.665887)
  179.         uniform token[] xformOpOrder = ["xformOp:translate"]
  180.     }
  181.  
  182.     def Xform "locator28"
  183.     {
  184.         double3 xformOp:translate = (-0.665876, 0.344060, 0.665887)
  185.         uniform token[] xformOpOrder = ["xformOp:translate"]
  186.     }
  187.  
  188.     def Xform "locator29"
  189.     {
  190.         double3 xformOp:translate = (-0.392189, 0.000000, -0.922909)
  191.         uniform token[] xformOpOrder = ["xformOp:translate"]
  192.     }
  193.  
  194.     def Xform "locator30"
  195.     {
  196.         double3 xformOp:translate = (0.392189, 0.000000, -0.922909)
  197.         uniform token[] xformOpOrder = ["xformOp:translate"]
  198.     }
  199.  
  200.     def Xform "locator31"
  201.     {
  202.         double3 xformOp:translate = (0.000000, 0.392352, -0.923203)
  203.         uniform token[] xformOpOrder = ["xformOp:translate"]
  204.     }
  205.  
  206.     def Xform "locator32"
  207.     {
  208.         double3 xformOp:translate = (-0.392185, 0.922766, -0.000000)
  209.         uniform token[] xformOpOrder = ["xformOp:translate"]
  210.     }
  211.  
  212.     def Xform "locator33"
  213.     {
  214.         double3 xformOp:translate = (0.000000, 0.922764, -0.392187)
  215.         uniform token[] xformOpOrder = ["xformOp:translate"]
  216.     }
  217.  
  218.     def Xform "locator34"
  219.     {
  220.         double3 xformOp:translate = (0.392185, 0.922766, 0.000000)
  221.         uniform token[] xformOpOrder = ["xformOp:translate"]
  222.     }
  223.  
  224.     def Xform "locator35"
  225.     {
  226.         double3 xformOp:translate = (-0.000000, 0.922764, 0.392187)
  227.         uniform token[] xformOpOrder = ["xformOp:translate"]
  228.     }
  229.  
  230.     def Xform "locator36"
  231.     {
  232.         double3 xformOp:translate = (-0.392189, 0.000000, 0.922909)
  233.         uniform token[] xformOpOrder = ["xformOp:translate"]
  234.     }
  235.  
  236.     def Xform "locator37"
  237.     {
  238.         double3 xformOp:translate = (-0.000000, 0.392352, 0.923203)
  239.         uniform token[] xformOpOrder = ["xformOp:translate"]
  240.     }
  241.  
  242.     def Xform "locator38"
  243.     {
  244.         double3 xformOp:translate = (0.392189, 0.000000, 0.922909)
  245.         uniform token[] xformOpOrder = ["xformOp:translate"]
  246.     }
  247.  
  248.     def Xform "locator39"
  249.     {
  250.         double3 xformOp:translate = (0.923216, 0.392320, 0.000000)
  251.         uniform token[] xformOpOrder = ["xformOp:translate"]
  252.     }
  253.  
  254.     def Xform "locator40"
  255.     {
  256.         double3 xformOp:translate = (0.922901, 0.000000, -0.392207)
  257.         uniform token[] xformOpOrder = ["xformOp:translate"]
  258.     }
  259.  
  260.     def Xform "locator41"
  261.     {
  262.         double3 xformOp:translate = (0.922901, 0.000000, 0.392207)
  263.         uniform token[] xformOpOrder = ["xformOp:translate"]
  264.     }
  265.  
  266.     def Xform "locator42"
  267.     {
  268.         double3 xformOp:translate = (-0.923216, 0.392320, -0.000000)
  269.         uniform token[] xformOpOrder = ["xformOp:translate"]
  270.     }
  271.  
  272.     def Xform "locator43"
  273.     {
  274.         double3 xformOp:translate = (-0.922901, 0.000000, 0.392207)
  275.         uniform token[] xformOpOrder = ["xformOp:translate"]
  276.     }
  277.  
  278.     def Xform "locator44"
  279.     {
  280.         double3 xformOp:translate = (-0.922901, 0.000000, -0.392207)
  281.         uniform token[] xformOpOrder = ["xformOp:translate"]
  282.     }
  283.  
  284.     def Xform "locator45"
  285.     {
  286.         double3 xformOp:translate = (0.370050, 0.370026, -0.855064)
  287.         uniform token[] xformOpOrder = ["xformOp:translate"]
  288.     }
  289.  
  290.     def Xform "locator46"
  291.     {
  292.         double3 xformOp:translate = (-0.370050, 0.370026, -0.855064)
  293.         uniform token[] xformOpOrder = ["xformOp:translate"]
  294.     }
  295.  
  296.     def Xform "locator47"
  297.     {
  298.         double3 xformOp:translate = (-0.370054, 0.855007, -0.370062)
  299.         uniform token[] xformOpOrder = ["xformOp:translate"]
  300.     }
  301.  
  302.     def Xform "locator48"
  303.     {
  304.         double3 xformOp:translate = (0.370054, 0.855007, -0.370062)
  305.         uniform token[] xformOpOrder = ["xformOp:translate"]
  306.     }
  307.  
  308.     def Xform "locator49"
  309.     {
  310.         double3 xformOp:translate = (0.370054, 0.855007, 0.370062)
  311.         uniform token[] xformOpOrder = ["xformOp:translate"]
  312.     }
  313.  
  314.     def Xform "locator50"
  315.     {
  316.         double3 xformOp:translate = (-0.370054, 0.855007, 0.370062)
  317.         uniform token[] xformOpOrder = ["xformOp:translate"]
  318.     }
  319.  
  320.     def Xform "locator51"
  321.     {
  322.         double3 xformOp:translate = (-0.370050, 0.370026, 0.855064)
  323.         uniform token[] xformOpOrder = ["xformOp:translate"]
  324.     }
  325.  
  326.     def Xform "locator52"
  327.     {
  328.         double3 xformOp:translate = (0.370050, 0.370026, 0.855064)
  329.         uniform token[] xformOpOrder = ["xformOp:translate"]
  330.     }
  331.  
  332.     def Xform "locator53"
  333.     {
  334.         double3 xformOp:translate = (0.855047, 0.370056, -0.370061)
  335.         uniform token[] xformOpOrder = ["xformOp:translate"]
  336.     }
  337.  
  338.     def Xform "locator54"
  339.     {
  340.         double3 xformOp:translate = (0.855047, 0.370056, 0.370061)
  341.         uniform token[] xformOpOrder = ["xformOp:translate"]
  342.     }
  343.  
  344.     def Xform "locator55"
  345.     {
  346.         double3 xformOp:translate = (-0.855047, 0.370056, 0.370061)
  347.         uniform token[] xformOpOrder = ["xformOp:translate"]
  348.     }
  349.  
  350.     def Xform "locator56"
  351.     {
  352.         double3 xformOp:translate = (-0.855047, 0.370056, -0.370061)
  353.         uniform token[] xformOpOrder = ["xformOp:translate"]
  354.     }
  355.  
  356.     def Xform "locator57"
  357.     {
  358.         double3 xformOp:translate = (0.697750, 0.178166, -0.697771)
  359.         uniform token[] xformOpOrder = ["xformOp:translate"]
  360.     }
  361.  
  362.     def Xform "locator58"
  363.     {
  364.         double3 xformOp:translate = (0.620514, 0.484774, -0.620509)
  365.         uniform token[] xformOpOrder = ["xformOp:translate"]
  366.     }
  367.  
  368.     def Xform "locator59"
  369.     {
  370.         double3 xformOp:translate = (0.484801, 0.620542, -0.620550)
  371.         uniform token[] xformOpOrder = ["xformOp:translate"]
  372.     }
  373.  
  374.     def Xform "locator60"
  375.     {
  376.         double3 xformOp:translate = (0.178200, 0.697787, -0.697792)
  377.         uniform token[] xformOpOrder = ["xformOp:translate"]
  378.     }
  379.  
  380.     def Xform "locator61"
  381.     {
  382.         double3 xformOp:translate = (-0.178200, 0.697787, -0.697792)
  383.         uniform token[] xformOpOrder = ["xformOp:translate"]
  384.     }
  385.  
  386.     def Xform "locator62"
  387.     {
  388.         double3 xformOp:translate = (-0.484801, 0.620542, -0.620550)
  389.         uniform token[] xformOpOrder = ["xformOp:translate"]
  390.     }
  391.  
  392.     def Xform "locator63"
  393.     {
  394.         double3 xformOp:translate = (-0.620514, 0.484774, -0.620509)
  395.         uniform token[] xformOpOrder = ["xformOp:translate"]
  396.     }
  397.  
  398.     def Xform "locator64"
  399.     {
  400.         double3 xformOp:translate = (-0.697750, 0.178166, -0.697771)
  401.         uniform token[] xformOpOrder = ["xformOp:translate"]
  402.     }
  403.  
  404.     def Xform "locator65"
  405.     {
  406.         double3 xformOp:translate = (0.620553, 0.620534, -0.484806)
  407.         uniform token[] xformOpOrder = ["xformOp:translate"]
  408.     }
  409.  
  410.     def Xform "locator66"
  411.     {
  412.         double3 xformOp:translate = (0.697792, 0.697790, -0.178181)
  413.         uniform token[] xformOpOrder = ["xformOp:translate"]
  414.     }
  415.  
  416.     def Xform "locator67"
  417.     {
  418.         double3 xformOp:translate = (0.697792, 0.697790, 0.178181)
  419.         uniform token[] xformOpOrder = ["xformOp:translate"]
  420.     }
  421.  
  422.     def Xform "locator68"
  423.     {
  424.         double3 xformOp:translate = (0.620553, 0.620534, 0.484806)
  425.         uniform token[] xformOpOrder = ["xformOp:translate"]
  426.     }
  427.  
  428.     def Xform "locator69"
  429.     {
  430.         double3 xformOp:translate = (0.484801, 0.620542, 0.620550)
  431.         uniform token[] xformOpOrder = ["xformOp:translate"]
  432.     }
  433.  
  434.     def Xform "locator70"
  435.     {
  436.         double3 xformOp:translate = (0.178200, 0.697787, 0.697792)
  437.         uniform token[] xformOpOrder = ["xformOp:translate"]
  438.     }
  439.  
  440.     def Xform "locator71"
  441.     {
  442.         double3 xformOp:translate = (-0.178200, 0.697787, 0.697792)
  443.         uniform token[] xformOpOrder = ["xformOp:translate"]
  444.     }
  445.  
  446.     def Xform "locator72"
  447.     {
  448.         double3 xformOp:translate = (-0.484801, 0.620542, 0.620550)
  449.         uniform token[] xformOpOrder = ["xformOp:translate"]
  450.     }
  451.  
  452.     def Xform "locator73"
  453.     {
  454.         double3 xformOp:translate = (-0.620553, 0.620534, 0.484806)
  455.         uniform token[] xformOpOrder = ["xformOp:translate"]
  456.     }
  457.  
  458.     def Xform "locator74"
  459.     {
  460.         double3 xformOp:translate = (-0.697792, 0.697790, 0.178181)
  461.         uniform token[] xformOpOrder = ["xformOp:translate"]
  462.     }
  463.  
  464.     def Xform "locator75"
  465.     {
  466.         double3 xformOp:translate = (-0.697792, 0.697790, -0.178181)
  467.         uniform token[] xformOpOrder = ["xformOp:translate"]
  468.     }
  469.  
  470.     def Xform "locator76"
  471.     {
  472.         double3 xformOp:translate = (-0.620553, 0.620534, -0.484806)
  473.         uniform token[] xformOpOrder = ["xformOp:translate"]
  474.     }
  475.  
  476.     def Xform "locator77"
  477.     {
  478.         double3 xformOp:translate = (0.620514, 0.484774, 0.620509)
  479.         uniform token[] xformOpOrder = ["xformOp:translate"]
  480.     }
  481.  
  482.     def Xform "locator78"
  483.     {
  484.         double3 xformOp:translate = (0.697750, 0.178166, 0.697771)
  485.         uniform token[] xformOpOrder = ["xformOp:translate"]
  486.     }
  487.  
  488.     def Xform "locator79"
  489.     {
  490.         double3 xformOp:translate = (-0.697750, 0.178166, 0.697771)
  491.         uniform token[] xformOpOrder = ["xformOp:translate"]
  492.     }
  493.  
  494.     def Xform "locator80"
  495.     {
  496.         double3 xformOp:translate = (-0.620514, 0.484774, 0.620509)
  497.         uniform token[] xformOpOrder = ["xformOp:translate"]
  498.     }
  499.  
  500.     def Xform "locator81"
  501.     {
  502.         double3 xformOp:translate = (-0.201725, 0.000000, -0.982420)
  503.         uniform token[] xformOpOrder = ["xformOp:translate"]
  504.     }
  505.  
  506.     def Xform "locator82"
  507.     {
  508.         double3 xformOp:translate = (-0.562818, 0.000000, -0.829920)
  509.         uniform token[] xformOpOrder = ["xformOp:translate"]
  510.     }
  511.  
  512.     def Xform "locator83"
  513.     {
  514.         double3 xformOp:translate = (0.201725, 0.000000, -0.982420)
  515.         uniform token[] xformOpOrder = ["xformOp:translate"]
  516.     }
  517.  
  518.     def Xform "locator84"
  519.     {
  520.         double3 xformOp:translate = (0.562818, 0.000000, -0.829920)
  521.         uniform token[] xformOpOrder = ["xformOp:translate"]
  522.     }
  523.  
  524.     def Xform "locator85"
  525.     {
  526.         double3 xformOp:translate = (0.000000, 0.201711, -0.982489)
  527.         uniform token[] xformOpOrder = ["xformOp:translate"]
  528.     }
  529.  
  530.     def Xform "locator86"
  531.     {
  532.         double3 xformOp:translate = (0.000000, 0.562904, -0.829958)
  533.         uniform token[] xformOpOrder = ["xformOp:translate"]
  534.     }
  535.  
  536.     def Xform "locator87"
  537.     {
  538.         double3 xformOp:translate = (-0.201623, 0.981888, -0.000000)
  539.         uniform token[] xformOpOrder = ["xformOp:translate"]
  540.     }
  541.  
  542.     def Xform "locator88"
  543.     {
  544.         double3 xformOp:translate = (-0.562782, 0.829754, -0.000000)
  545.         uniform token[] xformOpOrder = ["xformOp:translate"]
  546.     }
  547.  
  548.     def Xform "locator89"
  549.     {
  550.         double3 xformOp:translate = (0.000000, 0.981888, -0.201621)
  551.         uniform token[] xformOpOrder = ["xformOp:translate"]
  552.     }
  553.  
  554.     def Xform "locator90"
  555.     {
  556.         double3 xformOp:translate = (0.000000, 0.829756, -0.562780)
  557.         uniform token[] xformOpOrder = ["xformOp:translate"]
  558.     }
  559.  
  560.     def Xform "locator91"
  561.     {
  562.         double3 xformOp:translate = (0.201623, 0.981888, 0.000000)
  563.         uniform token[] xformOpOrder = ["xformOp:translate"]
  564.     }
  565.  
  566.     def Xform "locator92"
  567.     {
  568.         double3 xformOp:translate = (0.562782, 0.829754, 0.000000)
  569.         uniform token[] xformOpOrder = ["xformOp:translate"]
  570.     }
  571.  
  572.     def Xform "locator93"
  573.     {
  574.         double3 xformOp:translate = (-0.000000, 0.981888, 0.201621)
  575.         uniform token[] xformOpOrder = ["xformOp:translate"]
  576.     }
  577.  
  578.     def Xform "locator94"
  579.     {
  580.         double3 xformOp:translate = (-0.000000, 0.829756, 0.562780)
  581.         uniform token[] xformOpOrder = ["xformOp:translate"]
  582.     }
  583.  
  584.     def Xform "locator95"
  585.     {
  586.         double3 xformOp:translate = (-0.201725, 0.000000, 0.982420)
  587.         uniform token[] xformOpOrder = ["xformOp:translate"]
  588.     }
  589.  
  590.     def Xform "locator96"
  591.     {
  592.         double3 xformOp:translate = (-0.562818, 0.000000, 0.829920)
  593.         uniform token[] xformOpOrder = ["xformOp:translate"]
  594.     }
  595.  
  596.     def Xform "locator97"
  597.     {
  598.         double3 xformOp:translate = (-0.000000, 0.201711, 0.982489)
  599.         uniform token[] xformOpOrder = ["xformOp:translate"]
  600.     }
  601.  
  602.     def Xform "locator98"
  603.     {
  604.         double3 xformOp:translate = (-0.000000, 0.562904, 0.829958)
  605.         uniform token[] xformOpOrder = ["xformOp:translate"]
  606.     }
  607.  
  608.     def Xform "locator99"
  609.     {
  610.         double3 xformOp:translate = (0.201725, 0.000000, 0.982420)
  611.         uniform token[] xformOpOrder = ["xformOp:translate"]
  612.     }
  613.  
  614.     def Xform "locator100"
  615.     {
  616.         double3 xformOp:translate = (0.562818, 0.000000, 0.829920)
  617.         uniform token[] xformOpOrder = ["xformOp:translate"]
  618.     }
  619.  
  620.     def Xform "locator101"
  621.     {
  622.         double3 xformOp:translate = (0.982489, 0.201688, 0.000000)
  623.         uniform token[] xformOpOrder = ["xformOp:translate"]
  624.     }
  625.  
  626.     def Xform "locator102"
  627.     {
  628.         double3 xformOp:translate = (0.829969, 0.562887, 0.000000)
  629.         uniform token[] xformOpOrder = ["xformOp:translate"]
  630.     }
  631.  
  632.     def Xform "locator103"
  633.     {
  634.         double3 xformOp:translate = (0.982430, 0.000000, -0.201675)
  635.         uniform token[] xformOpOrder = ["xformOp:translate"]
  636.     }
  637.  
  638.     def Xform "locator104"
  639.     {
  640.         double3 xformOp:translate = (0.829895, 0.000000, -0.562856)
  641.         uniform token[] xformOpOrder = ["xformOp:translate"]
  642.     }
  643.  
  644.     def Xform "locator105"
  645.     {
  646.         double3 xformOp:translate = (0.982430, 0.000000, 0.201675)
  647.         uniform token[] xformOpOrder = ["xformOp:translate"]
  648.     }
  649.  
  650.     def Xform "locator106"
  651.     {
  652.         double3 xformOp:translate = (0.829895, 0.000000, 0.562856)
  653.         uniform token[] xformOpOrder = ["xformOp:translate"]
  654.     }
  655.  
  656.     def Xform "locator107"
  657.     {
  658.         double3 xformOp:translate = (-0.982489, 0.201688, -0.000000)
  659.         uniform token[] xformOpOrder = ["xformOp:translate"]
  660.     }
  661.  
  662.     def Xform "locator108"
  663.     {
  664.         double3 xformOp:translate = (-0.829969, 0.562887, -0.000000)
  665.         uniform token[] xformOpOrder = ["xformOp:translate"]
  666.     }
  667.  
  668.     def Xform "locator109"
  669.     {
  670.         double3 xformOp:translate = (-0.982430, 0.000000, 0.201675)
  671.         uniform token[] xformOpOrder = ["xformOp:translate"]
  672.     }
  673.  
  674.     def Xform "locator110"
  675.     {
  676.         double3 xformOp:translate = (-0.829895, 0.000000, 0.562856)
  677.         uniform token[] xformOpOrder = ["xformOp:translate"]
  678.     }
  679.  
  680.     def Xform "locator111"
  681.     {
  682.         double3 xformOp:translate = (-0.982430, 0.000000, -0.201675)
  683.         uniform token[] xformOpOrder = ["xformOp:translate"]
  684.     }
  685.  
  686.     def Xform "locator112"
  687.     {
  688.         double3 xformOp:translate = (-0.829895, 0.000000, -0.562856)
  689.         uniform token[] xformOpOrder = ["xformOp:translate"]
  690.     }
  691.  
  692.     def Xform "locator113"
  693.     {
  694.         double3 xformOp:translate = (0.530377, 0.352682, -0.774466)
  695.         uniform token[] xformOpOrder = ["xformOp:translate"]
  696.     }
  697.  
  698.     def Xform "locator114"
  699.     {
  700.         double3 xformOp:translate = (0.352647, 0.530302, -0.774353)
  701.         uniform token[] xformOpOrder = ["xformOp:translate"]
  702.     }
  703.  
  704.     def Xform "locator115"
  705.     {
  706.         double3 xformOp:translate = (0.190334, 0.385622, -0.905739)
  707.         uniform token[] xformOpOrder = ["xformOp:translate"]
  708.     }
  709.  
  710.     def Xform "locator116"
  711.     {
  712.         double3 xformOp:translate = (0.385587, 0.190273, -0.905697)
  713.         uniform token[] xformOpOrder = ["xformOp:translate"]
  714.     }
  715.  
  716.     def Xform "locator117"
  717.     {
  718.         double3 xformOp:translate = (-0.352647, 0.530302, -0.774353)
  719.         uniform token[] xformOpOrder = ["xformOp:translate"]
  720.     }
  721.  
  722.     def Xform "locator118"
  723.     {
  724.         double3 xformOp:translate = (-0.530377, 0.352682, -0.774466)
  725.         uniform token[] xformOpOrder = ["xformOp:translate"]
  726.     }
  727.  
  728.     def Xform "locator119"
  729.     {
  730.         double3 xformOp:translate = (-0.385587, 0.190273, -0.905697)
  731.         uniform token[] xformOpOrder = ["xformOp:translate"]
  732.     }
  733.  
  734.     def Xform "locator120"
  735.     {
  736.         double3 xformOp:translate = (-0.190334, 0.385622, -0.905739)
  737.         uniform token[] xformOpOrder = ["xformOp:translate"]
  738.     }
  739.  
  740.     def Xform "locator121"
  741.     {
  742.         double3 xformOp:translate = (-0.530254, 0.774223, -0.352605)
  743.         uniform token[] xformOpOrder = ["xformOp:translate"]
  744.     }
  745.  
  746.     def Xform "locator122"
  747.     {
  748.         double3 xformOp:translate = (-0.352597, 0.774227, -0.530256)
  749.         uniform token[] xformOpOrder = ["xformOp:translate"]
  750.     }
  751.  
  752.     def Xform "locator123"
  753.     {
  754.         double3 xformOp:translate = (-0.190295, 0.905628, -0.385609)
  755.         uniform token[] xformOpOrder = ["xformOp:translate"]
  756.     }
  757.  
  758.     def Xform "locator124"
  759.     {
  760.         double3 xformOp:translate = (-0.385601, 0.905634, -0.190289)
  761.         uniform token[] xformOpOrder = ["xformOp:translate"]
  762.     }
  763.  
  764.     def Xform "locator125"
  765.     {
  766.         double3 xformOp:translate = (0.352597, 0.774227, -0.530256)
  767.         uniform token[] xformOpOrder = ["xformOp:translate"]
  768.     }
  769.  
  770.     def Xform "locator126"
  771.     {
  772.         double3 xformOp:translate = (0.530254, 0.774223, -0.352605)
  773.         uniform token[] xformOpOrder = ["xformOp:translate"]
  774.     }
  775.  
  776.     def Xform "locator127"
  777.     {
  778.         double3 xformOp:translate = (0.385601, 0.905634, -0.190289)
  779.         uniform token[] xformOpOrder = ["xformOp:translate"]
  780.     }
  781.  
  782.     def Xform "locator128"
  783.     {
  784.         double3 xformOp:translate = (0.190295, 0.905628, -0.385609)
  785.         uniform token[] xformOpOrder = ["xformOp:translate"]
  786.     }
  787.  
  788.     def Xform "locator129"
  789.     {
  790.         double3 xformOp:translate = (0.530254, 0.774223, 0.352605)
  791.         uniform token[] xformOpOrder = ["xformOp:translate"]
  792.     }
  793.  
  794.     def Xform "locator130"
  795.     {
  796.         double3 xformOp:translate = (0.352597, 0.774227, 0.530256)
  797.         uniform token[] xformOpOrder = ["xformOp:translate"]
  798.     }
  799.  
  800.     def Xform "locator131"
  801.     {
  802.         double3 xformOp:translate = (0.190295, 0.905628, 0.385609)
  803.         uniform token[] xformOpOrder = ["xformOp:translate"]
  804.     }
  805.  
  806.     def Xform "locator132"
  807.     {
  808.         double3 xformOp:translate = (0.385601, 0.905634, 0.190289)
  809.         uniform token[] xformOpOrder = ["xformOp:translate"]
  810.     }
  811.  
  812.     def Xform "locator133"
  813.     {
  814.         double3 xformOp:translate = (-0.352597, 0.774227, 0.530256)
  815.         uniform token[] xformOpOrder = ["xformOp:translate"]
  816.     }
  817.  
  818.     def Xform "locator134"
  819.     {
  820.         double3 xformOp:translate = (-0.530254, 0.774223, 0.352605)
  821.         uniform token[] xformOpOrder = ["xformOp:translate"]
  822.     }
  823.  
  824.     def Xform "locator135"
  825.     {
  826.         double3 xformOp:translate = (-0.385601, 0.905634, 0.190289)
  827.         uniform token[] xformOpOrder = ["xformOp:translate"]
  828.     }
  829.  
  830.     def Xform "locator136"
  831.     {
  832.         double3 xformOp:translate = (-0.190295, 0.905628, 0.385609)
  833.         uniform token[] xformOpOrder = ["xformOp:translate"]
  834.     }
  835.  
  836.     def Xform "locator137"
  837.     {
  838.         double3 xformOp:translate = (-0.530377, 0.352682, 0.774466)
  839.         uniform token[] xformOpOrder = ["xformOp:translate"]
  840.     }
  841.  
  842.     def Xform "locator138"
  843.     {
  844.         double3 xformOp:translate = (-0.352647, 0.530302, 0.774353)
  845.         uniform token[] xformOpOrder = ["xformOp:translate"]
  846.     }
  847.  
  848.     def Xform "locator139"
  849.     {
  850.         double3 xformOp:translate = (-0.190334, 0.385622, 0.905739)
  851.         uniform token[] xformOpOrder = ["xformOp:translate"]
  852.     }
  853.  
  854.     def Xform "locator140"
  855.     {
  856.         double3 xformOp:translate = (-0.385587, 0.190273, 0.905697)
  857.         uniform token[] xformOpOrder = ["xformOp:translate"]
  858.     }
  859.  
  860.     def Xform "locator141"
  861.     {
  862.         double3 xformOp:translate = (0.352647, 0.530302, 0.774353)
  863.         uniform token[] xformOpOrder = ["xformOp:translate"]
  864.     }
  865.  
  866.     def Xform "locator142"
  867.     {
  868.         double3 xformOp:translate = (0.530377, 0.352682, 0.774466)
  869.         uniform token[] xformOpOrder = ["xformOp:translate"]
  870.     }
  871.  
  872.     def Xform "locator143"
  873.     {
  874.         double3 xformOp:translate = (0.385587, 0.190273, 0.905697)
  875.         uniform token[] xformOpOrder = ["xformOp:translate"]
  876.     }
  877.  
  878.     def Xform "locator144"
  879.     {
  880.         double3 xformOp:translate = (0.190334, 0.385622, 0.905739)
  881.         uniform token[] xformOpOrder = ["xformOp:translate"]
  882.     }
  883.  
  884.     def Xform "locator145"
  885.     {
  886.         double3 xformOp:translate = (0.774338, 0.530315, -0.352660)
  887.         uniform token[] xformOpOrder = ["xformOp:translate"]
  888.     }
  889.  
  890.     def Xform "locator146"
  891.     {
  892.         double3 xformOp:translate = (0.774443, 0.352700, -0.530397)
  893.         uniform token[] xformOpOrder = ["xformOp:translate"]
  894.     }
  895.  
  896.     def Xform "locator147"
  897.     {
  898.         double3 xformOp:translate = (0.905687, 0.190286, -0.385601)
  899.         uniform token[] xformOpOrder = ["xformOp:translate"]
  900.     }
  901.  
  902.     def Xform "locator148"
  903.     {
  904.         double3 xformOp:translate = (0.905748, 0.385620, -0.190294)
  905.         uniform token[] xformOpOrder = ["xformOp:translate"]
  906.     }
  907.  
  908.     def Xform "locator149"
  909.     {
  910.         double3 xformOp:translate = (0.774443, 0.352700, 0.530397)
  911.         uniform token[] xformOpOrder = ["xformOp:translate"]
  912.     }
  913.  
  914.     def Xform "locator150"
  915.     {
  916.         double3 xformOp:translate = (0.774338, 0.530315, 0.352660)
  917.         uniform token[] xformOpOrder = ["xformOp:translate"]
  918.     }
  919.  
  920.     def Xform "locator151"
  921.     {
  922.         double3 xformOp:translate = (0.905748, 0.385620, 0.190294)
  923.         uniform token[] xformOpOrder = ["xformOp:translate"]
  924.     }
  925.  
  926.     def Xform "locator152"
  927.     {
  928.         double3 xformOp:translate = (0.905687, 0.190286, 0.385601)
  929.         uniform token[] xformOpOrder = ["xformOp:translate"]
  930.     }
  931.  
  932.     def Xform "locator153"
  933.     {
  934.         double3 xformOp:translate = (-0.774338, 0.530315, 0.352660)
  935.         uniform token[] xformOpOrder = ["xformOp:translate"]
  936.     }
  937.  
  938.     def Xform "locator154"
  939.     {
  940.         double3 xformOp:translate = (-0.774443, 0.352700, 0.530397)
  941.         uniform token[] xformOpOrder = ["xformOp:translate"]
  942.     }
  943.  
  944.     def Xform "locator155"
  945.     {
  946.         double3 xformOp:translate = (-0.905687, 0.190286, 0.385601)
  947.         uniform token[] xformOpOrder = ["xformOp:translate"]
  948.     }
  949.  
  950.     def Xform "locator156"
  951.     {
  952.         double3 xformOp:translate = (-0.905748, 0.385620, 0.190294)
  953.         uniform token[] xformOpOrder = ["xformOp:translate"]
  954.     }
  955.  
  956.     def Xform "locator157"
  957.     {
  958.         double3 xformOp:translate = (-0.774443, 0.352700, -0.530397)
  959.         uniform token[] xformOpOrder = ["xformOp:translate"]
  960.     }
  961.  
  962.     def Xform "locator158"
  963.     {
  964.         double3 xformOp:translate = (-0.774338, 0.530315, -0.352660)
  965.         uniform token[] xformOpOrder = ["xformOp:translate"]
  966.     }
  967.  
  968.     def Xform "locator159"
  969.     {
  970.         double3 xformOp:translate = (-0.905748, 0.385620, -0.190294)
  971.         uniform token[] xformOpOrder = ["xformOp:translate"]
  972.     }
  973.  
  974.     def Xform "locator160"
  975.     {
  976.         double3 xformOp:translate = (-0.905687, 0.190286, -0.385601)
  977.         uniform token[] xformOpOrder = ["xformOp:translate"]
  978.     }
  979.  
  980.     def Xform "locator161"
  981.     {
  982.         double3 xformOp:translate = (0.501047, 0.501037, -0.709335)
  983.         uniform token[] xformOpOrder = ["xformOp:translate"]
  984.     }
  985.  
  986.     def Xform "locator162"
  987.     {
  988.         double3 xformOp:translate = (0.182111, 0.553774, -0.815796)
  989.         uniform token[] xformOpOrder = ["xformOp:translate"]
  990.     }
  991.  
  992.     def Xform "locator163"
  993.     {
  994.         double3 xformOp:translate = (0.198183, 0.198140, -0.962685)
  995.         uniform token[] xformOpOrder = ["xformOp:translate"]
  996.     }
  997.  
  998.     def Xform "locator164"
  999.     {
  1000.         double3 xformOp:translate = (0.553761, 0.182081, -0.815834)
  1001.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1002.     }
  1003.  
  1004.     def Xform "locator165"
  1005.     {
  1006.         double3 xformOp:translate = (-0.501047, 0.501037, -0.709335)
  1007.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1008.     }
  1009.  
  1010.     def Xform "locator166"
  1011.     {
  1012.         double3 xformOp:translate = (-0.553761, 0.182081, -0.815834)
  1013.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1014.     }
  1015.  
  1016.     def Xform "locator167"
  1017.     {
  1018.         double3 xformOp:translate = (-0.198183, 0.198140, -0.962685)
  1019.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1020.     }
  1021.  
  1022.     def Xform "locator168"
  1023.     {
  1024.         double3 xformOp:translate = (-0.182111, 0.553774, -0.815796)
  1025.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1026.     }
  1027.  
  1028.     def Xform "locator169"
  1029.     {
  1030.         double3 xformOp:translate = (-0.500938, 0.709198, -0.500957)
  1031.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1032.     }
  1033.  
  1034.     def Xform "locator170"
  1035.     {
  1036.         double3 xformOp:translate = (-0.182106, 0.815754, -0.553765)
  1037.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1038.     }
  1039.  
  1040.     def Xform "locator171"
  1041.     {
  1042.         double3 xformOp:translate = (-0.198127, 0.962437, -0.198123)
  1043.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1044.     }
  1045.  
  1046.     def Xform "locator172"
  1047.     {
  1048.         double3 xformOp:translate = (-0.553770, 0.815756, -0.182090)
  1049.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1050.     }
  1051.  
  1052.     def Xform "locator173"
  1053.     {
  1054.         double3 xformOp:translate = (0.500938, 0.709198, -0.500957)
  1055.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1056.     }
  1057.  
  1058.     def Xform "locator174"
  1059.     {
  1060.         double3 xformOp:translate = (0.553770, 0.815756, -0.182090)
  1061.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1062.     }
  1063.  
  1064.     def Xform "locator175"
  1065.     {
  1066.         double3 xformOp:translate = (0.198127, 0.962437, -0.198123)
  1067.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1068.     }
  1069.  
  1070.     def Xform "locator176"
  1071.     {
  1072.         double3 xformOp:translate = (0.182106, 0.815754, -0.553765)
  1073.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1074.     }
  1075.  
  1076.     def Xform "locator177"
  1077.     {
  1078.         double3 xformOp:translate = (0.500938, 0.709198, 0.500957)
  1079.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1080.     }
  1081.  
  1082.     def Xform "locator178"
  1083.     {
  1084.         double3 xformOp:translate = (0.182106, 0.815754, 0.553765)
  1085.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1086.     }
  1087.  
  1088.     def Xform "locator179"
  1089.     {
  1090.         double3 xformOp:translate = (0.198127, 0.962437, 0.198123)
  1091.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1092.     }
  1093.  
  1094.     def Xform "locator180"
  1095.     {
  1096.         double3 xformOp:translate = (0.553770, 0.815756, 0.182090)
  1097.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1098.     }
  1099.  
  1100.     def Xform "locator181"
  1101.     {
  1102.         double3 xformOp:translate = (-0.500938, 0.709198, 0.500957)
  1103.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1104.     }
  1105.  
  1106.     def Xform "locator182"
  1107.     {
  1108.         double3 xformOp:translate = (-0.553770, 0.815756, 0.182090)
  1109.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1110.     }
  1111.  
  1112.     def Xform "locator183"
  1113.     {
  1114.         double3 xformOp:translate = (-0.198127, 0.962437, 0.198123)
  1115.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1116.     }
  1117.  
  1118.     def Xform "locator184"
  1119.     {
  1120.         double3 xformOp:translate = (-0.182106, 0.815754, 0.553765)
  1121.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1122.     }
  1123.  
  1124.     def Xform "locator185"
  1125.     {
  1126.         double3 xformOp:translate = (-0.501047, 0.501037, 0.709335)
  1127.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1128.     }
  1129.  
  1130.     def Xform "locator186"
  1131.     {
  1132.         double3 xformOp:translate = (-0.182111, 0.553774, 0.815796)
  1133.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1134.     }
  1135.  
  1136.     def Xform "locator187"
  1137.     {
  1138.         double3 xformOp:translate = (-0.198183, 0.198140, 0.962685)
  1139.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1140.     }
  1141.  
  1142.     def Xform "locator188"
  1143.     {
  1144.         double3 xformOp:translate = (-0.553761, 0.182081, 0.815834)
  1145.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1146.     }
  1147.  
  1148.     def Xform "locator189"
  1149.     {
  1150.         double3 xformOp:translate = (0.501047, 0.501037, 0.709335)
  1151.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1152.     }
  1153.  
  1154.     def Xform "locator190"
  1155.     {
  1156.         double3 xformOp:translate = (0.553761, 0.182081, 0.815834)
  1157.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1158.     }
  1159.  
  1160.     def Xform "locator191"
  1161.     {
  1162.         double3 xformOp:translate = (0.198183, 0.198140, 0.962685)
  1163.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1164.     }
  1165.  
  1166.     def Xform "locator192"
  1167.     {
  1168.         double3 xformOp:translate = (0.182111, 0.553774, 0.815796)
  1169.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1170.     }
  1171.  
  1172.     def Xform "locator193"
  1173.     {
  1174.         double3 xformOp:translate = (0.709333, 0.501038, -0.501050)
  1175.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1176.     }
  1177.  
  1178.     def Xform "locator194"
  1179.     {
  1180.         double3 xformOp:translate = (0.815807, 0.182087, -0.553796)
  1181.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1182.     }
  1183.  
  1184.     def Xform "locator195"
  1185.     {
  1186.         double3 xformOp:translate = (0.962694, 0.198139, -0.198134)
  1187.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1188.     }
  1189.  
  1190.     def Xform "locator196"
  1191.     {
  1192.         double3 xformOp:translate = (0.815792, 0.553787, -0.182088)
  1193.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1194.     }
  1195.  
  1196.     def Xform "locator197"
  1197.     {
  1198.         double3 xformOp:translate = (0.709333, 0.501038, 0.501050)
  1199.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1200.     }
  1201.  
  1202.     def Xform "locator198"
  1203.     {
  1204.         double3 xformOp:translate = (0.815792, 0.553787, 0.182088)
  1205.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1206.     }
  1207.  
  1208.     def Xform "locator199"
  1209.     {
  1210.         double3 xformOp:translate = (0.962694, 0.198139, 0.198134)
  1211.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1212.     }
  1213.  
  1214.     def Xform "locator200"
  1215.     {
  1216.         double3 xformOp:translate = (0.815807, 0.182087, 0.553796)
  1217.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1218.     }
  1219.  
  1220.     def Xform "locator201"
  1221.     {
  1222.         double3 xformOp:translate = (-0.709333, 0.501038, 0.501050)
  1223.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1224.     }
  1225.  
  1226.     def Xform "locator202"
  1227.     {
  1228.         double3 xformOp:translate = (-0.815807, 0.182087, 0.553796)
  1229.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1230.     }
  1231.  
  1232.     def Xform "locator203"
  1233.     {
  1234.         double3 xformOp:translate = (-0.962694, 0.198139, 0.198134)
  1235.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1236.     }
  1237.  
  1238.     def Xform "locator204"
  1239.     {
  1240.         double3 xformOp:translate = (-0.815792, 0.553787, 0.182088)
  1241.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1242.     }
  1243.  
  1244.     def Xform "locator205"
  1245.     {
  1246.         double3 xformOp:translate = (-0.709333, 0.501038, -0.501050)
  1247.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1248.     }
  1249.  
  1250.     def Xform "locator206"
  1251.     {
  1252.         double3 xformOp:translate = (-0.815792, 0.553787, -0.182088)
  1253.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1254.     }
  1255.  
  1256.     def Xform "locator207"
  1257.     {
  1258.         double3 xformOp:translate = (-0.962694, 0.198139, -0.198134)
  1259.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1260.     }
  1261.  
  1262.     def Xform "locator208"
  1263.     {
  1264.         double3 xformOp:translate = (-0.815807, 0.182087, -0.553796)
  1265.         uniform token[] xformOpOrder = ["xformOp:translate"]
  1266.     }
  1267. }
  1268.  

Make sure the Pixar USD for Maya plugin (which you need to compile yourself) is set to Auto Load in the Maya Plugin Manager window. This ensures USDC/USDA format documents can be imported into the Maya scene.

0 Maya Plugin Manager.png

Once you've saved a USDA file to disk from Fusion, switch over to Maya on Linux and select the "File > Import..." menu item.

1 Maya File Import menu.png

If you have a copy of the PIXAR USD for Maya Plugin installed, the Maya Import dialog will allow you to select the .usda files via the "File of type" pxrUSDImport options menu.

2 Maya Import USDA File.png

The Fusion PointCloud3D data was imported into the scene via the .usda (USD ASCII) file format. This information is visible in the Outliner window as a grouped set of Maya "Transform" nodes parented under a "PointCloudGroup" item. Each of these transform nodes act as a null/group where they have a unique XYZ position recorded.

3 Maya Outliner Locators.png

Let's add a Maya native "Locator" object to the scene using the "Create > Locator" menu item. In the next few steps, we are going to replace all of the USD ASCII imported Null/Group node items with a Maya native Locator object.

4 Maya Add Locator.png

Let's scale the Maya native locator control handle smaller in size so it doesn't clutter the view up too much. Select the new locator in the Outliner. Then in the Channel Box type in a Local Scale XYZ value of "0.05" and press enter.

5 Change New Locator Local Scale.png
Select all of the USD ASCII imported "locator#" named items in the Outliner Window. Then add the Maya native Locator to your selection last so it is the final object selected. (The selection order is very important for this step!)

6 Select All Transform Nodes then the new Locator.png

Open the "Modify > Replace Objects []" OptionsBox based menu. The Options box is the small rectangle on the far right side of the menu item. This OptionsBox control is used to show the "Replace Objects Options" dialog.

7 Modify Menu Replace Objects With Options.png

Let's set the "Type of Copy" to Instance so all the locators will be instanced from the Native Maya locator we added. Click the "Replace Objects" button to carry out this operation.

8 Replace Objects.png

We now have a Maya native Locator based version of the Fusion 3D system exported PointCloud3D/FBXMesh (OBJ) vertices in the viewport.

9 Final Replaced Locators.png
You do not have the required permissions to view the files attached to this post.