QT3D场景的快速绘制

    QT3D场景提供了一种快速设置3D场景的一种方式,用户凭借着封装好的实体可以快速的在顶层实体(画布)当中增加各种各样的实体,并且通过3DMax软件构造的OBJ文件与QT3D实现信息交互可以的帮助用户摆脱OpenGL的用代码绘制图形的繁琐。本人在做这方面的工作时也看了很多来自CSDN的文章,但是直接将封装好的3D实体放入画布的例子有点少(是不是大家觉得太简单了?),所以作为一个QT 3D建模的小白,我也简要的谈一谈这方面的认识。

    在这里,我们将基于QT3D当中的例程BASIC 3D当中的代码一步步的通过讲解并修改其代码可以真正实现一个基于QT的画布。我们将实现的代码有着如下的性质:

  1. 基于原程序的架构将QT3D的注册以及摄像机摆放都放在了main函数当中,原程序的代码可移植性较差,所以我们将与画布整体显示无关的内容都加入到画布所在的类函数当中。
  2. 由于原有代码是用了QT的基本实体,这种实体不能被用户自行定义,只能从颜色,摆放坐标(setTranslation)等一些有限的设置方式去设置实体。所以我们的目标是逐渐用自己的实体去替换原有程序的基本实体,达到3D建模的初步目的。

这里首先要对QT 3D当中例子代码进行分析,我用到的是QT5.6.0版本,用QT5以上版本的童鞋可以完全参考本丸当中对代码的分析,由于QT5和QT4头文件差别还是蛮大的,所以用QT4的可以大致了解一下思想。(QT4当中有些类在QT5当中是废弃的,而QT5在便宜当中并不会告诉你缺少的头文件,这点非常蛋疼)

首先打开QT,进入到程序初始界面。

在搜索界面输入“3D”,得到的如下图所示。


选择右下角的“QT 3D Basic Shapes C++ Example”工程,得到欢迎界面,此时再次选择这个工程就可以得到工程的源代码如下所示。


QT具有非常好的现代编译器所具有的代码实时查错功能,一些比较基本的语法错误会在你写入代码的时候实时显示出来,所以一旦看到你的代码下面有着一条线(可能是红色的也可能是橙色的)那么就会表明这句话一定是有问题的,而且是较为基本的问题。

下面开始对这个基本的3D程序进行一些分析,在分析之前有必要将这个程序的功能演示以下使得各位对这个程序的大体脉络有一个基本的认识,点击左下角的运行(绿色三角)按钮就可以显示出来本程序基本的3D建模图形如下所示。


在这个程序当中有四个不同形状的QT基本实体,在右边有着与之相关联的四个checkbox,每个CheckBox默认都是选中的,一旦取消选中了某个checkbox那么与之相对应的实体就会消失。下面从代码层面大体上讲一讲功能是如何实现的。

首先就是容器的放置,在本程序当中如果不向QWidget当中放置容器的话那么三维图形就显示不出,因此首先就是搭建可以显示实体的大体环境,代码如下

    Window *view = new Window();//window class
    QWidget *container = QWidget::createWindowContainer(view);
    QSize screenSize = view->screen()->size();
    container->setMinimumSize(QSize(100, 100));
    container->setMaximumSize(screenSize);

这几行代码描述的功能就是创建一个容器和一个窗口类,然后通过setMinimumSize和setMaximumSize设定容器的大小,完成了对容器的初始化。

创建了容器之后就要开始对整体窗口布局进行设计,在QT当中可以用水平布局QHBoxLayout和垂直布局QVBoxLayout分别对窗口布局进行设计,而后仅需将不同的窗口以及实体加入这些布局当中就可以完成设计。综合本例子来看,水平布局以及垂直布局都是我们所需要的,因为左边有一整个窗口去显示整体的环境,右边有4个checkbox待摆放,那么在这两类实体之间的空间上的链接就是用QHBoxLayout去实现相连,而由于右边的信息以及checkbox摆放关系是垂直的,所以要用到垂直布局,代码如下所示。

    QWidget *widget = new QWidget;
    QHBoxLayout *hLayout = new QHBoxLayout(widget);//在widget中加入水平的layout
    QVBoxLayout *vLayout = new QVBoxLayout();//不用参数,因为垂直layout作为组件加入到水平layout当中,也就加入到了widget中
    vLayout->setAlignment(Qt::AlignTop);//在顶端对齐
    hLayout->addWidget(container, 1);//加入容器
    hLayout->addLayout(vLayout);

可以看到,在这段代码当中首先创建了一个QWidget类型的实体,然后分别创建了水平以及垂直布局(hLayout,vLayout),其中水平布局加入了容器,而垂直布局设定顶端对齐,最后用addLayout函数实现了将垂直布局添加到水平布局的功能。

在显示3D图形的过程当中,摄像机是必不可少的,只有摄像机摆放的合适人眼才能看到3D建模的样子。在Qt当中三维图形将实体添加到世界坐标当中然后通过投影的方式去投射到摄像机位置(也就相当于人眼),其中投影到镜头如下面的函数所示。

cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);

其中cameraEntity是新建的camera实体,lens表示了镜头,这个函数有着四个参数,第一个参数是视觉域,第二个是分辨率(这里选择了16比9),第三个参数是近平面摆放位置,最后一个是远平面放置位置,后两个参数的选择当中要特别注意,只有在远近平面之间的物体才会显示,所以要是想全部显示出所加入的实体,那么近平面就要足够近,远平面就要足够远。

而后对于摄像机的参数配置就是要确定摄像机摆放的位置,确定向上的单位向量和确定观察的中心,最后在QtInputAspect当中的实体中加入摄像机就算是完成配置了,具体代码如下所示。

Qt3DCore::QEntity *rootEntity =
  • 11
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值