当前位置: 首页 > news >正文

QT三维图形2

我们再定义一下鼠标事件。

首先定义两个全局变量,以及判断鼠标是否按压下去的量:

int lastPosX, lastPosY;
int currentPosX, currentPosY;
int pressFlag = 0;
void My3DDisplayWidget::mousePressEvent(QMouseEvent *event) {
	QPoint qf = event->pos();
	lastPosX = qf.x();
	lastPosY = qf.y();
        pressFlag = 1;
	QOpenGLWidget::mousePressEvent(event);
}

上面的函数中,鼠标按下后。我们设置上一个坐标量是当前按下的位置。然后

void My3DDisplayWidget::mouseMoveEvent(QMouseEvent *event) {
	if (pressFlag == 1) {
		QPoint pf = event->pos();
		currentPosX = pf.x();
		currentPosY = pf.y();
		yRot += (currentPosX - lastPosX);
		xRot += (currentPosY - lastPosY);
		lastPosX = pf.x();
		lastPosY = pf.y();
		update();
	}

	QOpenGLWidget::mouseMoveEvent(event);
}

移动的时候,我们就分别让y的旋转量代表鼠标左右移动的量,x旋转量代表鼠标上下移动的量(大家可以去看看三维坐标轴是怎么定义的)。然后update()来更新整个换面显示区。

最后是鼠标松开事件:

void My3DDisplayWidget::mouseReleaseEvent(QMouseEvent *event) {
	pressFlag = 0;
	QOpenGLWidget::mouseReleaseEvent(event);
}

接下来,是最重要的绘制函数

void My3DDisplayWidget::paintGL()

我们一点一点来讲:

首先先设置视口的长宽比:

之前在QT绘图中详细讲解过两节关于视口和窗口之类的关系,大家可以去看。

	int w = width();
	int h = height();
	int side = qMin(w, h);
	glViewport((w - side) / 2, (h - side) / 2, side, side);

然后清空缓存,主要就是设置一下界面颜色。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//

在绘制大的立方体的时候(只绘制三个面),我们设置透明,并取消深度检测:

        glEnable(GL_BLEND);
	glDisable(GL_DEPTH_TEST);
	vbo.create();
	vbo.bind();
	vbo.allocate(vertices, 36 * 2 * sizeof(GLfloat));

	GLuint vPosition = program->attributeLocation("vPosition");
	program->setAttributeBuffer(vPosition, GL_FLOAT, 0, 3, 0);
	glEnableVertexAttribArray(vPosition);


	vbo.write(36 * sizeof(GLfloat), colors, 36 * sizeof(GLfloat));
	GLuint vColor = program->attributeLocation("vColor");
	program->setAttributeBuffer(vColor, GL_FLOAT, 36 * sizeof(GLfloat), 3, 0);
	glEnableVertexAttribArray(vColor);

	QMatrix4x4 matrix;
	matrix.perspective(45.0f, 1, 0.1f, 100.0f);//(GLfloat)w/(GLfloat)h
	matrix.translate(0, 0, -3.0);
	matrix.rotate(xRot, 1.0, 0.0, 0.0);
	matrix.rotate(yRot, 0.0, 1.0, 0.0);
	matrix.rotate(zRot, 0.0, 0.0, 1.0);
	program->setUniformValue("matrix", matrix);

	// 绘制
	for (int i = 0; i<3; i++)
		glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4);

都是些常规操作,把整个图形画出来。

然后更新顶点,设置深度测试,取消混合,画出小的立方体:

//更新顶点位置
	updateVetices();
	glDisable(GL_BLEND);
	glEnable(GL_DEPTH_TEST);

画完以后显示如下:

因为大立方体和小立方体初始的时候是重合的,所以这个时候我们看不到大立方体的效果。

相关文章:

  • QT三维图形3
  • QT三维图形4
  • icache的方面以及使用
  • cmp bne 以及sub指令的详解
  • 关于ARM Cortex a 系列的看门狗定时器
  • C语言之 认识可变参数
  • ARM cortex a 的SDRAM (DDR)
  • C语言 之递归函数
  • C语言 之建立静态链接库
  • ARM的PWM定时器1
  • RTC闹钟的中断处理方法以及程序设计
  • altium designer 制作元器件封装库
  • VTK的Mapper
  • VTK交互系统 1 交互模式入门
  • VTK显示像素图
  • 2017-08-04 前端日报
  • android图片蒙层
  • Angularjs之国际化
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • express + mock 让前后台并行开发
  • leetcode46 Permutation 排列组合
  • React Native移动开发实战-3-实现页面间的数据传递
  • RxJS: 简单入门
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 闭包,sync使用细节
  • 从0实现一个tiny react(三)生命周期
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 京东美团研发面经
  • 排序(1):冒泡排序
  • 前端之React实战:创建跨平台的项目架构
  • ​什么是bug?bug的源头在哪里?
  • # include “ “ 和 # include < >两者的区别
  • #if和#ifdef区别
  • #include到底该写在哪
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (3)选择元素——(17)练习(Exercises)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (待修改)PyG安装步骤
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET 回调、接口回调、 委托
  • .net快速开发框架源码分享
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • :如何用SQL脚本保存存储过程返回的结果集
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ SNOI 2013 ] Quare
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++]unordered系列关联式容器
  • [docker] Docker容器服务更新与发现之consul
  • [go 反射] 进阶
  • [LitCTF 2023]Http pro max plus
  • [MongoDB]------windos下的安装部署与基础使用