当我更改 gluLookAt 时,我只能看到一个点
I can see only a single point when i change gluLookAt
我正在尝试显示一个由 7600700 个点组成的 3D 矩阵,我想获得一个表面为黑色、内部为红色的平行六面体。我有一个平行六面体,它的表面是黑色的,里面是红色的,我使用三个不同的 windows 来显示三个不同的平面图,其中平行六面体的部分并按下一个键可以沿着一个方向移动(在一个 window 沿 x,另一个沿 y,第三个沿 z)一次看一个部分。沿着 z 和 x 移动不会给我任何问题,我可以正确地看到切片计划,但是当我尝试在第三个 window 中显示某些内容时(允许我沿着 y 坐标移动的那个)与 xz 计划平行六面体)我得到不同的东西。如果我写
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
我只得到一个点,但是如果我写
gluLookAt (340.0f, 85.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
或
gluLookAt (85.0f, 85.0f, 526.0f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
我有一个计划。我的平行六面体由 x 的 170 个值、y 的 170 个值和 z 的 263 个值组成,所以我通常以这种方式设置 gluLookAt 的三个参数:我将移动的坐标加倍,我将另一个减半两个坐标。这是我的一段代码:
void fill_array_3() {
g_vertex_buffer_data_3=new GLfloat[3*p_mat_size_tot];
int i=0;
int k=0;
for(int y=0;y<170;y++) {
for(int z=0;z<263;z++) {
for(int x=0;x<170;x++) {
g_vertex_buffer_data_3[i]=(GLfloat)x+0.5f;
g_vertex_buffer_data_3[i+1]=(GLfloat)y+0.5f;
g_vertex_buffer_data_3[i+2]=(GLfloat)z+0.5f;
i+=3;
}
}
}
void display_3(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f);
glPushMatrix();
glRotatef(step15, 1.0f, 0.0f, 0.0f);
glRotatef(step16, 0.0f, 1.0f, 0.0f);
glScalef(step17, step17, step17);
glTranslatef(0.0f, 0.0f, step18);
glTranslatef(step19, 0.0f, 0.0f);
glTranslatef(0.0f, step20, 0.0f);
glMatrixMode(GL_MODELVIEW);
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 3, GL_FLOAT, sizeof(Point), &points3[0].x );
glColorPointer( 3, GL_FLOAT, sizeof(Point), &points3[0].r );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, step21*170*263, 170*263);
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glFlush();
glPopMatrix();
glutSwapBuffers();
}
void reshape_3(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 5000.0f);
glMatrixMode (GL_MODELVIEW);
}
int main(int argc, char** argv)
{
[...]
fill_array_1();
fill_array_2();
fill_array_3();
fill_array();
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600,600);
glutInitWindowPosition (1100, 100);
window_3 = glutCreateWindow(argv[0]);
glutSetWindowTitle("Vista y");
init();
glutDisplayFunc(display_3);
glutReshapeFunc(reshape_3);
glutKeyboardFunc(keyPressed_3);
glutMainLoop();
return 0;
}
感谢您的帮助!!!
有
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
您的观察方向是 (0, 85-340, 0)
,与 (0,-1,0)
的 up
向量共线。 gluLookAt
只会 失败 ,因为您的输入没有描述不同的相机方向。
我正在尝试显示一个由 7600700 个点组成的 3D 矩阵,我想获得一个表面为黑色、内部为红色的平行六面体。我有一个平行六面体,它的表面是黑色的,里面是红色的,我使用三个不同的 windows 来显示三个不同的平面图,其中平行六面体的部分并按下一个键可以沿着一个方向移动(在一个 window 沿 x,另一个沿 y,第三个沿 z)一次看一个部分。沿着 z 和 x 移动不会给我任何问题,我可以正确地看到切片计划,但是当我尝试在第三个 window 中显示某些内容时(允许我沿着 y 坐标移动的那个)与 xz 计划平行六面体)我得到不同的东西。如果我写
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
我只得到一个点,但是如果我写
gluLookAt (340.0f, 85.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
或
gluLookAt (85.0f, 85.0f, 526.0f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
我有一个计划。我的平行六面体由 x 的 170 个值、y 的 170 个值和 z 的 263 个值组成,所以我通常以这种方式设置 gluLookAt 的三个参数:我将移动的坐标加倍,我将另一个减半两个坐标。这是我的一段代码:
void fill_array_3() {
g_vertex_buffer_data_3=new GLfloat[3*p_mat_size_tot];
int i=0;
int k=0;
for(int y=0;y<170;y++) {
for(int z=0;z<263;z++) {
for(int x=0;x<170;x++) {
g_vertex_buffer_data_3[i]=(GLfloat)x+0.5f;
g_vertex_buffer_data_3[i+1]=(GLfloat)y+0.5f;
g_vertex_buffer_data_3[i+2]=(GLfloat)z+0.5f;
i+=3;
}
}
}
void display_3(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f);
glPushMatrix();
glRotatef(step15, 1.0f, 0.0f, 0.0f);
glRotatef(step16, 0.0f, 1.0f, 0.0f);
glScalef(step17, step17, step17);
glTranslatef(0.0f, 0.0f, step18);
glTranslatef(step19, 0.0f, 0.0f);
glTranslatef(0.0f, step20, 0.0f);
glMatrixMode(GL_MODELVIEW);
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 3, GL_FLOAT, sizeof(Point), &points3[0].x );
glColorPointer( 3, GL_FLOAT, sizeof(Point), &points3[0].r );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, step21*170*263, 170*263);
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glFlush();
glPopMatrix();
glutSwapBuffers();
}
void reshape_3(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 5000.0f);
glMatrixMode (GL_MODELVIEW);
}
int main(int argc, char** argv)
{
[...]
fill_array_1();
fill_array_2();
fill_array_3();
fill_array();
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600,600);
glutInitWindowPosition (1100, 100);
window_3 = glutCreateWindow(argv[0]);
glutSetWindowTitle("Vista y");
init();
glutDisplayFunc(display_3);
glutReshapeFunc(reshape_3);
glutKeyboardFunc(keyPressed_3);
glutMainLoop();
return 0;
}
感谢您的帮助!!!
有
gluLookAt (85.0f, 340.0f, 131.5f, 85.0f, 85.0f, 131.5f, 0.0f, -1.0f, 0.0f)
您的观察方向是 (0, 85-340, 0)
,与 (0,-1,0)
的 up
向量共线。 gluLookAt
只会 失败 ,因为您的输入没有描述不同的相机方向。