我正在尝试在 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();
结果改变视图:
编辑3:
我能够通过平移 (point.x + offs_x, point.y + offs_y, point.z) 并删除 glVertex 定义中的点坐标来纠正纹理四边形的情况。以前模式中的行为仍然让我感到困惑。