Qt 3D 汽车仪表盘

============================================================================

在这里插入图片描述
在这里插入图片描述

============================================================================


一、3D模型的制作

3D模型的制作有多种软件,如Blender、maya、3dmax等等。Blender当前可以免费使用,学习起来也不难,网上有很多视频教程。

1、制作仪表盘模型

首先要建模型,这里模型主要有表盘,指针,数字刻度值等等,颜色图形使用贴图制作。贴图是用图形软件制作,也可以网上找质量好的图片做贴图。仪表盘中刻度,是真实的模型,刻度值也是模型。

  • 仪表盘
    在这里插入图片描述
  • 仪表盘贴图:
    贴图有金属质感

在这里插入图片描述

在这里插入图片描述


2、制作汽车模型

曲面模型制作有难度,贴图时有点变形,因为技术水平有限。模型制作好后,图片贴上去,效果如图

  • 汽车模型
    在这里插入图片描述

  • 汽车模型一部分贴图

在这里插入图片描述

.
在这里插入图片描述


3、制作仪表指针模型

  • 制作模型

模型有很多曲面,需要耐心调整,水平有限,献丑了。
模型制作好后,分别贴上红色贴图和金属贴图
在这里插入图片描述

  • 指针贴图
    指针贴图
    在这里插入图片描述

4、其他贴图

  • 背景贴图

在这里插入图片描述

  • 标志贴图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、模型导入Qt中

1、Scene3D类型

Scene3D类型用于将Qt3D场景集成到QtQuick 场景中。Scene3D类型将由Entity提供的Qt3D场景渲染到多重采样的Framebuffer对象中。每个应用程序实例化一个以上的Scene3D实例。原因是Scene3D实例实例化了场景下的整个Qt 3D引擎(内存管理器,线程池,渲染…)。

    Scene3D 
    {
        width: 1920
        height: 720
        x: 0
        y: 0
        focus: true
        aspects: ["input", "logic"]
        cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
        antialiasing: true
        Entity {}
    }

2、 Entity 类型

Entity 实体是一个Node子类,可以聚合几个Component3D实例来指定它的行为。实体本身就是一个空壳。实体对象的行为由其引用的Component3D对象定义。每个Qt3D后端方面都将能够通过识别实体由哪些组件来解释和处理实体。一个方面可能决定只处理由单个Transform组件组成的实体,而另一个方面可能会专注于MouseHandler。

    Entity 
    {
        id: InstrumentPanel
         property int rotateAngleY: 0.0
         property int sceneRotate: 45
            
             //定义一个摄像机
        Camera 
        {
            id: camera
            projectionType: CameraLens.PerspectiveProjection
            fieldOfView: 30
            //aspectRatio: _window.width / _window.height
            onAspectRatioChanged: console.log(
                                          "aspectRatio = " + aspectRatio)
            aspectRatio: 16 / 9
            nearPlane: 0.1
            farPlane: 1000.0
            position: Qt.vector3d(0.0, 80.0, 10.0)  // 场景的x、y、z坐标位置。
            viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
            // upVector: Qt.vector3d(0.0, 10.0, 0.0)
        }

        //该OrbitCameraController类允许控制沿轨道路径的场景摄像机
        OrbitCameraController 
        {
             camera: camera
        }
            
        //Qt Quick Components提供了一组用于构建用户界面的QML组件。
        //这些组件允许界面接受用户输入并提供反馈指示。
        components: 
        [
        RenderSettings 
        {
            activeFrameGraph: ForwardRenderer 
            {
                 clearColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
                 camera: camera
            }
        },

        //允许输入设备控制
        InputSettings { }
        ]
        
        SceneLoader{}
        Transform{}
        Entity {}
    }

3、SceneLoader{}

给定3D源文件,SceneLoader将尝试对其进行解析,并使用适当的GeometryRenderer,Transform和Material组件构建一个Entity对象树。加载程序将尝试根据模型文件的属性确定最佳材料。如果您希望使用自定义材质,则必须遍历树并用您的材质替换默认的关联材质。SceneLoader加载完整的场景子树。如果要加载单个几何图形,则应改为使用“网格”。
SceneLoader在内部依靠插件的使用来支持各种3D文件格式。

下面是导入左边仪表盘模型


   SceneLoader 
   {
        id: LeftInstrumentPanel   
         source: "qrc:/models/leftdial.qgltf"    
          onStatusChanged:
           {
                 console.log("status is " + status)
                  if (status == SceneLoader.Ready) 
                  {
                       finishLoad3D()
                  }
           }
   }
          
   //使用通过仅使用4x4矩阵中提供的一种变换,它可以将旋转,缩放,平移和剪切组合在一起
   Transform
   {
       id: LeftTransform
       matrix:
       {
           var m = Qt.matrix4x4()
            m.scale(4.0)
            return m
       }
   }
    //
   Entity
   {
       id: rightEntity
       components: [LeftInstrumentPanel   , LeftTransform]
   }

