以下代码中 glTranslatef 和 glScalef 的输入是什么?怎么运行的?

What is the input for glTransalatef and glScalef in below Code? How it works?

我无法理解 Write 函数中发生了什么。请解释一下 Write 函数的参数值是如何计算的。我了解到 gl 坐标系值位于 -1+1 之间。但是这个程序运行良好。怎么可能?

void Write(double x,double y,double z,double scale,char *s) 
{ 
    int i,l=strlen(s); 
    glPushMatrix(); 
    glTranslatef(x,y,z); 
    glScalef(scale,scale,scale); 
    for (i=0;i <l;i++) 
        glutStrokeCharacter(GLUT_STROKE_ROMAN,s[i]); 
    glPopMatrix(); 
}

以上函数在 window 中的某个位置打印传递的字符串。

void redisplay(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 0.0, 0.0);
    Write(-4.0,2.5,0.0,0.003,"Hello world");
    glFlush(); 
}

void myreshape2 (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);  
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity (); 
    gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef (0.0, 0.0, -5.0); 
}

int main( int argc, char** argv ) 
{ 
    glutInit(&argc, argv); 

    glutInitWindowSize( 1024, 700 );
    glutCreateWindow("introduction"); 
    glutReshapeFunc(myreshape2); 
    glutDisplayFunc(redisplay); 
    //glutKeyboardFunc(keyboard1); 
    glutMainLoop(  ); 
    return(0);    // This line is never reached. 
}

I learnt that gl coordinate system value lies between -1 to +1. But this program is working nicely. How it is possible?

当然,规范化设备 space 在 [-1, 1] 范围内,规范化设备 space 映射到视口。

但是你已经定义了一个透视投影矩阵(见gluPerspective):

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 

投影矩阵描述了从场景的 3D 点到视口的 2D 点的映射。它从眼睛 space 变换到剪辑 space,并且剪辑 space 中的坐标通过除以剪辑坐标。 NDC 的范围是 (-1,-1,-1) 到 (1,1,1)。
在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。
相机平截头体(截棱锥)中的眼睛 space 坐标映射到立方体(归一化设备坐标)。


此外,字母按 glScalef:

缩放
glScalef(scale, scale, scale);

glScalef 缩放几何体的大小。这些参数指定沿 xyz 轴的比例因子。在您的情况下,所有 3 个参数均为 0.003,因此字母缩小为大小的 0.3%,就像没有缩放时一样。

glTranslatef 将字母移动到其位置。参数指定翻译的 xy,z 坐标。矢量。

设置投影矩阵时,到近平面和远平面的距离设置为1.0和20.0。由于字母必须位于近平面和远平面之间,因此它们通过沿 z-axis.

的平移移动到该范围
glTranslatef(0.0, 0.0, -5.0); 

视口 xy-plane 中的位置由第二个翻译定义:

glTranslatef(-4.0, 2.5, 0.0);

另请参阅 ,了解有关 OpenGL 固定功能管线矩阵堆栈的更多解释。



关于评论的答案的扩展

I am beginner in OpenGL. I am sorry if my question is appropriate. glTranslatef(-4.0, 2.5, 0.0); In this how the parameters range is decided ? ( What is max and min value of x,y and z) . It moves the text to left or right. How can I calculate all these things?

您的透视投影定义为:

gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 

在透视投影中,投影矩阵描述了从针孔相机看到的世界中的 3D 点到视口的 2D 点的映射。

z-coordianate 的最小值和最大值由近平面和远平面定义。在您的情况下,近平面为 1.0,远平面为 20.0。由于 z-axis 指向视口之外,这意味着:

1.0 <= -z <= 20.0

视图中的投影区域 space 与视图的 Z 坐标 space 之间的关系是线性的。视场角和长宽比而定。

这意味着视口上投影区域的大小取决于 Z-distance 到视图位置,可以这样计算:

a = w / h
t = tan(fov_y / 2) * 2

x_min = -z * a * -t/2
y_min = -z * -t/2
x_max = -z * a * t/2
y_max = -z * t/2

你的情况:

w     = 1024
h     = 700
fov_y = 65°
z     = -5.0

x_min = -4.66
y_min = -3.19
x_max =  4.66
y_max =  3.19

如果视图space的坐标系是Right-handed坐标系,那么X-axis指向左边,Y-axis向上,Z-axis 超出视图(请注意,在右手系统中,Z-Axis 是 X-Axis 和 Y-Axis 的叉积)。