Skip to content

Vertex reordering after import #890

@Phlegmati

Description

@Phlegmati

Describe the bug 💬

How to disable vertex re-ordering on import?

similar to on fbx import settings:

Image

Why?

I tried to bake additional vertices information (for a cloth simulation, a float weight 0 - 1 ) inside another uv-map (channel 2) for my model.
I exported out of blender for unity. Once as .fbx and once as .glb

Image

When I imported my model and ran my script to extract the value per vertex, both models were simulating wrong.

using UnityEngine;

[RequireComponent(typeof(Cloth))]
[RequireComponent(typeof(SkinnedMeshRenderer))]
public class CreateClothFromUVData : MonoBehaviour
{

    public float maxDistDynamic = 0.1f;

    public void Start()
    {
        var cloth = GetComponent<Cloth>();
        var smr = GetComponent<SkinnedMeshRenderer>();
        var mesh = smr.sharedMesh;

        if (!mesh.isReadable)
        {
            Debug.LogError("Mesh is not readable.");
            return;
        }

        Vector3[] renderVertices = mesh.vertices;
        Vector2[] uv3 = mesh.uv3;
        ClothSkinningCoefficient[] coefficients = cloth.coefficients;

        if (uv3.Length == 0)
        {
            uv3 = mesh.uv2;
        }

        if (uv3 == null || uv3.Length != renderVertices.Length)
        {
            Debug.LogError("UV3 channel missing or length mismatch with vertices.");
            return;
        }

        for (int i = 0; i < coefficients.Length; i++)
        {
            float weight = uv3[i].x;
            coefficients[i].maxDistance = maxDistDynamic * weight;
        }

        cloth.coefficients = coefficients;
    }
}

I took a deeper look and saw, that unity (or the import plugins) reordered the vertices (for better performance I guess) on import.
But then my custom created uv channel did not correctly map to vertex indices anymore (textures do btw, I don't know why my channels did not get remapped like normal map too..)

So I disabled "Vertex Order" on fbx import settings and it behaved correctly for the fbx model.

Image

UnityGLTF is missing this option, so it still behaves wrong.

Image

Fixes:

Is there any chance you will add this Option? - Or at least:
Could anyone show me the spot to where to patch it or how to get the right post-import index-mapping-dictionary - or something else?
I took a look inside the source but could not find the script where it reorders the vertices.

Thanks in advance!

Steps to reproduce 🔢

  1. Create a new Unity 6.0 Project, Install UnityGLTF and DracoMesh Compression as package:
{
  "dependencies": {
    ...
    "com.unity.cloud.draco": "5.1.8",
    "org.khronos.unitygltf": "https://github.com/KhronosGroup/UnityGLTF.git"
    ...
  }
}
  1. Download the unity package: unitygltfissue.zip
  2. Import the Package
  3. Open Scene, see for yourself

Optionally you can import the meshes (.glb/.fbx) yourself

Files to reproduce the issue ♻

No response

Editor Version 🎲

6000.0

Render Pipeline and version

URP/HDR/SRP

UnityGLTF Version

2.17

Operating System 👩‍💻

Windows

When does this problem happen?

  • Editor Import
  • Runtime Import
  • Editor Export
  • Runtime Export

Additional Info 📜

No response

Validations 🩹

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions