Jak naprawić złą Collada wyprodukowaną przez FBX?

10

Próbowałem użyć FBX SDK (2011.3.1), aby załadować pliki FBX i zapisać je jako pliki Collada, aby móc importować pliki FBX w Panda3D. Niestety powstałe pliki Collada nie są użyteczne z kilku powodów, między innymi:

  • Istnieje dodatkowa technika specyficzna dla Majów

rozproszony

<diffuse>
    <texture texture="Map__2-image" texcoord="CHANNEL0">
        <extra>
            <technique profile="MAYA">
                <wrapU sid="wrapU0">TRUE</wrapU>
                <wrapV sid="wrapV0">TRUE</wrapV>
                <blend_mode>ADD</blend_mode>
            </technique>
        </extra>
    </texture>
</diffuse>
  • Przypisuje nazwę kanału texcoord, do którego nie ma odniesienia w innym miejscu pliku (w poprzednim przykładzie kodu żadna geometria nie używa „CHANNEL0” ...)

  • Każdy wielokąt jest eksportowany dwa razy, po raz pierwszy z materiałem podstawowym (tylko kolor rozproszony, kolor zwierciadłowy itp.), A drugi raz z materiałem teksturowanym -> podwaja to liczbę wielokątów każdego modelu bez żadnego cennego powodu

W każdym razie wynikowy plik Collada nie może zostać poprawnie otwarty za pomocą OpenCOLLADA lub „dae2egg” Panda3D.

Czy ktoś ma jakieś doświadczenie w tym, jak to „naprawić” i uczynić zrozumiałym przez popularnych i renomowanych importerów Collada, takich jak OpenCOLLADA?

David
źródło
3
Jest to duży problem, który znalazłem w Colladzie: w rzeczywistości nie jest tak strasznie przydatny do przesyłania danych między dowolnymi narzędziami, które twierdzą, że jest to obsługiwane, ponieważ jest to taki nadmiernie uogólniony format. Może zawierać dane niemal dowolnego schematu i nadal być prawidłowym, zgodnym ze standardami plikiem Collada, którego konkretny importer, którego używasz, nie jest w stanie obsłużyć. Jest nieco bardziej użyteczny jako format wymiany danych, gdy masz większą kontrolę nad importerem / eksporterem lub gdy narzędzia generują Colladę, którą lubisz.
1
@Josh: Przynajmniej jest czytelny dla człowieka, w przeciwieństwie do zamkniętych formatów binarnych. Przynajmniej dzięki Collada możesz tworzyć narzędzia i skrypty, które mogą tłumaczyć z jednego zestawu danych na inny. Interop jest co najmniej możliwy , nawet jeśli wymaga dodatkowej pracy.
Nicol Bolas,

Odpowiedzi:

2

Narzędzie AC # jest tutaj Twoim przyjacielem - możesz szybko napisać coś przy użyciu frameworku .NET System.Xml, który iteruje plik wejściowy, wykrywa części, które ci się nie podobają, i eliminuje (lub poprawia) je z dokumentu przed zapisaniem znowu. W rzeczywistości tak właśnie działa XSLT, ale w praktyce zawsze łatwiej mi było napisać kod C # opisujący transformację niż znaleźć tajemniczą składnię XSLT, aby zrobić to samo.

Musisz spojrzeć na „złe” przypadki i dostrzec, co mają ze sobą wspólnego. Na przykład, jeśli wszystkie techniki rozproszone, które mają teksturę używającą texcoord = "CHANNEL0", łatwo to znaleźć. Po prostu iteruj wszystkie obiekty i dla każdego obiektu sprawdź wszystkie jego techniki pod kątem atrybutu obrażającego. Jeśli go nie znajdziesz, dodaj węzeł do dokumentu wyjściowego i przejdź dalej. Jeśli nie rozpoznajesz węzła, dodaj go do wyjścia i przejdź dalej. Jeśli go znajdziesz, nie zawracaj sobie głowy dodaniem go do dokumentu wyjściowego, a zostanie on skutecznie usunięty.

Wykrywanie zduplikowanych wielokątów jest jednak nieco trudniejsze, ponieważ trzeba przeanalizować każdą parę wielokątów pod kątem równoważności. Byłoby o wiele prostsze, gdybyś mógł zdecydować się na regułę, taką jak: „Nie dbam o płaskie wielokąty, tylko teksturowane wielokąty”, wtedy możesz po prostu odrzucić odpowiednie wielokąty.

Jednak wydaje mi się bardzo dziwne, że w rzeczywistości dostajesz duplikaty; powielanie geometrii jest z oczywistych względów wielkim nie-nie, więc jestem zaskoczony, że FBX to zrobiłby. Używałem tylko Collady z Maya / Max, więc nie mogłem ręczyć za to, co produkuje FBX. Ale zapytam, czy jesteś bardzo podwójnie pewien, że tak naprawdę w pliku FBX nie ma zduplikowanej geometrii?

MrCranky
źródło
Dzięki za odpowiedź. Oczywiście mogłem to naprawić we własnym importerze, szukałem tylko kogoś, kto już zetknął się i naprawił dokładnie ten sam problem, aby mieć standardową poprawkę i być może zastosować poprawki do problemów, których jeszcze nie odkryłem.
David
0

Znajdź lub napisz innego eksportera, a może (ponieważ pliki Collada to tylko XML) użyj [XSLT] [1], aby przekształcić niepożądane dane w bardziej uogólnioną formę?


źródło
To pewne, co robię, ale szukałem kogoś, kto już to zrobił (nie wymyślaj koła, prawda?)
David