Qt3D文档正在增加但仍缺少一些信息,特别是关于如何在没有Qml/QtQuick的情况下执行操作.在大量搜索关于在线框模式下渲染网格的网页之后,我发现了很多有用的提示和示例,这些提示和示例共同产生了一个示例查看器,我想在此处作为对所有撰写文章的人和其他人的贡献搜索了类似的例子.最有用的链接是这些:
Stackoverflow关于在Qt3DWindow中使用事件过滤器的问题和答案:鼠标控制Qt 3D窗口
可以使用鼠标旋转和缩放网格.
观众的截图

欢迎任何关于如何改进这一点的评论.特别是我对如何编写着色器程序感兴趣,该程序可以渲染不同颜色的正面和背面,或者渲染每个顶点的颜色.
这是代码:
// ######### Opening the viewer #########
void MainWindow::import3dMeshInMeshViewer(QString name)
{
if (!m_viewer3D)
{
m_viewer3D = new Viewer3D(this);
}
m_viewer3D->sceneModifier()->addTriangleMeshCustomMaterial(name, m_meshVector);
m_viewer3D->show();
}
// ######### Viewer class h #########
class Viewer3D : public QDialog
{
Q_OBJECT
public:
Viewer3D(QWidget *parent = 0);
SceneModifier* sceneModifier() {return m_sceneModifier;}
protected:
bool eventFilter(QObject *obj, QEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void wheelEvent(QWheelEvent *we);
private:
QPointer<Qt3DCore::QEntity> m_rootEntity;
QPointer<SceneModifier> m_sceneModifier; …Run Code Online (Sandbox Code Playgroud) 我在Windows中安装了Qt5库,但Qt助手中没有关于Qt3D的文档.Qt3D是Qt5的一部分还是已从发行版本5中删除?
我目前正在使用Qt3D模块在C++/Qt5中编写游戏.
我可以在QGLView上渲染场景(QGLSceneNodes),但现在我不得不用一些GUI元素重复绘制场景.我还没有决定是否使用QML或C++来定义界面的外观,所以我愿意接受两者的解决方案.(注意,QML模块称为QtQuick3D,C++模块称为Qt3D,它们都是Qt5的一部分.)
我非常喜欢基于QML的解决方案.
我该如何做一些过度涂色?
必须具备以下条件:
我认为这只是使用另一个QGLSceneNode用于2D GUI部分.但是我认为定位和定向一些场景节点以便在渲染期间(使用顶点着色器)重新定位和重新定位没有意义,引入数值误差并且看起来效率低下.
是否正确使用另一个"GUI"顶点着色器?
(如何)我可以一起制作后期渲染效果和重复绘画?
如果我可以执行以下后期渲染效果,那将是非常好的:
当我使用特殊的着色器程序实现重绘时,我发现了一个问题:我无法访问GUI后面的像素来应用高斯模糊等效果,使GUI看起来像玻璃.我必须将场景渲染到另一个缓冲区而不是QGLView.这是我的主要问题......
我喜欢使用Qt3D,但我看到的所有示例都是全窗口应用程序.我从例子中无法理解的是如何将qt3d渲染窗口添加到常规qt gui应用程序中.
基本上我想要的是我的Qt5 Gui应用程序的一个小渲染小部件.
我查看了Qtgl小部件,但我真的想使用Qt3D的场景管理功能.
如何在qt Gui窗口内渲染为子窗口?
这可能吗?
更新
所以我把这个添加到我的MainWindow.cpp它基于这个http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/
LoadModelView *view = new LoadModelView(); //Crashes on this. Will not compile with
// LoadModelView(this)
QWidget *container = QWidget::createWindowContainer(view);
container->setFocusPolicy(Qt::TabFocus);
ui->gridLayout->addWidget(container);
Run Code Online (Sandbox Code Playgroud)
这似乎是对的.
我的load_model.cpp开头是这样的:
#include "qglmaterialcollection.h"
#include "qglmaterial.h"
#include "qglscenenode.h"
#include "qgllightmodel.h"
#include "qglabstractscene.h"
#include <QtGui/qmatrix4x4.h>
#include <QPropertyAnimation>
#include <QtCore/qmath.h>
#define DEGREE_TO_RAD (3.1415926/180.0)
LoadModelView::LoadModelView(QWindow *parent)
: QGLView(parent)
, m_pSTLScene(0)
{
loadModels();
camera()->setCenter(QVector3D(0, 0, 0));
camera()->setEye(QVector3D(0, 4, 10));
}
LoadModelView::~LoadModelView()
{
delete m_pSTLScene;
}
void LoadModelView::paintGL(QGLPainter *painter)
{
QMatrix4x4 stlWorld;
stlWorld.setToIdentity();
stlWorld.scale(0.1); …Run Code Online (Sandbox Code Playgroud) 我正在使用新的Qt 3D API在计算密集的计算过程中显示3D场景.此场景仅作为对用户输入的响应而更改.但是,Qt 3D的默认行为似乎将场景的帧速率锁定为某个高常量值,在这种情况下会消耗不可接受的资源量.
有没有办法控制Qt 3D中的帧速率?理想情况下,我只想在对场景进行更改时渲染新帧,但将其降低到较小的固定值也足够了.Qt 3D文档很稀疏,我一直无法找到办法做这些事情.
编辑:我设法找到并将QRenderSettings :: OnDemand应用到我的根节点和帧图,但它似乎没有任何效果,虽然这意味着它应该,因为我使用的是Qt 5.7.对此的任何其他意见将是非常受欢迎的(即使它只是保证评论).
编辑2:安装Fraps并直接测量帧速率后,实际上场景似乎只是在应用了QRenderSettings :: OnDemand的情况下渲染帧.如果没有这个,帧速率将保持稳定的60fps,这恰好是我的屏幕刷新率.但是,无论是否显示3D窗口,程序在启用Qt 3D时都会继续消耗大量CPU时间.我开始认为这是一个与帧速率无关的独立Qt 3D问题,并且可能会相应地打开一个新问题.
我想在Qt5上安装Qt3d.当我安装QT5时,在安装文件夹中有一个src文件夹.在此文件夹中,存在qt3d库.
如果我理解正确,我必须构建它以使用各种头文件.
但我想要最新的消息来源.所以为了下载qt3d来源用QT5构建我点击这个https://qt.gitorious.org/qt/qt3d上的master 然后我下载master.tar.gz,我将它保存在我的文件夹中想要构建qt3d库.
然后我按照QT sdk 页面上的构建qt3d给出的所有步骤当我点击构建时,我收到以下错误
16:28:14: Running steps for project qt3d...
16:28:14: Starting: "C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin\qmake.exe" C:\libraries\qt3d\qt-qt3d_tdk\qt3d.pro -r -spec win32-msvc2010 "CONFIG+=debug"Reading C:/libraries/qt3d/qt-qt3d_tdk/src/src.pro [C:/libraries/qt3d/Debug/src]
Reading C:/libraries/qt3d/qt-qt3d_tdk/src/threed/threed.pro [C:/libraries/qt3d/Debugsrc/threed]
'perl.exe' is not recognized as an internal or external command,operable program or batch file.
Project MESSAGE: C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin\syncqt.bat -module Qt3D-mkspecsdirC:\Qt\Qt5.0.1\5.0.1\msvc2010/mkspecs -outdir C:/libraries/qt3d/Debug /librariesqt3d/qt-qt3d_tdk
Project ERROR: Failed to run: C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin\syncqt.bat -module Qt3D -mkspecsdir C:\Qt\Qt5.0.1\5.0.1\msvc2010/mkspecs -outdir C:/libraries/qt3d/Debug C:/libraries/qt3d/qt-qt3d_tdk
16:28:15: The process "C:\Qt\Qt5.0.1\5.0.1\msvc2010\bin\qmake.exe" exited with code 3.Error while building/deploying project qt3d (kit: Desktop Qt 5.0.1 …Run Code Online (Sandbox Code Playgroud) 我已经从ubuntu-developers存储库安装了Qt5和Qt3d(我在Ubuntu 13.04下),我想用CMake编译一个非常简单的应用程序(我的版本是2.8.10.1).Qt helloworld的工作CMakeLists.txt如下:
cmake_minimum_required(VERSION 2.8.8)
project(testproject)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
# Find the QtWidgets library
find_package(Qt5Widgets)
# Tell CMake to create the helloworld executable
add_executable(helloworld helloworld.cpp)
# Use the Widgets module from Qt 5.
qt5_use_modules(helloworld Widgets)
Run Code Online (Sandbox Code Playgroud)
但是像这个例子的基本Qt3d程序的CMakeLists.txt是什么:https://gitorious.org/wiki-sources/wiki-sources/trees/master/qt3d/glview
我想在QML Scene3D中添加一个C++ QEntity,如下所示:
//C++
class MapEntity : public Qt3DCore::QEntity {
public:
MapEntity( Qt3DCore::QEntity* parent ) : Qt3DCore::QEntity(parent) {
...
}
}
// QML
Scene3D {
MapEntity {
id: map
...
}
}
Run Code Online (Sandbox Code Playgroud)
可能吗?如果是的话,该怎么做?
或者也许可以创建C++场景(例如Qt3DExtras :: Qt3DWindow)并在QML中使用?
我的任务:计算3D网格的像素坐标(例如制作快照),从特定的摄像机角度找到该网格的2D形状.
我目前正在使用带有QGeometryRenderer的Qt3D将包含网格的场景渲染到QWidget,它可以正常工作.我尝试使用QWidget :: render()将QWidget的内容呈现为Pixmap,如本文所建议的如何创建QWidget的屏幕截图?.将像素图保存为.jpg会产生具有默认背景颜色的空白图像,这是有意义的,因为QWidget本身并未保存网格对象.
以下是我在mainwindow.cpp中设置场景的方法
// sets the scene objects, camera, lights,...
void MainWindow::setScene() {
scene = custommesh->createScene(mesh->getVertices(),
mesh->getVerticesNormals(),
mesh->getFaceNormals(),
mesh->getVerticesIndex(),
mesh->getFacesIndex()); // QEntity*
custommesh->setMaterial(scene); // CustomMeshRenderer object
camera = custommesh->setCamera(view);
custommesh->setLight(scene, camera);
custommesh->setCamController(scene, camera);
view->setRootEntity(scene); // Qt3DExtras::Qt3DWindow object
// Setting up a QWiget working as a container for the view
QWidget *container = QWidget::createWindowContainer(view);
container->setMinimumSize(QSize(500, 500));
QSizePolicy policy = QSizePolicy(QSizePolicy::Policy(5), QSizePolicy::Policy(5));
policy.setHorizontalStretch(1);
policy.setVerticalStretch(1);
container->setSizePolicy(policy);
container->setObjectName("meshWidget");
this->ui->meshLayout->insertWidget(0, container);
}
Run Code Online (Sandbox Code Playgroud)
至于渲染,这里是custommeshrenderer类,其中定义了QGeometryRenderer,并在初始化网格时返回QEntity*.
#include "custommeshrenderer.h"
#include <Qt3DRender/QAttribute>
#include <Qt3DExtras>
#include <Qt3DRender/QGeometryRenderer> …Run Code Online (Sandbox Code Playgroud) 我试图通过将三个ConeMeshes合并为一个实体来创建可自定义的Qt3D组件.用户必须能够与自定义实体进行交互,因此我已将ObjectPicker添加到文件中.通常,我会使用预定义的缩放.obj文件,但我的经理希望Qt直接绘制对象.
我要组合的两个网格是在一个单独的qml文件中定义的,所以我可以在我的Scene3D中调用它.
Entity {
ObjectPicker {
id: combinedPicker
}
ConeMesh {
id: conemesh1
...
}
ConeMesh {
id: conemesh2
...
}
Transform {
id: conetransform1
}
Transform {
id: conetransform2
}
Entity {
components: [conemesh1, conetransform1, conemesh2, conetransform2, combinedPicker]
}
}
Run Code Online (Sandbox Code Playgroud)
我将网格放在一起的方法是将它们作为组件包含在单独的实体范围中,如最后一行所示.但是这种方法只渲染组件数组中的最后一个条目.在上面,那将是锥2.
以前我尝试创建多个Entity实例,并将每个id传递给ObjectPicker,
Entity {
components: [conemesh1, conetransform1, combinedPicker]
}
Entity {
components: [conemesh2, conetransform2, combinedPicker]
}
Run Code Online (Sandbox Code Playgroud)
但是根据ObjectPicker的文档,对象选择器不是由多个组件共享的.
所以我的问题是:在Qml中将多个网格合并为一个网格时,有什么相关方法?