Texturkoordinaten berechnen



  • Hallo,

    ich arbeite mit Kit3D & Silverlight. Mein Problem ist im Moment Texturkoordianten zu berechen. Ich würde gern eine Funktion wie SphereMapping, CubeMapping oder PlanareMapping implementieren. Nur finde ich leider kaum informationen darüber.

    ich hab mich mal an PlanarMapping probiert, funktioniert aber nicht. Es fehlt eine Ecke.

    http://www.bildercache.de/anzeige.html?dateiname=20090407-201712-50.png

    public Point[] planarmapping(Point3D[] vertices, Vector3D max, Vector3D min)
            {
                Vector3D size = max - min;
                Kit3D.Math.Plane plane = new Kit3D.Math.Plane(vertices[0], vertices[1], vertices[2]);
    
                double cross_X = Vector3D.DotProduct(plane.Normal, new Vector3D(1, 0, 0));
                double cross_Y = Vector3D.DotProduct(plane.Normal, new Vector3D(0, 1, 0));
                double cross_Z = Vector3D.DotProduct(plane.Normal, new Vector3D(0, 0, 1));
    
                Point[] tmp = new Point[3];
                if((Math.Abs(cross_X) > Math.Abs(cross_Y)) && (Math.Abs(cross_X) > Math.Abs(cross_Z)))
                {
                    for (int i = 0; i < 3; i++)
                    {
                        tmp[i].X = ((vertices[i].Y - min.Y) / size.Y);
                        tmp[i].Y = ((vertices[i].Z - max.Z) / size.Z);
                    }
                }
                if((Math.Abs(cross_Y) > Math.Abs(cross_X)) && (Math.Abs(cross_Y) > Math.Abs(cross_Z)))
                {
                    for (int i = 0; i < 3; i++)
                    {
                        tmp[i].X = ((vertices[i].X - min.X) / size.X);
                        tmp[i].Y = ((vertices[i].Z - max.Z) / size.Z);
                    }
                }
                if((Math.Abs(cross_Z) > Math.Abs(cross_X)) && (Math.Abs(cross_Z) > Math.Abs(cross_Y)))
                {
                    for (int i = 0; i < 3; i++)
                    {
                        tmp[i].X = ((vertices[i].X - min.X) / size.X);
                        tmp[i].Y = ((vertices[i].Y - max.Y) / size.Y);
                    }
                }
                return tmp;
            }
    

    Hat jemand vielleicht code oder Literatur Empfehlungen?



  • Fuer planares Mapping projezierst Du einfach Deine Vertices parallel auf eine Ebene.
    Fuer Sphere-Mapping berechnest Du ausgehend von einem Mittelpunkt Laengen- und Breitengrad (und fummelst die Nahtstellen irgendwie zurecht).
    Dein Codeschnippsel macht "Box-Mapping", jedes Polygon wird es auf die Seite einer Box projeziert die am ehesten dessen Ausrichtuing entspricht.
    In wie fern Dein Screenshot sinnvoll ist haengt davon ab ob zwischen Deinen Polygonen gerade ein "Seitenwechsel" stattfindet.
    Generell lassen sich fuer komplexere Modelle keine sinnvollen Texturkoordinaten ohne manuellen Eingriff ermitteln.



  • Also ist doch die Antwort drauf, das es nicht sinnvoll ist zur Laufzeit Texturkoordianten zu berechnen?


  • Mod

    ich glaube er meinte 'cubemappnig'.
    und ich weiss nicht wo du rausliest, dass es nicht sinnvoll ist. er hat dir lediglich erklaert was gaengig ist und was du machst.



  • rapso schrieb:

    ich glaube er meinte 'cubemappnig'.

    "Box-Mapping" findet sich in den meisten 3D-Tools um 'Kisten' zu mappen indem jede Seite planares Mapping bekommt.
    "Cube-Mapping" ermittelt den Schnittpunkt eines Vektors mit einem Wuerfel und verlangt eine Cube-Map.

    Jedes der beschriebenen Verfahren setzt eine bestimmte Form von Geometrie voraus.
    In der Praxis zerlegt man komplexe Geometrie in Teile auf die sich ein geeignetes Verfahren anwenden laesst - daraus resultieren Seams die moeglichst unauffaellig liegen sollen und daher meistens manuell definiert werden.
    Auf der anderen Seite kann die Geometrie auch so komplex sein, dass dafuer kein Mensch manuell UV-Koordinaten erzeugen moechte (oder so simpel dass es nicht notwendig ist).

    Ob die Erzeugung zur Laufzeit sinnvoll ist kommt also ganz darauf an wie Deine Modelle aussehen.



  • Gibt es irgend ein Buchtipp oder Tutorial wo ich das ganze mal nachvollziehen kann und nachprogrammieren kann?


  • Mod

    hellihjb schrieb:

    rapso schrieb:

    ich glaube er meinte 'cubemappnig'.

    "Box-Mapping" findet sich in den meisten 3D-Tools um 'Kisten' zu mappen indem jede Seite planares Mapping bekommt.
    "Cube-Mapping" ermittelt den Schnittpunkt eines Vektors mit einem Wuerfel und verlangt eine Cube-Map.

    oh, sorry, hatte mich versehen, dachte er teilt immer durch die laengste achse.


Anmelden zum Antworten