Opened 2 years ago

Last modified 23 months ago

#10108 assigned enhancement

Make GLTF output so that importing into Blender sets the center of rotation at center of scene

Reported by: u34216@… Owned by: Tom Goddard
Priority: normal Milestone:
Component: Input/Output Version:
Keywords: Cc:
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        Windows-10-10.0.19045
ChimeraX Version: 1.6.1 (2023-05-09 17:57:07 UTC)
Description
When Exporting as GLTF with default settings (so centering enabled) the centering does not work properly. The "centering" objects gets the (mostly non zero) position of the 3D structure and the structure gets the position set to 0/0/0. It should be the other way around to create a proper centering of the pivot point.
I created a little video to show what is going on:
https://www.youtube.com/watch?v=QLPA_oTZDUw

I tested multiple Files with different 3D Programs and the Unity Game Engine. So it's probably the mentioned swapped X/Y/Z Position.

A non zero pivot point makes working with the 3D Model really annoying and the "centering = true" should probably create a properly centered pivot point.

OpenGL version: 3.3.0 NVIDIA 531.41
OpenGL renderer: NVIDIA GeForce RTX 2070 with Max-Q Design/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation

Python: 3.9.11
Locale: de_DE.cp1252
Qt version: PyQt6 6.4.2, Qt 6.4.2
Qt runtime version: 6.4.3
Qt platform: windows

Manufacturer: LENOVO
Model: 82EH
OS: Microsoft Windows 10 Pro (Build 19045)
Memory: 16,971,386,880
MaxProcessMemory: 137,438,953,344
CPU: 16 Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
OSLanguage: de-DE

