Qt 3D研究(三):显示3D模型

Qt 3D研究(三):显示3D模型

上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用。和大家最初接触的glut一样,对于3D应用来说,需要做的准备工作还真不少,不过呢,Qt 3D把一些窗口相关的琐碎事情解决了,剩下的,该由我们完成重要的渲染部分了,可以说,带来了某种程度的方便。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43964499。欢迎同行前来探讨。

我们接下来要使用Qt 3D将一个模型显示出来。Qt 3D内置了obj模型的解析器,可以很方便地导入obj格式的模型。如果想要使用Qt 3D导入ms3d、3ds这样格式的文件,可能需要将Assimp模型解析库和Qt 3D放在一起进行编译,这样才能够顺利地使用。这里我们采用Qt 3D内置的obj模型toyplane来载入并且显示。代码如下:

import Qt3D 2.0
import Qt3D.Render 2.0

Entity
{
    id: root

    Camera
    {
        id: camera
        position: Qt.vector3d( 0.0, 0.0, 40.0 )
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: 16.0 / 9.0
        nearPlane : 0.1
        farPlane : 1000.0
        upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
        viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
    }

    components: FrameGraph
    {
        ForwardRenderer
        {
            clearColor: Qt.rgba( 0, 0, 0, 1 )
            camera: camera
        }
    }

    //! [3]
    Entity
    {
        Mesh
        {
            id: mesh
            objectName: "cube"
            source: "qrc:/toyplane.obj"
        }

        components: [ mesh ]
    }

    Configuration
    {
        controlledCamera: camera
    }
    //! [3]
}

这里![3]的部分就是我们新添加的部分。我们需要使用另外的一个Entity来表示我们要渲染的实体。然后这个实体中包含了Mesh。其中这个Mesh由"qrc:/toyplane.obj"这个路径载入。接着设定了components为[ mesh ],表示让Entity拥有的组件是名为mesh的Mesh component。最后的Configuration表示了程序的相关配置。其中我们要对camera进行交互操作,因此我们设定controlleedCamera为我们的camera,这样我们可以使用鼠标将camera的参数进行相应的改变,从而可以从不同的角度来观察模型了。

程序截图如下所示:

需要说明的是,我们并没有指定光照和材质。我们的玩具飞机模型的土色渲染效果是Qt 3D默认给我们带来的。程序可以通过鼠标进行交互:左键表示以相机向上的向量为轴,对相机进行旋转;右键是以场景原点为中心点,对相机进行旋转。

时间: 2024-08-08 22:08:56

Qt 3D研究(三):显示3D模型的相关文章

Qt 3D教程(二)初步显示3D的内容

Qt3D教程(二)初步显示3D的内容 前一篇很easy,全然就没有牵涉到3D的内容,它仅仅是我们搭建3D应用的基本框架而已,而这一篇.我们将要利用它来初步地显示3D的内容了! 本次目的是将程序中间的内容替换成3D的视图,而这一切也只是十几行代码.要不我们来试一试吧! 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131099.欢迎同行前来探讨. 首先我们须要对我们的MainWindow.cpp文件进行改动,在此基础上加入

Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决

一直以来很多Stage3D开发者都在为3D模型在2DUI上显示的问题头疼.Stage3D一直是在 Stage2D下面.为了做到3D模型在2DUI上显示通常大家有几种实现方式,下面来说说这几种实现方式吧. 实现方式1: 在2DUI上挖个洞透过去显示3D层.这种做法的缺陷在于如果两个UI界面同时打开就会UI错层显示错乱.为了解决这问题很多程序员选择了当挖洞显示3D的UI打时把其他界面隐藏掉,用户体验超差. 实现方式2: 利用Context3D 的 drawToBitmapData API 实时将3D

[WebGL入门]三,3D绘图的基础知识

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 二维和三维 三维空间--我们生活这个这个现实的世界就是一个三维空间. 在三维的世界里,所有的东西都由横,竖,深度.将这些东西重现,就是一个实时3D渲染.但是再现这个3D空间,我们是在一个2D的显示器上来实现的. 电脑和手机的屏幕,都是一个2D的显示器.至少现在还没有一个3D的显示设备,当然,研

Chem 3D中怎么创建立体模型

ChemDraw作为一款很受大家欢迎的化学绘图软件,其在绘制平面化学方面的功能已经非常的强大了,其实它也可以绘制3D图形.Chem 3D就是绘制3D图形的重要组件.而且为了满足不同的用户绘图的需求,可以给大家提供三种方法来绘制3D图形.有的方法需要绘制者对化学立体模型的结构比较熟悉,有的要求对化学式比较熟悉,绘制者可以根据自己的实际情况选择绘制方法.下面就来给大家分享一下Chem 3D中怎么创建立体模型? 原文:http://www.chemdraw.com.cn/ruheshiyong/lit

C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字

C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用PointSprite绘制文字,这可以只用1个点绘制文字,并确保文字始终面相窗口.用PointSprite绘制的文字,其大小范围有限,本篇提供的Demo中,Max Row Width最大只有256.现在能够绘制少量的文字,为其指定的位置的过程与为一个点指定位置的过程是相同的,所以此方式的应用范围还是比较广

使用 Intel GPA 与 分析3D程序和抓取模型

原文链接在这里 http://dev.cra0kalo.com/?p=213 背景信息 Intel的GPA本身是一款图形分析软件,并没有设计从3D程序里抓取模型资源的功能,但这里作者是通过hook GPA应用,让他可以把捕捉到的顶点缓冲和索引缓冲. Intel GPA 64位的下载链接 http://registrationcenter-download.intel.com/akdlm/irc_nas/4674/gpa_14.3_release_231370_windows_x64.msi In

ArcGIS API for JavaScript 4.2学习笔记[2] 显示3D地图

3D地图又叫场景. 由上一篇可知, require入口函数的第一个参数是字符串数组 ["esri/Map", "esri/views/MapView", "dojo/domReady!"] 这里,MapView就是2D的地图视图. 所以,将2D地图改为3D地图,其实很简单,只需要把这个字符串数组的第二个引用改为"esri/views/SceneView" 然后在第二个参数中修改对应的view代码即可. 下面给出第二个参数(函数

C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是解析TTF文件从而得到字形的贴图,然后通过OpenGL绘制贴图的方式显示文字. 本篇记录了解析TTF文件并把所有字形安排到一张大贴图上的过程. 使用FreeType 想从零开始解析TTF文件是一个比较大的工程,所以目前就借助FreeType.FreeType是一个开源的跨平台的TTF文件解析器.当然

跨平台显示MMD模型

过年了,祝大家喜气洋洋,心想事成! 然后呢,过年后,依然进行Qt以及3D的研究.最近翻出以前的技术研究成果,并且花了将近一个月,成功地在移动平台上显示MMD模型了. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/43912325.欢迎同行前来探讨. 首先,花了几周的时间,将MMD模型脚本化,也就是说,可以使用QML定义一个MMD类,指定参数即可显示.这里的移植参照了以前写QML和C++混合的经验,写起来还算好,不过有的时候也