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 void
CGLScene::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