以下代码中 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
缩放几何体的大小。这些参数指定沿 x
、y
和 z
轴的比例因子。在您的情况下,所有 3 个参数均为 0.003,因此字母缩小为大小的 0.3%,就像没有缩放时一样。
glTranslatef
将字母移动到其位置。参数指定翻译的 x
、y,
和 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 的叉积)。
我无法理解 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
缩放几何体的大小。这些参数指定沿 x
、y
和 z
轴的比例因子。在您的情况下,所有 3 个参数均为 0.003,因此字母缩小为大小的 0.3%,就像没有缩放时一样。
glTranslatef
将字母移动到其位置。参数指定翻译的 x
、y,
和 z
坐标。矢量。
设置投影矩阵时,到近平面和远平面的距离设置为1.0和20.0。由于字母必须位于近平面和远平面之间,因此它们通过沿 z-axis.
的平移移动到该范围glTranslatef(0.0, 0.0, -5.0);
视口 xy-plane 中的位置由第二个翻译定义:
glTranslatef(-4.0, 2.5, 0.0);
另请参阅
关于评论的答案的扩展
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 的叉积)。