2

我正在尝试在 opengl 项目上画一条线。

如果我对变换矩阵使用 glTranslatef 函数,则绘制的洋红色线条如图所示:

折线

并且移动视图,线带在不同的点被打断,或者绘制正确,或者根本没有绘制。

如果我手动翻译这些点,线条总是会正确显示。

其他行(红色的: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 声明之前尝试了 pragma pack(1 | 2 | 4),我尝试使用 /Zp1 | 进行编译 /Zp2 | /Zp4(我在 VisualStudio 2008 下)但断线/点仍然存在。

编辑2:

纹理四边形的相同问题:

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();

结果改变视图:

正确绘制

坏 1

坏 2

编辑3:

我能够通过平移 (point.x + offs_x, point.y + offs_y, point.z) 并删除 glVertex 定义中的点坐标来纠正纹理四边形的情况。以前模式中的行为仍然让我感到困惑。

4

1 回答 1

0

尝试在 glPushMatrix() 和 glPopMatrix() 调用之间使用 glLoadIdentity(),因为它会重置坐标系并将平移应用于新矩阵。

于 2013-03-18T09:06:42.277 回答