Installed Packages:
    alabaster: 0.7.13
    appdirs: 1.4.4
    asttokens: 2.2.1
    Babel: 2.12.1
    backcall: 0.2.0
    beautifulsoup4: 4.11.2
    blockdiag: 3.0.0
    build: 0.10.0
    certifi: 2023.5.7
    cftime: 1.6.2
    charset-normalizer: 3.1.0
    ChimeraX-AddCharge: 1.5.9.1
    ChimeraX-AddH: 2.2.5
    ChimeraX-AlignmentAlgorithms: 2.0.1
    ChimeraX-AlignmentHdrs: 3.3.1
    ChimeraX-AlignmentMatrices: 2.1
    ChimeraX-Alignments: 2.9.3
    ChimeraX-AlphaFold: 1.0
    ChimeraX-AltlocExplorer: 1.0.3
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Arrays: 1.1
    ChimeraX-Atomic: 1.43.10
    ChimeraX-AtomicLibrary: 10.0.6
    ChimeraX-AtomSearch: 2.0.1
    ChimeraX-AxesPlanes: 2.3.2
    ChimeraX-BasicActions: 1.1.2
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 2.1.2
    ChimeraX-BondRot: 2.0.1
    ChimeraX-BugReporter: 1.0.1
    ChimeraX-BuildStructure: 2.8
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.2.2
    ChimeraX-ButtonPanel: 1.0.1
    ChimeraX-CageBuilder: 1.0.1
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.3.2
    ChimeraX-ChangeChains: 1.0.2
    ChimeraX-CheckWaters: 1.3.1
    ChimeraX-ChemGroup: 2.0.1
    ChimeraX-Clashes: 2.2.4
    ChimeraX-ColorActions: 1.0.3
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.5.3
    ChimeraX-CommandLine: 1.2.5
    ChimeraX-ConnectStructure: 2.0.1
    ChimeraX-Contacts: 1.0.1
    ChimeraX-Core: 1.6.1
    ChimeraX-CoreFormats: 1.1
    ChimeraX-coulombic: 1.4.2
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0.1
    ChimeraX-DataFormats: 1.2.3
    ChimeraX-Dicom: 1.2
    ChimeraX-DistMonitor: 1.4
    ChimeraX-DockPrep: 1.1.1
    ChimeraX-Dssp: 2.0
    ChimeraX-EMDB-SFF: 1.0
    ChimeraX-ESMFold: 1.0
    ChimeraX-FileHistory: 1.0.1
    ChimeraX-FunctionKey: 1.0.1
    ChimeraX-Geometry: 1.3
    ChimeraX-gltf: 1.0
    ChimeraX-Graphics: 1.1.1
    ChimeraX-Hbonds: 2.4
    ChimeraX-Help: 1.2.1
    ChimeraX-HKCage: 1.3
    ChimeraX-IHM: 1.1
    ChimeraX-ImageFormats: 1.2
    ChimeraX-IMOD: 1.0
    ChimeraX-IO: 1.0.1
    ChimeraX-ItemsInspection: 1.0.1
    ChimeraX-Label: 1.1.7
    ChimeraX-ListInfo: 1.1.1
    ChimeraX-Log: 1.1.5
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.8.2
    ChimeraX-Map: 1.1.4
    ChimeraX-MapData: 2.0
    ChimeraX-MapEraser: 1.0.1
    ChimeraX-MapFilter: 2.0.1
    ChimeraX-MapFit: 2.0
    ChimeraX-MapSeries: 2.1.1
    ChimeraX-Markers: 1.0.1
    ChimeraX-Mask: 1.0.2
    ChimeraX-MatchMaker: 2.0.12
    ChimeraX-MDcrds: 2.6
    ChimeraX-MedicalToolbar: 1.0.2
    ChimeraX-Meeting: 1.0.1
    ChimeraX-MLP: 1.1.1
    ChimeraX-mmCIF: 2.12
    ChimeraX-MMTF: 2.2
    ChimeraX-Modeller: 1.5.9
    ChimeraX-ModelPanel: 1.3.7
    ChimeraX-ModelSeries: 1.0.1
    ChimeraX-Mol2: 2.0
    ChimeraX-Mole: 1.0
    ChimeraX-Morph: 1.0.2
    ChimeraX-MouseModes: 1.2
    ChimeraX-Movie: 1.0
    ChimeraX-Neuron: 1.0
    ChimeraX-Nifti: 1.0
    ChimeraX-NRRD: 1.0
    ChimeraX-Nucleotides: 2.0.3
    ChimeraX-OpenCommand: 1.10.1
    ChimeraX-PDB: 2.7.2
    ChimeraX-PDBBio: 1.0
    ChimeraX-PDBLibrary: 1.0.2
    ChimeraX-PDBMatrices: 1.0
    ChimeraX-PickBlobs: 1.0.1
    ChimeraX-Positions: 1.0
    ChimeraX-PresetMgr: 1.1
    ChimeraX-PubChem: 2.1
    ChimeraX-ReadPbonds: 1.0.1
    ChimeraX-Registration: 1.1.1
    ChimeraX-RemoteControl: 1.0
    ChimeraX-RenderByAttr: 1.1
    ChimeraX-RenumberResidues: 1.1
    ChimeraX-ResidueFit: 1.0.1
    ChimeraX-RestServer: 1.1
    ChimeraX-RNALayout: 1.0
    ChimeraX-RotamerLibMgr: 3.0
    ChimeraX-RotamerLibsDunbrack: 2.0
    ChimeraX-RotamerLibsDynameomics: 2.0
    ChimeraX-RotamerLibsRichardson: 2.0
    ChimeraX-SaveCommand: 1.5.1
    ChimeraX-SchemeMgr: 1.0
    ChimeraX-SDF: 2.0.1
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0.1
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.8.3
    ChimeraX-Shape: 1.0.1
    ChimeraX-Shell: 1.0.1
    ChimeraX-Shortcuts: 1.1.1
    ChimeraX-ShowSequences: 1.0.1
    ChimeraX-SideView: 1.0.1
    ChimeraX-Smiles: 2.1
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.10.3
    ChimeraX-STL: 1.0.1
    ChimeraX-Storm: 1.0
    ChimeraX-StructMeasure: 1.1.2
    ChimeraX-Struts: 1.0.1
    ChimeraX-Surface: 1.0.1
    ChimeraX-SwapAA: 2.0.1
    ChimeraX-SwapRes: 2.2.1
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.1.2
    ChimeraX-ToolshedUtils: 1.2.1
    ChimeraX-Topography: 1.0
    ChimeraX-Tug: 1.0.1
    ChimeraX-UI: 1.28.4
    ChimeraX-uniprot: 2.2.2
    ChimeraX-UnitCell: 1.0.1
    ChimeraX-ViewDockX: 1.2
    ChimeraX-VIPERdb: 1.0
    ChimeraX-Vive: 1.1
    ChimeraX-VolumeMenu: 1.0.1
    ChimeraX-VTK: 1.0
    ChimeraX-WavefrontOBJ: 1.0
    ChimeraX-WebCam: 1.0.2
    ChimeraX-WebServices: 1.1.1
    ChimeraX-Zone: 1.0.1
    colorama: 0.4.6
    comm: 0.1.3
    comtypes: 1.1.14
    contourpy: 1.0.7
    cxservices: 1.2.2
    cycler: 0.11.0
    Cython: 0.29.33
    debugpy: 1.6.7
    decorator: 5.1.1
    docutils: 0.19
    executing: 1.2.0
    filelock: 3.9.0
    fonttools: 4.39.3
    funcparserlib: 1.0.1
    grako: 3.16.5
    h5py: 3.8.0
    html2text: 2020.1.16
    idna: 3.4
    ihm: 0.35
    imagecodecs: 2022.9.26
    imagesize: 1.4.1
    importlib-metadata: 6.6.0
    ipykernel: 6.21.1
    ipython: 8.10.0
    ipython-genutils: 0.2.0
    ipywidgets: 8.0.6
    jedi: 0.18.2
    Jinja2: 3.1.2
    jupyter-client: 8.0.2
    jupyter-core: 5.3.0
    jupyterlab-widgets: 3.0.7
    kiwisolver: 1.4.4
    line-profiler: 4.0.2
    lxml: 4.9.2
    lz4: 4.3.2
    MarkupSafe: 2.1.2
    matplotlib: 3.6.3
    matplotlib-inline: 0.1.6
    msgpack: 1.0.4
    nest-asyncio: 1.5.6
    netCDF4: 1.6.2
    networkx: 2.8.8
    nibabel: 5.0.1
    nptyping: 2.5.0
    numexpr: 2.8.4
    numpy: 1.23.5
    openvr: 1.23.701
    packaging: 23.1
    ParmEd: 3.4.3
    parso: 0.8.3
    pep517: 0.13.0
    pickleshare: 0.7.5
    Pillow: 9.3.0
    pip: 23.0
    pkginfo: 1.9.6
    platformdirs: 3.5.0
    prompt-toolkit: 3.0.38
    psutil: 5.9.4
    pure-eval: 0.2.2
    pycollada: 0.7.2
    pydicom: 2.3.0
    Pygments: 2.14.0
    pynrrd: 1.0.0
    PyOpenGL: 3.1.5
    PyOpenGL-accelerate: 3.1.5
    pyparsing: 3.0.9
    pyproject-hooks: 1.0.0
    PyQt6-commercial: 6.4.2
    PyQt6-Qt6: 6.4.3
    PyQt6-sip: 13.4.1
    PyQt6-WebEngine-commercial: 6.4.0
    PyQt6-WebEngine-Qt6: 6.4.3
    python-dateutil: 2.8.2
    pytz: 2023.3
    pywin32: 305
    pyzmq: 25.0.2
    qtconsole: 5.4.0
    QtPy: 2.3.1
    RandomWords: 0.4.0
    requests: 2.28.2
    scipy: 1.9.3
    setuptools: 67.4.0
    sfftk-rw: 0.7.3
    six: 1.16.0
    snowballstemmer: 2.2.0
    sortedcontainers: 2.4.0
    soupsieve: 2.4.1
    sphinx: 6.1.3
    sphinx-autodoc-typehints: 1.22
    sphinxcontrib-applehelp: 1.0.4
    sphinxcontrib-blockdiag: 3.0.0
    sphinxcontrib-devhelp: 1.0.2
    sphinxcontrib-htmlhelp: 2.0.1
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 1.0.3
    sphinxcontrib-serializinghtml: 1.1.5
    stack-data: 0.6.2
    tables: 3.7.0
    tcia-utils: 1.2.0
    tifffile: 2022.10.10
    tinyarray: 1.2.4
    tomli: 2.0.1
    tornado: 6.3.1
    traitlets: 5.9.0
    typing-extensions: 4.5.0
    tzdata: 2023.3
    urllib3: 1.26.15
    wcwidth: 0.2.6
    webcolors: 1.12
    wheel: 0.38.4
    wheel-filename: 1.4.1
    widgetsnbextension: 4.0.7
    WMI: 1.5.1
    zipp: 3.15.0

Attachments (1)

Screenshot_1492.png (503.5 KB ) - added by u34216@… 2 years ago.
Added by email2trac

Download all attachments as: .zip

Change History (8)

comment:1 by Eric Pettersen, 2 years ago

Component: UnassignedInput/Output
Owner: set to Tom Goddard
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionGLTF centering

Reported by Lukas Sandhop

comment:2 by Tom Goddard, 2 years ago

Thanks Lukas for making the video showing the problem.

I don't think this is a bug in the ChimeraX GLTF export. The GLTF file format does not define a pivot point. It is Blender and Unity that are defining the pivot point. You correctly observe that the GLTF node named "center" has the translation that moves the scene so that 0,0,0 becomes the center of the bounding box of the child models. The surface you show is a child node of the "center" node so it is supposed to be transformed using both its own transform (which has 0,0,0 translation) and the center node transform. This works correctly when used in a Unity application I wrote (LookSee, https://www.rbvi.ucsf.edu/chimerax/data/looksee-mar2023/looksee.html) with the GLTF imported with GLTFast.

So my feeling is that issue is how Blender and the Unity Editor are choosing to place the pivot point. If the placed it at 0,0,0 in the top level scene coordinates of the GLTF then I believe it would rotate about the center of your surface. I don't know why it is not doing that. I don't use Blender. I can try it in Unity.