下面是导入左边指针模型


   SceneLoader 
   {
       id: Leftpointerscene
       source: "qrc:/models/leftpointer.qgltf"
       onStatusChanged:
        {
               console.log("status is " + status)
               if (status == SceneLoader.Ready) 
               {
                     finishLoad3D()
               }
        }
   }
   
   Transform 
   {
       id: LeftpointerTransform 
       matrix: 
       {
            var matirx = Qt.matrix4x4()
            matirx.scale(4.0)
            return matirx.times(rotateAround(Qt.vector3d(-7, 0, 0),
                                                  leftpointerRotation,
                                                  Qt.vector3d(0, -1, 0)))
       }
   }
   
   Entity 
   {
       id: pointerEntity
        components: [Leftpointerscene, LeftpointerTransform ]
   }

4、添加灯光

场景中添加一个灯光,设置它的位置和颜色以及强度。灯光是场景的灵魂,场景中具有镜面反射,漫反射的材质各种,通过灯光体现出来。


  //灯光实体
  Entity 
  {
      components: [
          Transform {
              translation: Qt.vector3d(-100, 80, -30.0)  //灯光三维坐标
          },
          PointLight {
              color: "white"   //灯光颜色
              intensity: 0.50   //灯光强度
          }
      ]
  }
  

5、指针旋转

引入一个变量 worker.data,控制指针的位置。


    RotationAnimation on leftpointerRotation 
    {
        id: pointerRotationAnimation
        easing.type: Easing.Linear  //旋转方式:线性旋转
        from: 0.0 //起点位置
        to: worker.data   //旋转变量输入
        //direction: 1000
        //duration: 10000
        // loops: -1
    }
    

三、程序运行效果截图

在这里插入图片描述

Qt中导入汽车模型(可做行驶动画效果)

在这里插入图片描述
在这里插入图片描述
比较完整的实例:

在这里插入图片描述
在这里插入图片描述

四、Qt 3D 资产调节管道

资产调节管道负责将资产文件转换为对预期任务有用的格式。剥离不必要数据的资产,然后将剩下的内容转换为渲染引擎可以轻松高效地使用的数据格式。保存的模型文件可能包含大量与应用程序无关的额外数据,从而导致更大的存储需求,以及更多的加载时间和运行时使用时间。

例如,如果我们查看存储在Blender文件(.blend)中的数据,除了包含几何数据之外,还有一些特定于Blender编辑器和渲染器的信息。 信息,例如编辑器的布局,撤消堆栈,修饰符,详细程度等。 还存在其他一些非常大的数据,例如高多边形模型,这些模型被雕刻并用于烘焙法线贴图等其他资源。 因此,即使对于非常简单的模型,编辑器保存的文件也可能包含很多不必要的数据,这些数据仅占用部署捆绑包中的空间,并且在某些情况下,该文件中的数据并不是我们使用方式的最有效格式。

因此,除了Assimp场景解析器插件外,我们还有一个用于加载GL传输格式(glTF)资产的插件,glTF旨在为应用程序有效地传输和加载3D场景和模型。 捆绑为glTF的资产具有捆绑的几何数据,纹理和着色器,这样Qt 3D可以轻松地将这些资产上传到GPU,并在Qt 3D场景中使用它们。 因此,我们选择glTF作为用于资产调节工具的格式。

1、qgltf介绍:

Qt工具qgltf是与Qt 3D模块捆绑在一起的应用程序。 它是与qmake或moc相同的宿主工具,它是在宿主计算机上构建和运行的。 qgltf的目的是获取使用数字内容创建工具创建的任意3D资源,并将其转换为glTF,glTF将由上述glTF场景解析器插件加载到Qt 3D场景中。 通过使用qgltf工具中捆绑的Open Asset Importer库,我们能够将Assimp场景解析器可以加载到glTF中的相同文件转换为有效加载。这也意味着可以减少目标系统上Qt库的依赖项数量。这对于嵌入式系统尤其重要:当在构建期间将资产烘焙为通用,高效的格式。

2、qgltf的用法:

如果在安装Qt的同时安装了Qt 3D模块,则qgltf工具与其他Qt工具(qmake,moc,uic)位于同一路径。 如果将qmake用作构建系统,则还可以在构建应用程序时使qgltf自动运行。 首先在qmake项目文件中列出3D模型文件,例如:

QT3D_MODELS += assets/car.obj
QGLTF_PARAMS = -b -S
load(qgltf)

这会将OBJ文件转换为glTF格式的文件,并将其与所有几何图形文件和图像文件一起添加到Qt资源文件(.qrc)中。 要在Qt 3D应用程序中使用该模型,您只需要通过将生成的文件设置为SceneLoader中的源来加载它即可。其他所有内容均由构建系统自动管理。


>SceneLoader 
>{ 
>   source:“ qrc:/models/car.qgltf”
>}


水平有限,多指教!

…遗漏的地方再补充

  • 17
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一种跨平台的C++开发框架,它提供了丰富的GUI组件库,使得开发者可以轻松地设计和创建各种控件和界面。自定义控件从一定程度上方便了程序的编写,让程序更加直观,使用得当的自定义控件可以让程序增添不少精彩细节。仪表盘是一种比较常见的自定义控件,它可以用来显示实时数据,例如速度,油量,温度等等。下面来简单介绍一下用Qt自定义一个仪表盘的一些步骤。 首先要构思好仪表盘的外观和功能,比如可以考虑盘的大小,采用什么颜色,显示哪些数据等等。 其次,需要用Qt中提供的基础控件(如QPainter、QPoint、QRect)来构建自定义控件的各个部分,包括盘表、指针、刻度等,然后为这些部分设置合适的属性(如颜色、位置、宽度等)。 接着,需要实现控件的数据传递和刷新。一般情况下,会使用定时器或者事件触发来更新控件显示的数据。考虑到仪表盘是一种实时显示数据的控件,所以在设计数据刷新时需要保证刷新频率足够高,否则会出现卡顿、显示延迟等问题。 最后,为了方便其他的开发者使用该自定义控件,可以将其打包成独立的Qt插件,或者直接将自定义控件的源代码公开发布。 以上就是简单的Qt自定义控件仪表盘的一些步骤,开发者可以根据自己的需求进行相应更改和优化。总之自定义控件并不是一件简单的事情,但是如果能够掌握好最基本的知识,就能够创造出更加精美、实用的自定义控件。 ### 回答2: Qt自定义控件仪表盘可以用于需要展示数据的界面设计。通过自定义仪表盘,可以实现不同样式和功能的展示,并且能够满足不同场景下的需求。 在Qt中,仪表盘的设计可以通过绘图、圆弧、指针和动画的实现,使得界面更加直观、美观,也更加容易被用户理解和操作。可以通过Qt提供的QPainter绘图工具绘制圆弧,也可以通过QTimer控制指针的动画效果。 另外,仪表盘也是可以与其他控件进行绑定的。通过信号与槽的机制,可以将仪表盘的数值与其他控件进行绑定,实现更加复杂的界面功能。 需要特别注意的是,仪表盘的设计需要考虑到不同屏幕分辨率的适配性。通过使用Qt提供的屏幕适配机制,可以实现不同分辨率下的仪表盘展示效果。 总之,Qt自定义控件仪表盘是一个非常实用、优雅的设计元素,可以帮助开发者快速开发出漂亮的界面,并且提高用户体验。 ### 回答3: Qt是一个强大的C++跨平台框架,自带了很多常用的UI控件,但是有时候我们也需要自定义一些控件来满足我们的需求。今天我们来介绍一下如何使用Qt自定义一个仪表盘控件。 首先我们需要继承QWidget类,命名为Dashboard。然后我们需要在Dashboard的构造函数中初始化一些常量,比如外部圆弧的宽度、内部圆弧的半径等等。接着我们需要重写paintEvent函数,绘制仪表盘的外部圆弧、刻度、指针等等,具体绘制方式可以根据需求灵活设置。 为了使仪表盘可以在Qt Designer中拖拽使用,我们需要在Dashboard类中加入QIB_DESIGNER_EXPORT_WIDGETS宏。最后在.pro文件中添加如下代码: ``` QT += designer TARGET = Dashboard TEMPLATE = lib HEADERS += Dashboard.h SOURCES += Dashboard.cpp QIB_DESIGNER_EXPORT_WIDGETS(Dashboard) ``` 这样我们就可以在Qt Designer中使用Dashboard自定义控件了。当然,使用自定义控件也需要相应的信号槽机制来进行交互操作。 总的来说,自定义控件可以更好地满足我们的需求,同时也可以提高界面的美观度。在自定义控件的过程中,我们要考虑到控件的可扩展性、易用性以及代码的可维护性等方面,并在不断地改进和优化中,不断提高自己的技术水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值