Fisiere obj cu modele

Se da un fisier obj cu o nava spatiala:

Dupa cum se vede, partea stanga e neagra, se pare ca normalele sunt spre interiorul modelului.

Cumva viewerul asta pare sa poata sa-l afiseze corect totusi. Poate ca doar pare, s-ar putea sa aiba probleme cu iluminarea, dar in viewer nu se observa.

Incerc sa afisez o nava spatiala in proiectul cu sistemul solar si m-am lovit de problema asta… o gramada de fisiere obj free au normalele aiurea. Nu e o problema in proiectul de ray tracing ‘by design’: suprafetele reflecta din ambele parti si normala nu conteaza daca e spre exterior sau interior.

Proiectul cu OpenGL insa are enabled ‘face culling’ asa ca daca normala e pe dos suprafetele nici nu se vad (decat ‘din interior’). Cu ‘face culling’ disabled iluminarea iese aiurea. Normala e folosita pentru a calcula reflexia/etc: SolarSystem/SpaceshipProgram.cpp at 1f09aa11be0d12409183bd9eaace4ce20eef9069 · aromanro/SolarSystem · GitHub

S-a lovit careva de problema asta? Am descarcat cateva fisiere obj free si foarte multe au probleme similare.
Exista vreun workaround simplu?

@scheffgames?

Asa arata un model care nu are problema aia (cel putin nu in parti vizibile mari):

Am in vedere cateva solutii la treba de mai sus, dar nu-s chiar banale si sunt foarte lenes :slight_smile:

Mda. S-ar putea sa fi rezolvat problema, mai vad maine:

Disable ‘face culling’ impreuna cu linia aia. Acum nu vad de ce n-ar merge, mai vad dimineata ca deja e cam tarziu.

1 Like

Nu pot sa-mi dau seama din screenshot ce program folosesti ptr. a vizualiza .obj-urile. Nu stiu sa ma fi lovit vreodata de o problema similara. :slight_smile:

Folosesc regulat Cinema4d ptr. editare/vizualizare 3d. Daca modelele sunt in alt format le import in programul mama (daca il am) si apoi export in .fbx.

Ptr. problema cu normals Cinema4d are o functie de “align normals” - trebuie sa fii in polygon selection mode cred, right click si iti apare optiunea asta. E un clip aici care arata cum. Nu stiu insa daca o sa rezolve problema cu modelul de sus (posibil sa fie modelul, posibil sa fie programul).

PS: Ah, cred ca folosesti un renderer propriu, nu? :smiley: Folosind proiectul cu sistemul solar de pe github? Atunci nu stiu cum sa te ajut, nu sunt familiar cu implementarea under the hood a .obj-urilor. E undeva pe lista crearea unui renderer si/sau game engine dar hat departe in viitor. :stuck_out_tongue:
Tu vad ca esti pasionat de grafica 3d insa!

1 Like

Salut,

Din experienta, cand ai fete negre:

  • normale care nu-s indreptate spre exteriorul modelului
  • geometrie suprapusa sau non-convexa care cauzeaza normalele sa nu se calculeze ok sau sa ai artefacte de genul la render
  • un mesh non-manifold

Acum, e posibil sa trebuiasca refacut tot modelul dar Blender are cateva unelte bune:

  • recalculare de normale automat
  • fixing la non-manifold automat (este in toolboxul de 3d printing)

Sugerez sa deschizi modelul in Blender si sa il repari rapid cu uneltele de mai sus, dealtfel este un obicei bun sa nu ai geometrie suprapusa si sa iti pastrezi un flow bun de poligoane.

2 Likes

Treaba e ca vreau sa functioneze si cu alte obj-uri similare, nu sa rezolv problema intr-un obj particular.

Cred ca astea pe care le-am intalnit nu respecta specificatiile obj, nu doar normalele sunt afectate, poligoanele devin CW, nu CCW cum ar trebui. Probabil au folosit ceva operatie de inversiune ca sa obtina portiunea neagra din cealalta similara…

1 Like

Dupa cum ziceam, as vrea sa mearga nu doar cu obj-ul ala particular ci cu mai multe care au probleme similare.

La recalcularea normalelor m-am gandit si eu, le pot calcula cand incarc fisierul, pentru fiecare vertex, folosind laturile triunghiului. Daca n-ar fi fost si problema cu inversia CCW → CW, faceam doar un dot product cu normala din fisier si daca iesea negativ, bagam un flip la normala din obj si gata. Doar ca au inversat mai mult decat normalele :frowning:

Pana la urma cred ca raman la solutia de mai sus… o sa mut linia aia in main pentru cazul in care implementez si bump/normal mapping.

Din pacate pentru obj-urile luate de pe net deobicei sunt de o calitate slaba (sa nu mai zic ca formatul de obj in sine este interpretat diferit de programe).

Orice ai face, oricum nu scapi de putin editat manual acel obj ca sa fie ok pentru ceea ce il folosesti. Daca ai extra memorie cu care poti sa lucrezi, hackul este sa ai normalele pe ambele parti ale suprafetei, dar operatiile devin scumpe si se complica apoi lucrul cu shadere foarte mult.

Ce am gasit eu ca ajuta, import obj prost in blender si apoi un export in obj din nou … apoi pur si simplu merge.

Bine ai venit in lumea interesanta a softurilor de modelat 3D, unde totul e standardizat dar nu prea!

2 Likes

Problema e ca proiectul permite specificarea unui fisier obj oarecare pentru a fi incarcat, asa ca mai bine sa fie un workaround.

Daca as folosi ceva modele specifice ar fi fost mult mai bine ca fisierul obj sa fie corect (fara face culling e nevoie de mai multe calcule in placa video).

Solutia mea pare ok din ce-am testat pana acum, practic fac flip la normala functie de directia din care ‘priveste’ camera, sa fie orientata potrivit pe fata triunghiului care e spre camera, asa iluminarea (si sper ca in viitor normal mapping-ul) e calculata corect.

Clar ca e asa, specificatiile spun ca anumite culori trebuie multiplicate cu valoarea din textura corespondenta (daca exista, daca nu se foloseste doar culoarea), iar astia pun valoarea culorii pe zero, textura ar fi degeaba daca s-ar respecta specificatiile. Am aplicat tot felul de workarounduri/corectii si acum pare sa incarce si afiseze o gramada de objuri corect.

Am implementat pana si normal/bump mapping si am testat cu un obj care are asa ceva:

Sunt destul de multumit de rezultat, am inchis ‘enhancement’-ul cu afisarea unei nave spatiale.
Acum mai trebuie adaugat si ‘bone animation’ si se poate implementa un joc pe baza acelui cod :slight_smile:

1 Like