The reason ChimeraX GLTF export is adding the "center" node is because all the submodels (you have just one) should be centered and it made most sense to not modify all their translations, but instead put them under a parent "center" node that adjusts the coordinates so that 0,0,0 is at the middle of the displayed objects. I still think that is the most sensible approach.

comment:3 by Tom Goddard, 2 years ago

I tried adding a ChimeraX .glb file to a Unity (2023.1.16f1) scene and it does not appear Unity natively handles GLTF files. So I'm not sure what you mean by it doesn't get the right pivot in Unity. I guess you are using some third party GLTF Unity asset.

comment:4 by u34216@…, 2 years ago

We are indeed using a third party Asset because the Khronos Group abandoned the GLTF plugin for Unity.
https://github.com/Siccity/GLTFUtility

But I also tested the gLTFast Plugin used in "LookSee". It shows the same weird placement of the pivot in Unity (screenshot attached). I've wrote a little script to create a bounding box from all the mesh bounding boxes to check if our model has some weirdly placed parts. The bounding box looks fine but the pivot is still way off (screenshot attached). All "subobjects" also have the pivot on the exact same position (no matter if in a Unity Prefab or not). 
I don't understand why the pivot is off or why Unity and Blender create it that way. But files from other 3D modelling programs don't have that issue if exported correctly.

Is it possible that the Protein is translated in ChimeraX and this translation is carried into the export? That's a problem in other 3D modelling programs. The user has to select single object export and not whole scene export since that would export the global position (which might not be 0/0/0). Just a guess. I'm new to ChimeraX and I'm just a media informatics student on an internship, trying to get some 3D models out of ChimeraX. So I might be missing something.

Link to the protein:
https://www.rcsb.org/structure/7lwv


Lukas Sandhop 
(u34216, MINF-18) 

Hochschule Harz 

----- Ursprüngliche Mail -----
Von: "ChimeraX" <ChimeraX-bugs-admin@cgl.ucsf.edu>
An: goddard@cgl.ucsf.edu, "Lukas Sandhop" <u34216@hs-harz.de>
Gesendet: Dienstag, 7. November 2023 22:22:24
Betreff: Re: [ChimeraX] #10108: GLTF centering

#10108: GLTF centering
-----------------------------------+-------------------------
          Reporter:  u34216@…      |      Owner:  Tom Goddard
              Type:  defect        |     Status:  assigned
          Priority:  normal        |  Milestone:
         Component:  Input/Output  |    Version:
        Resolution:                |   Keywords:
        Blocked By:                |   Blocking:
Notify when closed:                |   Platform:  all
           Project:  ChimeraX      |
-----------------------------------+-------------------------
Comment (by Tom Goddard):

 I tried adding a ChimeraX .glb file to a Unity (2023.1.16f1) scene and it
 does not appear Unity natively handles GLTF files.  So I'm not sure what
 you mean by it doesn't get the right pivot in Unity.  I guess you are
 using some third party GLTF Unity asset.

Screenshot_1492.png

by u34216@…, 2 years ago

Attachment: Screenshot_1492.png added

Added by email2trac

comment:5 by Tom Goddard, 2 years ago

The problem you describe is that Blender and Unity don't put the rotation pivot point at the center of the molecular surface from the ChimeraX GLTF. The pivot point is not specified in the GLTF file as far as I know. The world space coordinates 0,0,0 will be centered at the center of the molecular surface, but apparently Blender and Unity are not using that position for the pivot. To resolve this we would first need to know where Blender and Unity are placing the pivot point. Perhaps you can figure out where they have placed the pivot point. If it is at 0,0,0 then the problem would seem to be the import by Blender and Unity. I believe GLTFast correctly opens these files programmatically (not by dragging and dropping) within C# Unity code. I can check that.

comment:6 by Tom Goddard, 2 years ago

I verified that ChimeraX saved .glb file opened with GLTFast in Unity in C# code reports the center of the bounding box of the model at 0,0,0 in world coordinates. So it appears the GLTF centering is working correctly.

That suggests that the method Unity is using to set the pivot is the problem. Perhaps we could fix this if we knew the method Unity uses to position the pivot.

comment:7 by Tom Goddard, 23 months ago

Summary: GLTF centeringMake GLTF output so that importing into Blender sets the center of rotation at center of scene
Type: defectenhancement
Note: See TracTickets for help on using tickets.