一.介绍
quick3d是把qt3d部分以插件的形式导出,在QML中通过包含的形式来进行使用的。
quick3d部分,使用的包含有
import Qt3D 1.0 import Qt3D.Shapes 1.0 |
Import Qt3D是包含主要的一些Qt3D模块,而Qt3D.Shapes包含的是一些立方体,球体,圆柱体等的信息,方便使用各种简单模型。
二.具体的说明(这里没有按照原来的意思翻译,只根据个人理解)
QMLBillboardTransform Element公告牌,实现一个变化使对象一直朝向摄像机。
QMLCameraElement摄像机,定义一个视口的位置和投影3D场景
QMLEffectElement定义一些简单的效果,包含材质 纹理 灯光等
QML FloatingItemElement定义一个二维放置在3D可视化区域内的深度
QMLItem3DElement将存储一个3D对象,并且包含所有简单3D操作的属性和方法
QMLLightElement一些灯光参数的描述
QMLLightModelElement定义场景中灯光的模型
QMLLookAtTransformElement提供一种变化使对象面向摄像机,具体意思需要自己理解
QMLMaterialElement描述OpenGL中的材质属性
QMLMeshElement对载入一些模型文件的支持,还有一些操作等
QMLQt3dElementqt3d全局对象,为3d应用程序提供一些有用的功能
QMLRotation3DElement提供3d空间中的旋转变化
QMLScale3DElement提供3d空间中的缩放变化
QMLShaderProgramElement提供着色器语言的支持,这个需要GPU的支持。
QMLStereoViewElement定义一个布局可以使用左右视角图像,这个的作用是立体视觉效果,他分别从左右眼的方向对3D场景中的物体进行来渲染,需要硬件支持.
QMLTranslation3DElement提供3d空间中的位置变化
QMLViewportElement定义一个合理的3D视口
QMLCapsuleElement 描述一个囊状
QMLCubeElement描述一个立方体
QMLCylinderElement描述一个圆柱体
QMLLineElement描述线 可以是多条线
QMLPointElement描述点 可以是多个点
QMLQuadElement描述四边形
QMLSphereElement描述球体
QMLTeapotElement描述茶壶
简单的quick3d
QMLViewportElement
QMLMeshElement
QMLItem3DElement
import Qt 4.7 import Qt3D 1.0 Viewport { width: 640; height: 480 camera: Camera {} light: Light {} Item3D { mesh: Mesh { source: "teapot.bez" } effect: Effect {} } } |
QML BillboardTransform Element
没有成功,所以暂时不写
QMLCameraElement
QMLEffectElement
QMLMeshElement
QMLItem3DElement
设置摄像机的位置:0,4,12使用一张图片作为 纹理,使用Mesh载入obj模型
import Qt 4.7 import Qt3D 1.0 Viewport { id: viewport; width: 640; height: 480 // 设置摄像机及指向的位置 camera: Camera { eye: Qt.vector3d(0, 4, 12); } // 添加一棵树 Item3D{ id: tree mesh: Mesh { source: "tree.obj" } effect: Effect { blending: true; texture: "tree.png"} position: Qt.vector3d(0, 0, 0) } } |
QML FloatingItemElement
在3D场景上使用2D元素
import Qt 4.7 import Qt3D 1.0 Viewport { id: viewport; width: 640; height: 480 // 设置摄像机及指向的位置 camera: Camera { eye: Qt.vector3d(0, 4, 12); } // 添加一个2D的东西 FloatingItem { anchors.fill: parent depth: -10 Rectangle { x:100; y: 100; width: 100; height: 30; color: "#8f00ff00"; Text {anchors.fill: parent; text:"OK"; color: "blue"} } } // 设置地面 Item3D { id: ground mesh: Mesh { source:"ground.obj"} // 载入一个obj模型 effect: Effect{ color: "#604000"; useLighting: false; } } // 添加一棵树 Item3D{ id: tree mesh: Mesh { source: "tree.obj" } effect: Effect { blending: true; texture: "tree.png"} position: Qt.vector3d(0, 0, 0) } } |
QMLLightElement
可以比对下打开灯光和不打开灯光效果的差别
import Qt 4.7 import Qt3D 1.0 Viewport { width: 640; height: 480 camera: Camera { eye: Qt.vector3d(0, 4, 12); } light: Light { position: Qt.vector3d(0, 4, 12); direction: Qt.vector3d(0, 0, 0); } Item3D { mesh: Mesh { source: "teapot.bez" } effect: Effect {} } } |
QMLQt3dElement
里面包含了一些有用的类型
Qt3d::matrix4x4 ( realm11, realm12, realm13, realm14, realm21, realm22, realm23, realm24, realm31, realm32, realm33, realm34, realm41, realm42, realm43, realm44)
Qt3d::quaternion ( realscalar, realx, realy, realz)
Qt3d::vector2d ( realx, realy)
Qt3d::vector4d ( realx, realy, realz, realw)
QMLRotation3DElement
QMLScale3DElement
QMLTranslation3DElement
直接对一棵树进行缩放 移动 旋转操作
import Qt 4.7 import Qt3D 1.0 Viewport { width: 640; height: 480 camera: Camera { eye: Qt.vector3d(0, 4, 12); } // 添加地面 Item3D { id: ground mesh: Mesh { source: "ground.obj" } effect: Effect { color: "#604000" useLighting: false } } Item3D { id: mainItem // 第1棵树旋转 Item3D{ id: tree1 mesh: Mesh { source: "tree.obj" } effect: Effect { blending: true texture: "tree.png" } position: Qt.vector3d(0, 0, 0) transform:[ Rotation3D {id: tree1Rot; axis: Qt.vector3d(0, 1, 0);}, Translation3D {id: tree1Tran; translate: Qt.vector3d(3, 0, 0)}, Scale3D {id: tree1Scale;scale: 0.5 } ] } } ParallelAnimation{ running: true; NumberAnimation { loops: Animation.Infinite; target: tree1Rot; property: "angle"; from: 0; to : 360.0; duration: 3000;} NumberAnimation { loops: Animation.Infinite; target: tree1Tran; property: "progress"; from: 0; to : 1; duration: 3000;} NumberAnimation { loops: Animation.Infinite; target: tree1Scale; property: "scale"; from: 0; to : 1; duration: 3000;} } } |
QMLLookAtTransformElement
未知
QMLLightModelElement
QMLMaterialElement
这里是对茶壶表面的材质进行了光照的设置
import Qt 4.7 import Qt3D 1.0 Viewport { width: 640; height: 480 camera: Camera { eye: Qt.vector3d(0, 4, 12); } // 灯光 light: Light { ambientColor: "black"; // 环境光 constantAttenuation: 1; diffuseColor: "white"; // 慢发射 specularColor: "white"; //镜面光 } // 设置场景的环境光 lightModel: LightModel { ambientSceneColor: Qt.rgba(0.2, 0.2, 0.2, 1.0); } // 物体 Item3D{ id: teapot mesh: Mesh { source: "teapot.bez" } effect: Effect { blending: true material: Material { id: teapotMate ambientColor: "#cf00f010"; specularColor: "#cf030010"; diffuseColor: "#cf200310"; } } } ParallelAnimation{ running: true; ColorAnimation { loops: Animation.Infinite; target: teapotMate; property: "ambientColor"; from: "#cf00f010"; to : "#a33ca326"; duration: 3000;} ColorAnimation { loops: Animation.Infinite; target: teapotMate; property: "specularColor"; from: "#cf030010"; to : "#3091f300"; duration: 3000;} ColorAnimation { loops: Animation.Infinite; target: teapotMate; property: "diffuseColor"; from: "#cf200310"; to : "#59649350"; duration: 3000;} } } |
QMLShaderProgramElement
对于这块我不是很了解具体的例子可以查看
declarative/teapot-shader.qml
QMLStereoViewElement
import Qt 4.7 import Qt3D 1.0 StereoView{ width: 640; height: 480 //layout: StereoView.LeftRight FloatingItem { anchors.fill: parent depth: -10 Image { anchors.fill: parent source: "tree.png" } } Viewport { anchors.fill: parent navigation: false camera: Camera { eye: Qt.vector3d(0, 0, 10) eyeSeparation: 0.08 } // 添加地面 Item3D { id: ground position: Qt.vector3d(-1.0, -1.0, -5.0) mesh: Mesh { source: "ground.obj" } effect: Effect { color: "#604000" useLighting: false } } } } |
QMLCapsuleElement 描述一个囊状
QMLCubeElement描述一个立方体
QMLCylinderElement描述一个圆柱体
QMLLineElement描述线 可以是多条线
QMLPointElement描述点 可以是多个点
QMLQuadElement描述四边形
QMLSphereElement描述球体
QMLTeapotElement描述茶壶
import Qt 4.7 import Qt3D 1.0 import Qt3D.Shapes 1.0 Viewport { width: 640; height: 480 camera: Camera { eye: Qt.vector3d(0, 4, 12); } // 灯光 light: Light { ambientColor: "black"; // 环境光 constantAttenuation: 1; diffuseColor: "white"; // 慢发射 specularColor: "white"; //镜面光 } // 设置场景的环境光 lightModel: LightModel { ambientSceneColor: Qt.rgba(0.2, 0.2, 0.2, 1.0); } // 囊状 Capsule { radius: 0.5 length: 3.0 scale: 0.5 position: Qt.vector3d(-2, 1, 0); effect: Effect { color: "#aaca00" } } // 立方体 Cube { scale: 0.5 position: Qt.vector3d(-1, 1, 0); effect: Effect { color: "#aaca00" texture: "qtlogo.png" } } // 圆柱体 Cylinder { radius: 0.5 length: 3.0 scale: 0.5 position: Qt.vector3d(0, 1, 0); effect: Effect { color: "#aaca00" } } // 线 Line { vertices: [ 0, 0, 0, 0, 0, 1, 0, 1, 1 ] position: Qt.vector3d(-2.0, 0, 0); effect: Effect { color: "#aaca00" } } // 点 Point { vertices: [ 0, 0, 0, 1, 1, 1, -1, -1, -1 ] pointSize: 0.5; position: Qt.vector3d(1, -1, 0); effect: Effect { color: "white" } } // 四边形 Quad { scale: 0.5 position: Qt.vector3d(0, 0, 0); effect: Effect { color: "#aaca00" texture: "qtlogo.png" } } // 球体 Sphere { radius: 0.5 position: Qt.vector3d(-2, -1, 0); effect: Effect { color: "#aaca00" } } // 茶壶 Teapot { scale: 0.5 position: Qt.vector3d(-1, -1, 0); effect: Effect { color: "#aaca00" texture: "qtlogo.png" decal: true } } } |