0
点赞
收藏
分享

微信扫一扫

读取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.其他个性化需求。

 

读取3D文件mesh格式工具_qt

 

举报

相关推荐

0 条评论