Skocz do zawartości

[PYTHON] jak dostać się do UV wierzchołków


Gość granat

Rekomendowane odpowiedzi

witam,

mam problem, gdyż moja aplikacja openGL spodziewa się struktury modelu takiej, że muszę pobrać tego typu dane (wierzchołki i w dalszej części indeksy) oto fragment kodu:

 

for object in Blender.Object.Get():

if object.getType() == 'Mesh':

mesh = object.getData()

if (len(mesh.verts) > 0):

saveVerts(filename, mesh, out)

submesh = submesh + 1

 

def saveVerts(filename, mesh, out):

for vertex in mesh.verts:

out.write('%f %f %f ' % (vertex.co.x, vertex.co.y, vertex.co.z))

out.write('%f %f %f ' % (vertex.no.x, vertex.no.y, vertex.no.z))

out.write('%f %f\n' % (vertex.uvco.x, vertex.uvco.y))

 

Problem w tym, że w vertex.uvco mam 0.000000 zamiast właściwych wspolrzednych tekstury dla tego punktu? wiem, ze jak sie dostane przez faces to mam punkty, ale ja potrzebuje dane pojedynczych vertexow tylko, gdyz tak mam napisana cala aplikacje, ze mam punkty i indexy. Wie ktos jak mozna ten problem rozwiazac?

z gory wielkie dzieki za sugestie

 

[edit] widze, ze forum powycinalo mi tab'y dosc istotne na poczatku linii kodu pythona, ale mam nadzieje, ze kazdy sie domysli o co chodzi w kodzie

Edytowane przez granat
Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 5
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Problem w tym, że w vertex.uvco mam 0.000000 zamiast właściwych wspolrzednych tekstury dla tego punktu? wiem, ze jak sie dostane przez faces to mam punkty, ale ja potrzebuje dane pojedynczych vertexow tylko, gdyz tak mam napisana cala aplikacje, ze mam punkty i indexy. Wie ktos jak mozna ten problem rozwiazac?

z gory wielkie dzieki za sugestie

Musisz dostać się przez tri i sam sobie zbudować indeksy - po prostu nie da się zrobić tak jak robisz - po prostu jeden wierzchołek może mieć kilka współrzędnych uv czy normalnych (dodatkowo jak będziesz miał ustawiony set soild (czy soild czy smooth sprawdzisz przez face.smooth) twój skrypt spowoduje błąd - wierzchołek nie będzie zawierać normalnych - będziesz je musiał dla wszystkich wierzchołków w face pobrać z face do którego należą (bo w innym face ten sam wierzchołek będzie miał inną normalną)).

 

[edit] widze, ze forum powycinalo mi tab'y dosc istotne na poczatku linii kodu pythona, ale mam nadzieje, ze kazdy sie domysli o co chodzi w kodzie

Następnym razem użyj znacznika code.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki za odpowiedź, już myśałem, że nikt mi nie jest w stanie pomóc, jednak problem polega na tym, że ja mam właściwe normalne dla każdego wierzchołka tym sposobem, jedyne czego nie mam to wspolrzednych UV.

 

Jak mam dostac sie przez tri? Nie rozumiem, mozesz napisac mi modyfikacje mojego kodu, zebym mogl to zrobic?

 

Ne mogę zmienić struktury moich danych, dlatego algorytm muszę dostosować do niej. Indeksy wyliczam sobie później. Prosze powiedz mi tylko jaki knyf zastosować, aby dostac spodziewane dane UV. (w pythonie programuje od 2 dni dopiero, a blendera od strony pythona tez nie znam za bardzo) poniżej cały kod:

 

#!BPY

import bpy
import Blender

def newFileName(ext):
   return '.'.join(Blender.Get('filename').split('.')[:-1] + [ext])

