OpenGL鼠标点击事件

#include <windows.h>    // Windows的头文件

#include <gl\gl.h> // OpenGL32库的头文件
#include <gl\glu.h> // GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件
#include <gl\glut.h> // Glut库头文件

#pragma comment( lib, "opengl32.lib") // OpenGL32连接库
#pragma comment( lib, "glu32.lib") // GLu32连接库
#pragma comment( lib, "glaux.lib") // GLaux连接库
#pragma comment( lib, "glut.lib") // Glut链接库

int screenWidth=640;
int screenHeight=480;

void myInit()
{
glClearColor(1.0,1.0,1.0,0.0); //设置背景颜色为亮白
glColor3f(0.0f,0.0f,0.0f); //设置绘图颜色为黑色
glPointSize(4.0); //设置点的大小为4*4像素
glMatrixMode(GL_PROJECTION); //设置合适的矩阵
glLoadIdentity();
gluOrtho2D(0.0,screenWidth,0.0,screenHeight);

}

void drawDot(int x,int y)
{
glBegin(GL_POINTS);
glVertex2i(x,y); //画一些点
glEnd();

}

void myMouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN)
{
if(button==GLUT_LEFT_BUTTON)
{
drawDot(x,screenHeight-y);
glFlush();
}
else if(button==GLUT_RIGHT_BUTTON)
{
glClearColor(1.0f,0.0f,0.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();

}

}
return;
}


void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT); //清屏
glBegin(GL_POINTS);
glVertex2i(100,50); //画一些点
glVertex2i(100,130);
glVertex2i(150,130);
glVertex2i(320,240);
glEnd();
glFlush(); //送所有输出到显示设备
}

void main(int argc, char **argv)
{
glutInit(&argc,argv); //初始化工具包
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置显示模式
glutInitWindowSize(640,480); //设置窗口大小
glutInitWindowPosition(100,150); //设置窗口在屏幕上的位置
glutCreateWindow("my first attempt"); //打开屏幕窗口

//注册回调函数
glutDisplayFunc(myDisplay);
glutMouseFunc(myMouse);

myInit();
glutMainLoop(); //进入循环
}

转载于:https://www.cnblogs.com/tiandsp/archive/2012/01/22/2328781.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL中,要获取鼠标点击位置的世界坐标,首先需要了解视图矩阵和投影矩阵的作用。 视图矩阵是用来描述相机位置和方向的矩阵,它将场景中的物体变换到相机坐标系下。投影矩阵用来将相机坐标系下的物体投影到屏幕坐标系。当我们点击屏幕时,其实是在屏幕坐标系内进行操作,因此需要找到屏幕坐标系和相机坐标系的转换关系。 我们可以使用以下步骤获取鼠标点击的世界坐标: 1. 获取鼠标点击的屏幕坐标(x, y)。 2. 根据屏幕坐标(x, y)计算标准化设备坐标(NDC, Normalized Device Coordinates)。即将屏幕坐标系的范围映射到[-1, 1]的范围内。 NDC.x = (2 * x) / screenWidth - 1 NDC.y = 1 - (2 * y) / screenHeight NDC.z = 0 (因为我们只关注鼠标点击的位置,不需要深度) 3. 将标准化设备坐标(NDC)转换为裁剪坐标(Clip Coordinates)。使用逆投影矩阵(Projection Matrix的逆矩阵)来完成这一步骤。 Clip = inverse(Projection Matrix) * NDC 4. 将裁剪坐标(Clip Coordinates)转换为相机坐标(Eye Coordinates)。使用逆视图矩阵使用来完成这一步骤。 Eye = inverse(View Matrix) * Clip 5. 将相机坐标(Eye Coordinates)转换为世界坐标(World Coordinates)。这一步骤不需要矩阵变换,因为相机坐标就是世界坐标。 完成以上步骤后,我们就能获取到鼠标点击的世界坐标。 需要注意的是,以上步骤涉及到矩阵的逆运算,所以在计算之前需要保证矩阵可逆。如果矩阵不可逆,可能需要调整相机和投影参数来解决。此外,还需要注意屏幕坐标系和OpenGL坐标系的区别,因为它们的原点位置和轴方向可能不同,需要进行坐标转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值