项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)
需求
1.使用osg三维引擎进行动力学模型仿真性能测试;
2.打开动力学仿真模型文件,.k后缀的模型文件,测试加载解析过程;
3.解决第三方company的opengl制作的三维引擎,绘制面较多与弹丸路径模拟较卡顿的问题;
4.测试时,使用的模型为公开模型,基础面数量达到160多万个;
5.测试时,模拟动画使用的时100万条弹丸路径平行飞射出去;
1.新增打开双模型,第一个模型在原来的位置,第二个模型在偏移后的位置
2.优化打开关闭重新打开模型的过程
3.对于100万线动画射击,用于测试性能
4.当前模型为160万个面,双模型的时候为320多万个元素基础面
测试交互流畅性,交互无延迟!!!
#ifndef OSGWIDGET_H
#define OSGWIDGET_H
#include <QWidget>
#include "OsgViewerWidget.h"
#include "MyManipulator.h"
#include "osg/PolygonMode"
class AnimationPathCameraMainpulator;
namespace Ui {
class OsgWidget;
}
class OsgWidget : public QWidget
{
Q_OBJECT
public:
// 模型结构体
struct Element_Shell // *ELEMENT_SHELL
{
Element_Shell() {
}
qint64 eid; // 单元id
qint64 pid; // 材料id
qint64 n1; // 节点1,定义几何形状
qint64 n2; // 节点2,定义几何形状
qint64 n3; // 节点3,定义几何形状
qint64 n4; // 节点4,定义几何形状
qint64 n5; // 厚度,额外的节点在标准的LS-DYNA四边形壳单元定义中是没有意义的。
qint64 n6; // 积分点数,额外的节点在标准的LS-DYNA四边形壳单元定义中是没有意义的。
qint64 n7; // 额外的节点在标准的LS-DYNA四边形壳单元定义中是没有意义的。
qint64 n8; // 额外的节点在标准的LS-DYNA四边形壳单元定义中是没有意义的。
};
struct Part // *PART
{
Part() {
}
qint64 pid; // 部件的id号,唯一
qint64 secid; // 有*section关键字定义的section的id号
QList<Element_Shell> listElementShell; // 部件片元
qint64 mid; // 部件的材料号
qint64 eosid; // 部件所属材料涉及的状态方程号,由*EOS关键字定义
qint64 hgid; // 沙漏或体积粘性参数编号,由*HOURGLASS关键字定义,取0表示将采用默认的数值:
qint64 grav; // 仅对实体单元有效,取0表示对所有PART进行重力初始化,取1表示仅对当前材料初始化
qint64 adpopt; // 标识该部件是否采用自适应网格划分,取0表示不采用
qint64 tmid; // 标识该部件是否采用自适应网格划分,取0表示不采用
};
struct Node {
Node() {
}
qint64 nid; // 结点号,唯一
double x; // 三维x坐标(全局)
double y; // 三维y坐标(全局)
double z; // 三维z坐标(全局)
int tc; // 平动自由度受约束状态,枚举值:0-无平动约束,1-X方向平动约束,2-Y方向平动约束
int rc; // 转动自由度收约束状态,枚举值:0-无转动约束,1-X方向转动约束,2-Y方向转动约束
};
struct K_Mode
{
K_Mode() {}
QList<Part> listPart;
QList<Node> listNode;
QHash<int, Node> hashNid2Node;
};
// 添加模型
K_Mode kMode;
public:
explicit OsgWidget(QWidget *parent = 0);
~OsgWidget();
public:
bool getFixXAxis() const; // 获取X轴固定状态
bool getFixYAxis() const; // 获取Y轴固定状态
bool getFixZAxis() const; // 获取Z轴固定状态
void getCenter(double &x, double &y, double &z);
// 获取引擎中心点坐标
void getPersonPoint(double &x, double &y, double &z);
// 获取初始化人眼的角度(看向引擎中心点)
public:
void setFixXAxis(bool fixXAxis); // 设置固定X轴
void setFixYAxis(bool fixYAxis); // 设置固定Y轴
void setFixZAxis(bool fixZAxis);