读取3D文件mesh格式工具

最近要做一个3d仪表,所以了解了一下3d相关方面的知识。这里暂时不做一一赘述,只记录下当前的需求。

需求:

        由于****.mesh文件比较多,qt转换后的名字大多都能顾名思义,但是为了更加准确的找到某个部件,于是需要一个工具可以打开并查看****.mesh文件。自己在网上搜了很多工具,但是都打不开,要么是打开出错。

分析:

        既然Qt可以加载,何不自己写一个简单的工具。

开干:

代码如下,很简单:

import QtQuick
import QtQuick.Window
import QtQuick3D
import QtQuick.Controls
import Qt.labs.platform
import QtQuick.Layouts
import QtQml
ApplicationWindow {
    width: 1024
    height: 768
    visible: true
    title: qsTr("读取mesh文件");

    property int currentFileIndex: 0;
    property int filesCount: 0;

    property bool isLoad: false;
    property string current3dFile: ""




    header: ToolBar {
        RowLayout {
            anchors.fill: parent
            ToolButton {
                Layout.preferredWidth: 150;
                Layout.fillHeight: true;
                text: "Open mesh Model"
                onPressed: {
                    isLoad = false;
                    fileDialog.open()
                }
            }

            ToolButton {
                Layout.preferredWidth: 100;
                Layout.fillHeight: true;
                text: "Previous"
                onPressed: {
                    previous();
                }
            }

            ToolButton {
                Layout.preferredWidth: 100;
                Layout.fillHeight: true;
                text: "Next"
                onPressed: {
                    next();
                }
            }
            Item {
                Layout.fillHeight: true;
                Layout.fillWidth: true;
            }
        }
    }

    FileDialog {
        id: fileDialog;
        fileMode: FileDialog.OpenFiles;
        nameFilters: ["3d mesh files (*.mesh)"]
        onAccepted: {
            current3dFile = fileDialog.files[currentFileIndex];
            filesCount = fileDialog.files.length;
            console.log("current file = " , current3dFile , " count = " , filesCount )
            isLoad = true;
        }
    }

    footer: ToolBar  {

        TextEdit {
            id: name
            anchors.centerIn: parent;
            readOnly: true;
            font.pixelSize: 18;
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter;

            text:  isLoad ? ( " "+  Number(currentFileIndex+1) + "/" + filesCount + "    name : "+ getFileName(current3dFile) ) : "The 3D file is not loaded" ;
        }
    }


    function getFileName(url) {
        if ( url.length ===0)
            return "is null";

        var pos1 = url.lastIndexOf('/');
        var pos2 = url.lastIndexOf('\\');
        var pos = Math.max(pos1, pos2);
        if (pos < 0) {
            return url;
        }
        else {
            return url.substring(pos + 1);
        }
    }



    function previous() {
        if ( currentFileIndex > 0) {
            currentFileIndex --;
        }

        current3dFile = fileDialog.files[currentFileIndex];
    }

    function next() {
        if ( currentFileIndex < filesCount-1) {
            currentFileIndex ++;
        }
        current3dFile = fileDialog.files[currentFileIndex];
    }


    View3D {
        id: view3D
        anchors.fill: parent
        environment: sceneEnvironment
        SceneEnvironment {
            id: sceneEnvironment
            antialiasingQuality: SceneEnvironment.High
            antialiasingMode: SceneEnvironment.MSAA
        }

        MouseArea{
            id:mouse
            anchors.fill: parent
            property int cx: 0
            property int cy: 0
            onWheel: function(wheel){
                if(wheel.angleDelta.y>0)
                    camera.z = camera.z+5
                else
                    camera.z = camera.z-5
            }
            onPressed:function(mouse) {
                cx = mouse.x
                cy = mouse.y
            }

            onPositionChanged: function(mouse){
                var intervalX = mouse.x-cx
                var intervalY = mouse.y-cy
                cameraNode.eulerRotation.y = intervalX+cameraNode.eulerRotation.y
                cameraNode.eulerRotation.x = cameraNode.eulerRotation.x-intervalY
                cx = mouse.x
                cy = mouse.y

            }
        }
        Node {
            id: node
            DirectionalLight {
                id: directionalLight
            }

            Model {
                id: cubeModel
                source:current3dFile;
                DefaultMaterial {
                    id: cubeMaterial
                    diffuseColor: "#b5bcd7"
                }
                materials: cubeMaterial
            }
        }

        Node{
            id:cameraNode

            PerspectiveCamera {
                id: camera
                z: 15
            }
        }
    }
}

所有代码都在,复制下来新建一个qml的3d工程即可运行。

已经实现功能:

1.鼠标拖动旋转

2.滚轮放大缩小

3.上一个mesh文件

4.下一个mesh文件

5.mesh文件名字支持ctrl+c

如果有时间还可以添加如下功能:

1.多添加几个相机机位。

2.增加材质渲染选项,可以选择其他颜色。

3.其他个性化需求。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Eleven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值