标签: qt3d

将 Qt3d 视图渲染为 QApplication MainWindow 上的小部件

我从 Qt 开始。我正在尝试在 QApplication 的 MainWindow 上从 Qt3d 渲染 3D 视图。

我发现的例子都是基于 QGuiApplications 的,没有使用 Qt Quick 和 QML 的小部件,但我的目标是使用小部件,因为这将是一个桌面应用程序。

我在 MainWindow UI 表单中使用了 Qt 设计器,在中央小部件上,我使用垂直布局在左侧放置选项卡,在右侧放置一个具有扩展水平尺寸策略的空小部件。我的目标是创建一个基于现有 Qt 类的类,该类将支持 Qt3d,同时还能够处理小部件。然后从 Mainwindow 窗体我想将 Widget 提升到该类。

我试过 QWindow 但它不允许小部件,我想使用 QGlview 来访问小部件吗?我不是真的想弄乱 opengl,现在不是不推荐了吗?有人可以指导我实现这个示例吗?

谢谢

c++ qt widget qt3d

5
推荐指数
2
解决办法
2584
查看次数

get geometry加载qmesh的数据(c ++)

我的问题:我将3D模型加载到QMesh中:

Qt3DRender::QMesh *mesh;
mesh->setSource(QUrl(QStringLiteral("qrc:/new/prefix1/ata.obj")));
Run Code Online (Sandbox Code Playgroud)

这在目前是有效的.

现在我搜索一个函数,它给出了Object的几何数据,特别是:midpoint,corner

最后,我想将我加载的3D模型转换为我的相机的视点.

我使用qt 5.8.有没有人可以帮助我?提前致谢

c++ qt qt3d qt5.8

5
推荐指数
1
解决办法
278
查看次数

Qt3D 围绕网格旋转相机

我最近开始学习 Qt/QML/C++ 并尝试构建一个非常基本的 3D 场景来围绕网格对象旋转相机。

我发现很难遵循这些示例,而且我发现文档没有提供任何有用的说明。那里似乎也没有很多教程,也许我找错了地方。

主程序

#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <Qt3DQuick/QQmlAspectEngine>

#include <QGuiApplication>
#include <QtQml>

int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Quick::Qt3DQuickWindow view;

    // Expose the window as a context property so we can set the aspect ratio
    view.engine()->qmlEngine()->rootContext()->setContextProperty("_window", &view);
    view.setSource(QUrl("qrc:/main.qml"));
    view.setWidth(800);
    view.setHeight(600);
    view.show();

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

主文件

import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0

Entity {
    id: sceneRoot

    Camera {
        id: camera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 25
        aspectRatio: _window.width / _window.height
        nearPlane …
Run Code Online (Sandbox Code Playgroud)

c++ qt qml qt3d

5
推荐指数
1
解决办法
3508
查看次数

Qt3D 从 QGeometry 读取原始顶点数据

我正在使用 Qt3D 开发一个应用程序,需要通过 C++ 访问原始顶点数据。我正在使用QObjectPickerraypointing,但由于数据是专门的(我开发了一个导入器,为每个包含温度读数的顶点添加一个额外的属性),我无法QObjectPicker方便地从该点读取数据。

3D 对象是通过加载的,QMesh所以我相信访问原始数据的最佳方式是通过QMeshQGeometry成员。如果我错了纠正我。QGeometry有一个QAttribute保存顶点属性的向量。(同样,如果我错了,请纠正我。)从这一点来看,我不确定如何从特定顶点索引读取数据。我的猜测是我需要QAttribute::buffer通过知道每个顶点数据有多大并从它的偏移量中读取来从某个位置读取数据,但是我在这里怎么做呢?

这是我到目前为止想出的:

void ES3DScene::handlePickerClicked(QPickEvent *pick)
{
    QPickTriangleEvent *trianglePick = qobject_cast<QPickTriangleEvent*>(pick);
    // I'd like to get the vertex data from vertex1Index's position.
    qDebug() << "Clicked " << trianglePick->vertex1Index();
    QGeometry *geometry = m_mesh->geometry();
    auto attributes = geometry->attributes();
    for (auto i = 0; i < attributes.count(); ++i)
    {
        if (attributes.at(i)->name() == QAttribute::defaultPositionAttributeName())
        {
            QAttribute *attribute = attributes.at(i);
            qDebug() << "Attrib " …
Run Code Online (Sandbox Code Playgroud)

c++ opengl qt5 qt3d

5
推荐指数
1
解决办法
1342
查看次数

QT3D 中的 2D 网格

在我看来 Qt3D 不能很好地渲染 2D 网格。要了解我的意思,请打开阴影贴图 QML 示例并将相机控制器从 FirstPersonCameraController 更改为 OrbitCameraController。运行程序并尝试从下方查看地平面,您会看到它消失了。所以 QT3D 只是从一侧渲染 2D 网格,并使它们从另一侧透明。

我怎样才能解决这个问题?即从两侧渲染 2D 网格?

编辑:现在我知道我必须禁用剔除才能使渲染工作。我想到了这一点:

//'this' refers to Qt3DWindow
rootEntity->addComponent(this->renderSettings());
QCullFace *face = new QCullFace();
QRenderStateSet *stateSet = new QRenderStateSet(this->renderSettings()->activeFrameGraph());
QRenderSurfaceSelector *selector = new QRenderSurfaceSelector(this->renderSettings());
face->setMode(QCullFace::NoCulling);
stateSet->addRenderState(face);
selector->setSurface(this);
Run Code Online (Sandbox Code Playgroud)

但这似乎仍然没有改变任何东西。我错过了什么吗?

c++ qt qt3d

5
推荐指数
1
解决办法
1347
查看次数

了解 Qt3D 创建的网格

我创建了一个像这样的 Qt3D 网格:

Qt3DCore::QEntity *newEntity = new Qt3DCore::QEntity();
Qt3DExtras::QConeMesh *mesh =new Qt3DExtras::QConeMesh();
mesh->setTopRadius(0.2);
mesh->setBottomRadius(1.0);
mesh->setLength(2.0);
for(int i = 0; i < mesh->geometry()->attributes().size(); ++i) {
    mesh->geometry()->attributes().at(i)->buffer()->setSyncData(true); // To have access to data
}
newEntity->addComponent(mesh);
Run Code Online (Sandbox Code Playgroud)

创建的网格如下所示:

锥网 锥形网格,另一种观点


在代码的后面,我尝试以STL 二进制格式导出上述网。为此,我提取了实体的几何变换组件:

Qt3DCore::QComponent *compoMesh = nullptr; // place holder for mesh geometry of entity
Qt3DCore::QComponent *compoTran = nullptr; // place holder for mesh transformation of entity
QVector<Qt3DCore::QComponent *> compos = newEntity->components();
for(int i = 0; i < compos.size(); …
Run Code Online (Sandbox Code Playgroud)

qt mesh qt3d stl-format

5
推荐指数
1
解决办法
1564
查看次数

Phong-Alpha 材质透明度

我正在使用 Qt3D 的预制材料:

Qt3DRender::QMaterial *MyClass::createMaterial()
{
    Qt3DExtras::QPhongAlphaMaterial *mat = new Qt3DExtras::QPhongAlphaMaterial();
    mat->setAmbient(QColor("#576675"));
    mat->setDiffuse(QColor("#5F6E7D"));
    mat->setSpecular(QColor("#61707F"));
    mat->setShininess(0.0f);
    mat->setAlpha(0.5f);
    return mat;
}
Run Code Online (Sandbox Code Playgroud)

我将 alpha 设置为0.5f,所以我希望材料是半透明的。但模型看起来大部分是白色的,除了一些区域:

结果

当我检查源代码时,我看到了 alpha 混合的这个设置:

m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
m_blendEquation->setBlendFunction(QBlendEquation::Add);
Run Code Online (Sandbox Code Playgroud)

我想知道为什么模型看起来是白色的?


正如@Macke 所建议的,黑色背景上的物体看起来不错!

黑色背景

当我设置alpha为 时1.0,我观察到:

阿尔法 = 1.0


更新

正如@Macke 所指出的,一个问题与深度测试有关。在源代码上,默认情况下禁用深度蒙版:

// ...
, m_noDepthMask(new QNoDepthMask())
// ...

m_phongAlphaGL3RenderPass->addRenderState(m_noDepthMask);

m_phongAlphaGL2RenderPass->addRenderState(m_noDepthMask);

m_phongAlphaES2RenderPass->addRenderState(m_noDepthMask);
Run Code Online (Sandbox Code Playgroud)

我通过删除QNoDepthMask东西启用了深度蒙版,现在alpha = 1.0渲染结果很好:

启用深度蒙版,alpha = 1.0


更新

在@EddyAlleman 的建议下,我添加了以下代码行:

blendState->setSourceAlpha(Qt3DRender::QBlendEquationArguments::Zero);
blendState->setDestinationAlpha(Qt3DRender::QBlendEquationArguments::One);
Run Code Online (Sandbox Code Playgroud)

然后,alpha = 0.4即使在灰色背景下,透明度 ( ) 也很好:

阿尔法 = 0.4

c++ opengl qt glsl qt3d

5
推荐指数
1
解决办法
542
查看次数

Qt3D:关于 QText2DEntity 的几个简单问题

  1. 下面列出了一个简单的测试应用程序。如果要运行此应用程序,则会出现消息“ [Qt3DRender::GLTexture] 尚未从纹理生成器生成 QTextureData。此帧的纹理将无效”,并且在退出时 - 应用程序崩溃。创建 QText2DEntity 的错误是什么?如果对标记的片段进行注释,则不会有问题。

  2. 如何将 QText2DEntity 附加到相机(或屏幕)?我需要在移动相机时做到这一点 QText2DEntity 始终保持在固定位置。

主程序

#include <QGuiApplication>
#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DExtras/QSphereMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QText2DEntity>
#include <Qt3DExtras/QFirstPersonCameraController>
#include <Qt3DRender/QCamera>

int main(int argc, char *argv[])
{
    QGuiApplication application(argc, argv);
    Qt3DExtras::Qt3DWindow window;

    auto scene = new Qt3DCore::QEntity;
    window.setRootEntity(scene);

    auto sphere = new Qt3DCore::QEntity(scene);

    auto transform = new Qt3DCore::QTransform;
    transform->setTranslation(QVector3D(0.0f, 0.0f, -10.0f));

    auto material = new Qt3DExtras::QPhongMaterial;
    material->setAmbient(QColor(245, 245, 245));
    material->setDiffuse(QColor(125, 125, 125));
    material->setSpecular(QColor(215, 215, 215));

    auto spheremesh = …
Run Code Online (Sandbox Code Playgroud)

c++ qt qt3d

5
推荐指数
1
解决办法
561
查看次数

Qt3D:为 Qt3DRender::QGeometryRenderer::Lines 设置线宽

我不确定如何在 Qt3D 中设置线宽。

我知道Qt3DRender::QRenderStateSetQLineWidth,但如何在以下 MWE 中使用它们(来自此处):

#include <QGuiApplication>
#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DExtras/QSphereMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QFirstPersonCameraController>
#include <Qt3DExtras/QDiffuseSpecularMaterial>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QBuffer>
#include <Qt3DRender/QAttribute>

Qt3DCore::QEntity *createEntityBox(const QVector3D &min,
                                   const QVector3D &max,
                                   const QColor &color,
                                   Qt3DCore::QEntity *parent)
{
    auto geometry = new Qt3DRender::QGeometry;

    QByteArray bufferBytes;
    bufferBytes.resize(3 * 8 * sizeof(float));
    float *positions = reinterpret_cast<float*>(bufferBytes.data());
    *positions++ = min.x(); *positions++ = min.y(); *positions++ = min.z();
    *positions++ = max.x(); *positions++ = min.y(); *positions++ = …
Run Code Online (Sandbox Code Playgroud)

c++ qt qt3d

5
推荐指数
0
解决办法
547
查看次数

如果没有另一个实体与 ObjectPicker,则 ObjectPicker 不适用于动态创建的实体

我有一个Scene3DObjectPicker通过这个助手类的Scene3DViewHelper::addCuboid()插槽动态添加一个具有,的实体的地方:

场景3dviewhelper.h:

#ifndef SCENE3DVIEWHELPER_H
#define SCENE3DVIEWHELPER_H

#include <Qt3DCore/QEntity>

class Scene3DViewHelper : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(Qt3DCore::QEntity * rootEntity READ rootEntity WRITE setRootEntity NOTIFY rootEntityChanged)

    explicit Scene3DViewHelper(QObject *parent = nullptr);

    Qt3DCore::QEntity * rootEntity() const;

public slots:
    void setRootEntity(Qt3DCore::QEntity *rootEntity);
    void addCuboid();

signals:
    void rootEntityChanged(Qt3DCore::QEntity *rootEntity);

private:
    Qt3DCore::QEntity *rootEntity_;
};

#endif // SCENE3DVIEWHELPER_H
Run Code Online (Sandbox Code Playgroud)

场景3dviewhelper.cpp:

#include "scene3dviewhelper.h"
#include <Qt3DCore>
#include <Qt3DRender>
#include <Qt3DExtras>

Scene3DViewHelper::Scene3DViewHelper(QObject *parent) : QObject(parent) {}

Qt3DCore::QEntity * Scene3DViewHelper::rootEntity() const { return rootEntity_; } …
Run Code Online (Sandbox Code Playgroud)

qt qml qt3d

5
推荐指数
0
解决办法
346
查看次数

标签 统计

qt3d ×10

qt ×9

c++ ×8

opengl ×2

qml ×2

glsl ×1

mesh ×1

qt5 ×1

qt5.8 ×1

stl-format ×1

widget ×1