2016-06-07 146 views
1

我試圖「填充」我繪製的某些幾何圖形的表面。我正在使用GL_TRIANGLE_FAN原語。 (例如:1個樞紐(中心)點和12個其他點)。我已經計算了間隔0-1中每個頂點的紋理座標。但結果我得到這個**image**,它有點困惑。我希望得到像那樣的結果image。請幫忙,這裏有什麼不對? 如何計算正確的紋理在這樣的三角座標(GL_TRIANGLE_FAN)在image紅點 是我的觀點三角形風扇的紋理座標

*碼 - 段:

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

你可以發佈你的代碼生成的圖像? – Frecklefoot

+0

我已經發布 –

+1

@CherkesgillerTural我很困惑 - 當你裝上粉絲時,你想要什麼樣的最終結果?你已經發布了原始紋理;你是否想將每個數字都放在相同大小的風扇上,並丟棄黃色的比特? – 2016-06-07 14:40:55

回答

2

儘量保持2D位置總是等於紋理座標爲每個頂點。這將確保您的幾何圖形顯示爲紋理未被扭曲的切口。然後,您可以根據需要重新調整和居中網格,而不會通過將變換應用於頂點位置來扭曲紋理。

做到這一點的一種方法是創建一個函數,它可以推動單個頂點,接受頂點的2D座標以及任何要應用的變換。該函數然後將2d座標推送爲texcoords,然後轉換它們並將結果推送爲位置。