use*_*679 1 c++ opengl 3d transformation vertex
我有一个非常简单的程序与我的介绍OpenGL的东西.我在屏幕上有3d顶点,整个系统沿y轴旋转.
float rotation =0;
//update function
rotation = rotation +1;
Run Code Online (Sandbox Code Playgroud)
draw函数看起来像这样:
glPushMatrix();
glTranslatef(500,390,0);
glRotatef(rotation,0.0,1.0,0.0);
glVertex3d(365,50,0);
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
当glVertex旋转时,它在屏幕上的位置明显变化.但点的坐标本身并非如此.我如何得到current已通过旋转屏幕上的点的坐标glRotatef,当他们的"实际"的坐标是固定的?
当它们的"实际"坐标是静止时,如何获得由glRotatef旋转的屏幕上的点的当前坐标?
你必须模仿OpenGL转换管道.既然你正在使用老旧的固定功能OpenGL,我将向你展示如何使用老旧的GLU来做到这一点:
首先,我们需要当前的视口和投影矩阵
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
GLdouble projection[16];
glMatrixMode(GL_PROJECTION);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(500,390,0);
glRotatef(rotation,0.0,1.0,0.0);
Run Code Online (Sandbox Code Playgroud)
此时,模型视图矩阵保持应用的模型视图变换,所以也得到这个.
GLdouble modelview[16];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
Run Code Online (Sandbox Code Playgroud)
现在我们有一切都可以投射它.
GLdouble obj_x, obj_y, obj_z; // point coordinates
GLdouble win_x, win_y, win_z; // receives window coordinates
gluProject( obj_x, obj_y, obj_z,
modelview, projection, viewport,
&win_x, &win_y, &win_z );
Run Code Online (Sandbox Code Playgroud)
你去吧 我建议查看MesaGL提供的gluProject源代码.但基本上就是这些步骤:
clip = Projection · Modelview · obj{x,y,z,w}
clip = clip / clip.w;
win{x,y} = viewport{x,y} + viewport{width,height} * (clip{x,y} + 1)/2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |