2016-06-07 8 views
1

Ich versuche, eine Oberfläche einer Geometrie, die ich gezeichnet habe, zu "füllen". Ich verwende GL_TRIANGLE_FAN Primitive. (Zum Beispiel: 1 Hub (Mitte) Punkt und 12 andere Punkte). Ich habe Texturkoordinaten für jeden Eckpunkt im Intervall 0-1 berechnet. Aber als Ergebnis bekomme ich diese **image**, es ist ein wenig verwirrt. Ich möchte so ein Ergebnis erhalten image. Bitte helfen Sie, was ist hier falsch? Wie kann ich richtig Textur berechnen in solchen Triangulation Koordinaten (GL_TRIANGLE_FAN) in den image roten Punkten sind meine PunkteTexturkoordinaten für Dreiecksfans

* Code - Snippet:

assert(("CROSS type intersection needs only 5 vertices : center point and " 
     "rest points in anticlockwise order", (lp->size() > 5) && (lp->size() < 5))); 
osg::Vec3 vAlong_1,vAlong_2; 
vAlong_1 = (*lp)[1] - (*lp)[4]; 
vAlong_2 = (*lp)[1] - (*lp)[2]; 
eps = ((*lp)[2] - (*lp)[4]).length() * 0.2/2; 
vAlong_1.normalize(); 
vAlong_2.normalize(); 

_edgeCoords->push_back((*lp)[0]); 
_edgeCoords->push_back((*lp)[1]); 
if (CMF::euclidDistance((*lp)[0],(*lp)[1]) <= CMF::euclidDistance((*lp)[0],(*lp)[2])) { 
    float cosAlpha = -(vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[2] - (*lp)[1]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[1] + vAlong_1 * (eps + extraLength)); 
    _edgeCoords->push_back((*lp)[2] + vAlong_1 * eps); 
} else { 
    float cosAlpha = (vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[2] - (*lp)[1]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[1] + vAlong_1 * eps); 
    _edgeCoords->push_back((*lp)[2] + vAlong_1 * (eps + extraLength)); 
} 
_edgeCoords->push_back((*lp)[2]); 
if (CMF::euclidDistance((*lp)[0],(*lp)[2]) <= CMF::euclidDistance((*lp)[0],(*lp)[3])) { 
    float cosAlpha = -(vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[3] - (*lp)[2]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[2] - vAlong_2 * (eps + extraLength)); 
    _edgeCoords->push_back((*lp)[3] - vAlong_2 * eps); 
} else { 
    float cosAlpha = (vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[3] - (*lp)[2]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[2] - vAlong_2 * eps); 
    _edgeCoords->push_back((*lp)[3] - vAlong_2 * (eps + extraLength)); 
} 
_edgeCoords->push_back((*lp)[3]); 
if (CMF::euclidDistance((*lp)[0],(*lp)[3]) <= CMF::euclidDistance((*lp)[0],(*lp)[4])) { 
    float cosAlpha = -(vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[4] - (*lp)[3]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[3] - vAlong_1 * (eps + extraLength)); 
    _edgeCoords->push_back((*lp)[4] - vAlong_1 * eps); 
} else { 
    float cosAlpha = (vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[4] - (*lp)[3]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[3] - vAlong_1 * eps); 
    _edgeCoords->push_back((*lp)[4] - vAlong_1 * (eps + extraLength)); 
} 
_edgeCoords->push_back((*lp)[4]); 
if (CMF::euclidDistance((*lp)[0],(*lp)[1]) <= CMF::euclidDistance((*lp)[0],(*lp)[4])) { 
    float cosAlpha = -(vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[4] - (*lp)[1]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[4] + vAlong_2 * eps); 
    _edgeCoords->push_back((*lp)[1] + vAlong_2 * (eps + extraLength)); 
} else { 
    float cosAlpha = (vAlong_1 * vAlong_2); 
    float extraLength = ((*lp)[4] - (*lp)[1]).length() * cosAlpha; 
    _edgeCoords->push_back((*lp)[4] + vAlong_2 * (eps + extraLength)); 
    _edgeCoords->push_back((*lp)[1] + vAlong_2 * eps); 
} 
_edgeCoords->push_back((*lp)[1]); 

_tCoords->push_back(osg::Vec2(0.5,0.5)); 
_tCoords->push_back(osg::Vec2(0.666,0.666)); 
_tCoords->push_back(osg::Vec2(0.666,1.0)); 
_tCoords->push_back(osg::Vec2(0.333,1.0)); 
_tCoords->push_back(osg::Vec2(0.333,0.666)); 
_tCoords->push_back(osg::Vec2(0.0,0.666)); 
_tCoords->push_back(osg::Vec2(0.0,0.333)); 
_tCoords->push_back(osg::Vec2(0.333,0.333)); 
_tCoords->push_back(osg::Vec2(0.333,0.0)); 
_tCoords->push_back(osg::Vec2(0.666,0.0)); 
_tCoords->push_back(osg::Vec2(0.666,0.333)); 
_tCoords->push_back(osg::Vec2(1.0,0.333)); 
_tCoords->push_back(osg::Vec2(1.0,0.666)); 
_tCoords->push_back(osg::Vec2(0.666,0.666)); 
+0

Können Sie Ihren Code posten, der das Bild generiert? – Frecklefoot

+0

Ich habe bereits gepostet –

+1

@CherkesgillerTural Ich bin verwirrt - Was ist das Endergebnis, das Sie wollen, wenn auf dem Lüfter? Sie haben die ursprüngliche Textur veröffentlicht. Möchten Sie jede Zahl gleich groß an den Lüfter anpassen und die gelben Bits verwerfen? –

Antwort

2

Versuchen Sie, die 2d Positionen immer gleich die Texturkoordinaten zu halten für jeden Eckpunkt. Dadurch wird sichergestellt, dass Ihre Geometrie als unverzerrter Ausschnitt Ihrer Textur angezeigt wird. Sie können das Mesh dann beliebig skalieren und zentrieren, ohne die Textur zu verzerren, indem Sie Transformationen auf die Eckenpositionen anwenden.

Eine Möglichkeit, dies zu tun, wäre, eine Funktion zu erstellen, die einen einzelnen Scheitelpunkt verschiebt und die 2D-Koordinaten des Scheitelpunkts sowie alle Transformationen akzeptiert, die Sie anwenden möchten. Die Funktion würde dann die 2D-Koordinaten als Texkoordinaten verschieben, sie dann transformieren und das Ergebnis als Positionen ausgeben.

Verwandte Themen