2013-03-12 59 views
2

我試圖在opengl項目上繪製線條。如果使用glTranslate虛線

如果我使用的glTranslatef函數來變換矩陣,品紅色線條被拉斷爲顯示在圖中:

Broken line

並移動視圖,所述線帶中的不同點破,或繪製正確,或根本沒有繪製。

如果我手動翻譯點,線條始終正確顯示。

其他行(紅色:GL_LINE_LOOP,青色:GL_LINES)被手動轉換並正常工作。

這裏是glTranslate代碼:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glTranslatef(offs_x, offs_y, 0); 

glLineWidth(2.0f); 
glColor3f(1.0f, 0.0f, 1.0f); 

glVertexPointer(3, GL_FLOAT, 0, trailPoints); 
glDrawArrays(GL_LINE_STRIP,0,numTrailPoints); 

glPopMatrix(); 

和這裏的工作代碼說明書翻譯:

for (i=0; i< numTrailPoints; i++) 
{ 
    translatedTrailPoints[i].x = trailPoints[i].x + offs_x; 
    translatedTrailPoints[i].y = trailPoints[i].y + offs_y; 
    translatedTrailPoints[i].z = trailPoints[i].z; 
} 

glLineWidth(2.0f); 
glColor3f(1.0f, 0.0f, 1.0f); 

glVertexPointer(3, GL_FLOAT, 0, translatedTrailPoints); 
glDrawArrays(GL_LINE_STRIP,0,numTrailPoints); 

我是缺少在這裏?

編輯:

要完成的問題,這裏是數據結構(倒置聲明爲了更好的可讀性):

vec3 translatedTrailPoints[C_MAX_NUM_OF_TRAIL_POINTS]; 
vec3 trailPoints[C_MAX_NUM_OF_TRAIL_POINTS]; 

typedef union 
{ 
    float array[3]; 
    struct { float x,y,z; }; 
    struct { float r,g,b; }; 
    struct { float s,t,p; }; 
    struct { vec2 xy; float zz; }; 
    struct { vec2 rg; float bb; }; 
    struct { vec2 st; float pp; }; 
    struct { float xx; vec2 yz; }; 
    struct { float rr; vec2 gb; }; 
    struct { float ss; vec2 tp; }; 
    struct { float theta, phi, radius; }; 
    struct { float width, height, depth; }; 
    struct { float longitude, latitude, altitude; }; 
    struct { float pitch, yaw, roll; }; 
} vec3; 

typedef union 
{ 
    float array[2]; 
    struct { float x,y; }; 
    struct { float s,t; }; 
} vec2; 

我想第二datenwolf的建議,但沒有成功:我在vec2和vec3聲明之前嘗試過編譯包(1 | 2 | 4),我嘗試使用/ Zp1編譯|/Zp2 |/Zp4(我在VisualStudio 2008下),但虛線/點仍然存在。

EDIT2:

同樣的問題與質感四邊形:

vec3 point; 
point.x = lon; 
point.y = lat; 
point.z = 500; 

glTranslatef(offs_x, offs_y, 0); 

glBindTexture(GL_TEXTURE_2D, iconTextures[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 0.0f); glVertex3f(point.x-C_ICON_WORLD_SIZE, point.y-C_ICON_WORLD_SIZE, point.z); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(point.x+C_ICON_WORLD_SIZE, point.y-C_ICON_WORLD_SIZE, point.z); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(point.x+C_ICON_WORLD_SIZE, point.y+C_ICON_WORLD_SIZE, point.z); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(point.x-C_ICON_WORLD_SIZE, point.y+C_ICON_WORLD_SIZE, point.z); 
glEnd(); 

結果改變視圖:

Correct drawn

Bad 1

Bad 2

EDIT3:

我能夠通過(point.x + offs_x,point.y + offs_y,point.z)平移和去除點來校正紋理四邊形情況下,在座標glVertex定義。以前模式中的行爲仍令我困惑。

+1

「trailPoints」本身有什麼。您正在使用GL_LINE_STRIP。結合頂點數據中不愉快的幾何佈局,這可能會導致奇怪的效果。 – datenwolf 2013-03-12 13:36:41

+0

我仍然迷路,trailPoints包含世界座標中的3d點(x,y,z)的有序列表。問題存在於我測試的這些基元中的任何一個(GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_POINTS),這裏是截圖GL_POINTS:(http://img27.imageshack.us/img27/7018/pointsbroken.png) – Zac 2013-03-12 15:02:49

+0

那麼,這個列表是如何定義的? C struct-s的內存佈局沒有被指定,並且編譯器可能會根據需要添加間隙(除非您將其強制爲打包佈局)。 – datenwolf 2013-03-12 16:04:38

回答

0

嘗試在glPushMatrix()和glPopMatrix()調用之間使用glLoadIdentity(),因爲它重置座標系併爲新鮮矩陣應用平移。

+0

我試過了;但是我必須在LoadIdentity之後旋轉並翻譯模型視圖矩陣以進入我的正確轉換(如果不是,我什麼也看不到),但結果總是是虛線 – Zac 2013-03-18 11:04:18