def saveAllMeshes(filename):
out = open(filename, "w")
verts = 0	
ind = 0
submesh = 0
for object in Blender.Object.Get():
	if object.getType() == 'Mesh':
		mesh = object.getData()
		if (len(mesh.verts) > 0):
			verts = verts + len(mesh.verts)
out.write('vertexCount %i\n' % (verts) )

for object in Blender.Object.Get():
	if object.getType() == 'Mesh':
		mesh = object.getData()
		if (len(mesh.verts) > 0):
			saveVerts(filename, mesh, out)
			submesh = submesh + 1

out.write('subMeshCount %i\n' % (submesh) )

for object in Blender.Object.Get():
	if object.getType() == 'Mesh':
		mesh = object.getData()	
		if (len(mesh.verts) > 0):
			out.write('textureName metal_30.png\n')
			out.write('indexCount %i\n' % ((len(mesh.faces))*3) )

			# Write the index for each triangle coordinates 
			for face in mesh.faces:
				assert len(face.v) == 3
				for vertex in face.v:
					out.write('%i ' % ( (vertex.index)  + ind ) )
			out.write('\n')
			ind = ind + (len(mesh.verts))

def saveVerts(filename, mesh, out):    
   # Write an interleaved vertex array containing vertex coordinates and normals
for vertex in mesh.verts:
	out.write('%f %f %f ' % (vertex.co.x, vertex.co.y, vertex.co.z))
	out.write('%f %f %f ' % (vertex.no.x, vertex.no.y, vertex.no.z))
	out.write('%f %f\n' % (vertex.uvco.x, vertex.uvco.y))

Blender.Window.FileSelector(saveAllMeshes, "Export", newFileName("gldata"))

Edytowane przez granat
Odnośnik do komentarza
Udostępnij na innych stronach

Jak mam dostac sie przez tri? Nie rozumiem, mozesz napisac mi modyfikacje mojego kodu, zebym mogl to zrobic?

	faces = mesh.faces
for f in faces:
	i=0
               for vert in f.v:
                       out.write( '%f %f %f\n' % (vert.co.x, vert.co.y, vert.co.z) )
		if f.smooth:
			out.write('%f %f %f\n' % (vert.no.x, vert.no.y, vert.no.z))
		else:
			out.write('%f %f %f\n' % (f.no.x, f.no.y, f.no.z))
		out.write('%f %f\n' % (f.uv[i].x, f.uv[i].y))
		i=i+1

Teraz masz po kolei wszystkie tri, a tablica indeksów powinna, być 1, 2, 3, 4... lub jej wcale nie musi być (zajmuje to więcej miejsca niż musi, ale trudno tak najłatwiej - jak chcesz to możesz zoptymalizować (np. przez wrzucanie do pliku tylko unikalnych wierzchołków, uv, norm (kolorze, materiale...) i dla każdego przechowywać tablice indeksów))

 

Ne mogę zmienić struktury moich danych, dlatego algorytm muszę dostosować do niej. Indeksy wyliczam sobie później. Prosze powiedz mi tylko jaki knyf zastosować, aby dostac spodziewane dane UV. (w pythonie programuje od 2 dni dopiero, a blendera od strony pythona tez nie znam za bardzo) ...

Struktury nie możesz za bardzo zmieniać, bo najwydajniej karcie podać w VBO (dobra uprościłem nie najwydajniej, ale wydajnie) razem z tablicą indeksów (aby wysyłanych danych było jak najmniej), ale to, że takie dane musisz mieć na wyjściu nie oznacza, że takie musisz mieć na wejściu (wczytujesz z jakiegokolwiek formatu i podczas wczytywania przetwarzasz, na dane wyjściowe). Co do pythona to nie musisz się go uczyć, bo wygodniej Ci będzie (znając inny język), wczytać jakiś prosty format jak obj i skonwertować go do swojego formatu. Ja osobiście w pythonie spędziłem 2 dni w blenderze (na mobilne platformy nie bardzo nadaje się collada, bo za dużo miejsca zajmuje, a za długo trwałoby wczytywanie zasobów z mojego VFS (z kompresją bunzip2), więc musiałem napisać swój eksporter to swojego małego binarnego formatu z obsługą kości), i za długo w skryptach w swoim silniku (jego wybranie nie było najszczęśliwszym wyborem i każdy czas to za długo ;p).

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki serdeczne, jednak,

jak chcesz to możesz zoptymalizować (np. przez wrzucanie do pliku tylko unikalnych wierzchołków, uv, norm (kolorze, materiale...) i dla każdego przechowywać tablice indeksów)).
jak moge to zrobic?

Poniewaz tak jak pisałem, nie mogę zmienić formatu danych, czyli muszę mieć listę unikalnych wierzchołków a póżniej indeksy kazdego submesha do nich tak jak zapisuje moj programik, dlatego nie robilem pętli na trójkątach (wiedzialem ze z nich moge dostac prawidlowe UV), problem w tym, ze musze miec unikalne wierzcholki tylko. Pozniej jak bedzie mi to dzialac, to sobie zmienie na binarke, bo robie to wlasnie na telefon, gdzie wydajnosc to kluczowa sprawa, zarowno czasowa jak i pamieciowa, w dodatku cala moja aplikacja korzysta wlasnie z takiej struktury wlasciwosci klasy o jakiej wyzej wspomnialem, wiec nie za bardzo chce zmieniac format.

 

Moglbys mi zatem doradzic, jak bym mogl z tego Twojego sposobu wyluskac unikalne wierzcholki, aby strukture dostosowac do wymaganej ?

 

BTW masz moze gg, albo skype'a ?

Odnośnik do komentarza
Udostępnij na innych stronach

jak moge to zrobic?

Poniewaz tak jak pisałem, nie mogę zmienić formatu danych, czyli muszę mieć listę unikalnych wierzchołków a póżniej indeksy kazdego submesha do nich tak jak zapisuje moj programik, dlatego nie robilem pętli na trójkątach (wiedzialem ze z nich moge dostac prawidlowe UV), problem w tym, ze musze miec unikalne wierzcholki tylko.

Jak to jak? Idziesz po face i sprawdzasz czy masz już to w tablicy wcześniej... jak tak to zapisujesz do indexu numer... indeksu, a jeśli jeszcze nie miałeś takich danych to dopisujesz je na końcu i do indeksu dajesz odpowiedni indeks. Problem w tym, że wtedy będzie mało zajmował... ale będziesz musiał go jeszcze przetworzyć w programie (opengl i dx nie przyjmą Ci innych indeksów dla normalnych i innych dla wierzchołków)... czyli przeciwnie niż piszesz nie musisz, a nawet nie możesz mieć unikalnych wierzchołków! Musisz mieć unikalne zestawy wierzchołek, uv, normalna, więc jak różni się np. współrzędna x w normalnej to musisz zapisać nowy wierzchołek, uv i normalną (oraz kolor etc jeśli używasz) i w indeksie dać nową wartość... zapisując n indexów do n różnych tablic zaoszczędzisz miejsca (choć nie zawsze), ale będziesz musiał przetworzyć dane w programie.

 

Pozniej jak bedzie mi to dzialac, to sobie zmienie na binarke, bo robie to wlasnie na telefon, gdzie wydajnosc to kluczowa sprawa, zarowno czasowa jak i pamieciowa, w dodatku cala moja aplikacja korzysta wlasnie z takiej struktury wlasciwosci klasy o jakiej wyzej wspomnialem, wiec nie za bardzo chce zmieniac format.

Format wejściowy nie ma nic do tego ile pamięci użyjesz i ile jak wydajnie będzie się renderować (ale fakt może dłużej wczytywać (trzeba doliczyć czas przetwarzania))

 

BTW masz moze gg, albo skype'a ?

Konta mam, ale nie używam - używam praktycznie tylko jabber i irc.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności