2011-01-15 17 views
3

Ich habe derzeit keine Lösung für die Textur Zuordnung eines Ikosaeders ohne Naht von Pol zu Pol. Das Textur-Mapping dieses Primitivs scheint ein häufiges Problem zu sein, das noch nicht vollständig gelöst ist. Ich habe eine Menge Forschung gemacht und ich habe zur Erzeugung der UV-Koordinaten viele verschiedene Ansätze versucht, die meisten in der Nähe (und kleinste) Ansatz ist dies:OpenGL Ikosaeder Textur Mapping

GLfloat u = 0.5f * (1.0f + atan2(z , x) * (1/M_PI)); 
GLfloat v = acos(y) * (1/M_PI); 

Ein Ikosaeder oder Geosphäre ist Teil verschiedener Open-Source-Frameworks wie jMonkeyEngine oder Geist3D, aber keine der Implementierungen scheint korrekt zu funktionieren. Es sollte nicht unmöglich sein, eine ungefaltete rechteckige Textur abzubilden, oder liege ich falsch? Jedes Code-Snippet ist willkommen.

Ich habe das Xcode-Projekt here hochgeladen, das mit openFrameworks 0.61 für iPhone gebaut wird. Es gibt auch zwei PNG-Dateien, von denen jede eine andere Nahtvariante zeigt.

Antwort

3

Sie müssen Ihr Texturbild ändern, das Texturbild, das Sie haben, ist eine Verzerrung der Kugel, wo der Pol zu einer Linie gedehnt wird. Sie werden dies niemals richtig auf ein Ikosaeder abbilden können Sie würden eine Abteilung mehr wie das Längen- und Breitensystem benötigen, von dem eine solche Verzerrung kommt. Stattdessen benötigen Sie ein Texturbild, bei dem der Pol in mehrere Punkte unterteilt ist. Sie können dies auf einigen Weltkarten sehen, wo sie versuchen, die Verzerrung durch die Abbildung einer Kugel auf eine flache Oberfläche zu minimieren. z.B. http://www.planetaryvisions.com/Project.php?pid=2236

Sie können einige gute Informationen über verschiedene Wege finden, eine Kugel in http://www.vterrain.org/Textures/spherical.html

+0

Vielen Dank für Ihre schnelle Antwort. Sehen Sie sich dazu einmal an: http://projects.stephanschulz.com/assets/Geosphere.swf Dies ist Geosphäre, die mit einem Flash-Framework namens Alternativa3D erstellt wurde. Ich habe die gleiche Textur verwendet und sie auf dem Geosphärenprimitiv abgebildet. Bis auf ein Dreieck am Nordpol scheint die Textur korrekt um die Polyeder gewickelt zu sein. Weiß nicht, wie sie es erreichen, Alternativa3D ist nicht opensource, aber es scheint irgendwie möglich zu sein. Hier ist die Quelle http://projects.stephanschulz.com/assets/geosphere.zip – Stephan

+0

möglicherweise die Gesichter, die die Pole umgeben, könnten Quads mit zwei Vorfallscheitel sein, aber ich denke immer noch, dass ein richtiges Texturbild für ein Ikosaeder weit bevorzugt würde . – wich

+0

Sicher, aber ikosaedrische Texturen sind selten und es gibt keinen Mapserver, der dieses Format bietet. Die Anwendung soll Kartendaten z.B. von Civicmaps ohne Probleme an den Polen, was mit einer stapel- und scheibenbasierten Kugel nicht möglich ist. Ich denke, das ist der Fortschritt beim Einsatz einer Geosphäre. Wie würdest du damit umgehen? – Stephan

3

Fläche Ikosaeder Textur hat eine Topologie einer Kugel. Die Oberfläche einer 2D-Textur hat eine Topologie einer Ebene. Es gibt keinen Diffeomorphismus zwischen Sphäre und Ebene. Das heißt, es gibt keine Abbildung ohne Dehnungen und Risse zwischen der 2D-Textur und der Ikosaederoberfläche.

Es gibt jedoch eine Zuordnung zwischen einer Cubemap und einem Ikosaeder.

+0

Danke mbaitoff. Was meinst du damit ist eine Zuordnung zwischen einer Cubemap und einem Ikosaeder? Ich weiß, dass kein verzerrungsfreies Mapping möglich ist, aber trotzdem wäre ein Ansatz interessant. – Stephan

+0

Es ist, als würde man die Kugel in einen Würfel setzen und dann jeden Punkt auf der Kugel in Richtung der Normalen auf den Würfel blasen. Auf diese Weise erhält man eine gnomonische Projektion auf die 6 Seiten des Würfels, die man in ein Texturbild legt .Es wird auch in dem Link erläutert, den ich gepostet habe. – wich

+0

Ja, es gibt eine beschränkte Verzerrungskartierung zwischen dem Würfel und der Kugel. Es wurde in OpenGL als Erweiterung, dann als ARB, dann als Standard (GL_TEXTURE_CUBE_MAP) implementiert. – mbaitoff