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
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.
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
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.
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.
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.
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... 😉
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
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.