of course.
看了网上有位大哥的帖子,说:
很多人用OpenGL绘图会遇到一个问题即屏幕坐标向OpenGL坐标转换,在网上流传着如下类似的代码:
=================
对于俺的代码来说,虽然不用对模型矩阵再进行同样的变换过程,但是在物体第二次变换之前,必须保留上一次的变换矩阵。在这个矩阵的基础上进行变换。
什么意思呢?原因就是:
物体绘制过程:
glPushMatrix();绘制;glPopMatrix();
那么中间绘制过程物体的移动或者其他变换过程都要保留下来。
否则,鼠标单击的时候,并不是在变换的基础上进行了,而是从头开始了,你说能对吗?
除非在最后,获取到三维坐标点之后再glPopMatrix()。
所以,在第二次变换之前,应该保留当前的变换矩阵。
在俺的代码中,就是先preMove咯!
=================
但是发现了新的问题,就是对透明物体进行选取的时候,winZ值总是为1.0
网上说“You probably didn't request an alpha channel in the framebuffer.”
具体怎么做呢?
待我研究之后下回分解!
---------------------------------------------------------------------------------
-
有问题请教:
代码如下:
voidCGLScene::Play(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Modelview Matrix
glPushMatrix(); // Push The Modelview Matrix
//Sky.Show();
//Ground.Show();
glPopMatrix();
DrawTargets();
BeginOrtho();
//ArmyBar.Show();
glLoadIdentity();
//glTranslated(Mouse.x,WinRect.bottom-Mouse.y,0.0f); // Move To The Current Mouse
glTranslated(Mouse.x,Height-Mouse.y,0.0f); // Move To The Current Mouse
Mouse.Show();
EndOrtho();
glFlush();
}
glLoadIdentity(); // Reset The Modelview Matrix
glPushMatrix(); // Push The Modelview Matrix
glTranslatef(0.0f,0.0f,-20.0f); // Move Into The Screen 20 Units
glLoadName(TexID); // Assign Object A Name (ID)
Object(3,3,TexID); // Draw The Object
glPopMatrix(); // Pop The Modelview Matrix
voidCGLScene::Object(float width,float height,GLuint texid,GLfloat swap = 1.0f) // Draw Object Using Requested Width, Height And Texture
{
glBindTexture(GL_TEXTURE_2D, texid); // Select The Correct Texture
glBegin(GL_QUADS); // Start Drawing A Quad
glTexCoord2f(0.0f,0.0f); glVertex3f(-width,-height,0.0f); // Bottom Left
glTexCoord2f(swap,0.0f); glVertex3f( width,-height,0.0f); // Bottom Right
glTexCoord2f(swap,1.0f); glVertex3f( width, height,0.0f); // Top Right
glTexCoord2f(0.0f,1.0f); glVertex3f(-width, height,0.0f); // Top Left
glEnd(); // Done Drawing Quad
}
-
voidCGLScene::Selection(void)
{
GLuint buffer[512];
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(512, buffer);
(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix((GLdouble) Mouse.x, (GLdouble) (viewport[3]-Mouse.y), 1.0f, 1.0f, viewport);
gluPerspective(45.0f, (GLfloat) (viewport[2]-viewport[0])/(GLfloat) (viewport[3]-viewport[1]), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
DrawTargets();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits=glRenderMode(GL_RENDER);
SPos3D pos3D=this->GetPos3D();
// Objects Were Drawn Where The Mouse Was
if (hits > 0) // If There Were More Than 0 Hits
{
char zb[256];
sprintf(zb,"x=%f,y=%f,z=%f",pos3D.x,pos3D.y,pos3D.z);
MessageBox(NULL,zb,"Message",MB_OK|MB_ICONEXCLAMATION);
int choose = buffer[3]; // Make Our Selection The First Object
int depth = buffer[1]; // Store How Far Away It Is
for (int loop = 1; loop < hits; loop++) // Loop Through All The Detected Hits
{
// If This Object Is Closer To Us Than The One We Have Selected
if (buffer[loop*4+1] < GLuint(depth))
{
choose = buffer[loop*4+3]; // Select The Closer Object
depth = buffer[loop*4+1]; // Store How Far Away It Is
}
}
}
}