Laden...

Textur maping-Problem

Erstellt von Himo vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.586 Views
H
Himo Themenstarter:in
58 Beiträge seit 2005
vor 19 Jahren
Textur maping-Problem

Ich weise eine Texture einem objekt zu aber die Textur wird nicht so dargestellt wie ich es wünche,
Unten findet ihr zwei bilder das erste zeigt den objekt wie ich es nicht haben will
http://www.qamislo.com/wene/test/nicht_ok.jpg

Das nächste bild zeigt meine Wünschdarstellung:
http://www.qamislo.com/wene/test/ok.jpg

wer kann helfen??

die Source meines Programms habe ich auch angehängt.

Danke im Vorraus
Him
MedienInformatik Hochschule Bremen

M
456 Beiträge seit 2004
vor 19 Jahren

Das Problem kenne ich. Es liegt am Exporter. Was nimmst du? Maya oder 3DS?
Die Turmmauer besteht ja aus einem einzelnem Quader. Die Eckvertices dieses Objekes werden von mehreren Dreiecken geteilt. Damit werden auch die Texturkoordinaten von mehreren Dreiecken benutzt. Versuche die Eckwände mit voneinander unabhängigen Rechtecken zu modellieren, dann sollte es gehen.
Die Zinnen sehen ja schon ganz gut aus 😉

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

H
Himo Themenstarter:in
58 Beiträge seit 2005
vor 19 Jahren

Oh wie schön dass jemand so schnell antwortet, habe ich nicht gedacht.
Zu erst danke dir..
Ich benutze Cinema4D. ab ich glaube die Lösung mit getrennten Eckwände ist nicht so geschickt(Passt nicht zu gutes Programmieren). Es gibt ja die möglichkeit die Texturprojektion zu verändern, man kann nach wünsch kugelförmige Projektion nehmen oder Fläche- Quader- UVW- Frontalprojektion und s. w.
Aber wie man das mit directX macht weiss ich nicht.
Es gibt bei directX unter "TextureCaps --> properties" verschiedene eigenschaften die das Problem lösen könnten aber ich weiss noch nicht sie im Programm einzubinden. Falls ich es geschaft habe schreib ich dir die Lösung, aber ich hoffe wir kriegen eine schneller antwort von anderen.

Grüsse
Hîmo

M
456 Beiträge seit 2004
vor 19 Jahren

Die Texturprojektionen von Cinema kann Direct3D nicht direkt. Zwar unterstütz D3D sphärische Maps und Cubemaps, diese sind aber mehr für Spiegeleffekte gedacht. Auch 3D Texturen sind für eine einfache Wand ungeeignet. Du könntest zwar Texturen auch projezieren, hast dann aber immernoch das Problem, dass sich mehrere Dreiecke einen Vertex teilen (und damit auch die Texturkoordinaten).
Es wird dir nichts anders übrig bleiben, als zwei Vertices pro Quaderecke zu speichern -Die Geometrie also in Einzelwände zu splitten-.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

I
48 Beiträge seit 2004
vor 19 Jahren

Hmm bin mir zwar nicht sicher doch ich glaube, dass mein Problem ähnlich ist. Oder jedenfalls siehts physisch gleich aus 😉
Ich habe mit der Mesh-Klasse eine Kugel erstellt und ihr eine Textur zugewiesen. Meine kleine Sonne sieht ganz nett aus ausser dass in einem Bereich die Textur ebenfalls so verzogen wird wie bei Himo und ich habe keine Ahnung von was das herrühren könnte. Bin ein Anfänger mit DirectX.

M
456 Beiträge seit 2004
vor 19 Jahren

Das ist genau das gleiche in grün 😉
Die Textur wird einmal um die Kugel gelegt. Das Ende der Textur wird dort wieder and den Anfang der Textur angeschlossen. Es kommt zu Verzerrungen, da sich Dreiecke an dieser Stelle die Texturkoordinaten teilen.
Ist ein Problem am Exporter, der das 3D Modeller Mapping nicht Korrekt überträgt. Normalerweise müssten die Vertices an dieser "Naht" doppelt (mit jeweils korrekter Texturkoordinate) gespeichert werden.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

I
48 Beiträge seit 2004
vor 19 Jahren

Ich versteh so halbwegs wie du das meinst nur habe ich nun keine Ahnung wie ich das ändere. Analog zu einem anderen Projekt hab ichs einfach mal bei mir gleich gemacht. Die Sphere(sonne) nochmals in Vertices konvertieren und die Texturkoordinaten zuweisen. Nur das Ganze ist mir immernoch vollkommen schleierhaft.... ich hab ein wenig mit dem Faktor (0.014f) herumgespielt. Stimmt es, dass ich so die Texturen überlappen kann um schönere Überläufe zu machen? Wieso gibts nur 2 Texturkoordinaten oder besser gesagt hab ich auch net ganz verstanden was Tu und Tv darstellen soll...?

Vertex[] verts = (Vertex[])sonne.VertexBuffer.Lock( 0, typeof( Vertex ), LockFlags.None, sonne.NumberVertices );
for ( int i = 0; i < verts.Length; ++i ) {
  // Koordinaten berechnen
  verts[i].Tu = verts[i].X*0.014f;
  verts[i].Tv = verts[i].Y*0.014f;
}
// lock aufheben
sonne.VertexBuffer.Unlock();

Vielleicht kannst du oder jemand anderst mich von meiner Unwissenheit erlösen... 😉

P
939 Beiträge seit 2003
vor 19 Jahren

Es gibt nur zwei Textur-Koordinaten, weil Texturen zweidimensional sind. Die Koordinaten-Werte bewegen sich zwischen 0.0 und 1.0. Bei Werten ausserhalb wird die Textur gekachelt (es gibt noch andere Optionen, was dann geschehen soll).

v

|
| Textur
|
+-----------------> u

Die Textur wird nun um ein Objekt "geknüllt". Den Objekt-Vertices werden auf geeignete Weise Punkte auf der Textur zugewiesen --> u,v Koordinaten. Beispiel: liegen zwei Vertices räumlich dicht beieinander, die Textur-Koordinaten jedoch weit auseinander, wird die Textur auf der Fläche dazwischen gestreckt.

Damit eine Textur ordentlich gemappt werden kann, muss das Objekt "ausrollbar" sein. Das geht nicht, wenn Vertices an der "Naht" nicht doppelt sind, wie maxE es ausgedrückt hat.

Gruss
Pulpapex

M
456 Beiträge seit 2004
vor 19 Jahren

Es ist hier vielleicht auch sinnvoll eine Kugel manuell zu erzeugen, da Exporter und 3D Modeller mit so was nicht immer klar kommen.
Der Code ist zwar noch aus meiner C++ Zeit und nutzt OpenGL, sollte aber gut auf D3D portierbar sein:


	unsigned numRings = 30, numSegments = 40;
	float alpha, alpha2 , beta, x, xi, y, z, x2, y2 ,u,u2,v,v2;
	float radius = 200;

	glBegin( GL_TRIANGLE_STRIP );
	
	for( unsigned rings = 0; rings < numRings; rings++ )
	{
		alpha = 3.141f / (float)numRings * (float)rings;
		x = sin( alpha );
		y = cos( alpha );

		alpha2 = 3.141f / (float)numRings * (float)(rings+1);
		x2 = sin( alpha2 );
		y2 = cos( alpha2 );

		v = 1.0f / (float)numRings * (float)(rings);
		v2 = 1.0f / (float)numRings * (float)(rings+1);
		
		for( unsigned segments = 0; segments < numSegments+1; segments++ )
		{
			beta = ( 2 * 3.141 ) / (float)numSegments * (float)segments;

			u = 1.0f / (float)numSegments * (float)(segments);

			xi = x2 * cos( beta );
			z = x2 * sin( beta );

			glTexCoord2f( u, v2 );
			glNormal3f( xi, y2, z );
			glVertex3f( xi * radius, y2 * radius, z * radius  );

			xi = x * cos( beta );
			z = x * sin( beta );

			glTexCoord2f( u, v );
			glNormal3f( xi, y, z );
			glVertex3f( xi * radius, y * radius, z * radius );
		}
	}
	glEnd();

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.