Qt3D:根据实体和相机之间的距离缩放实体大小

Posted

技术标签:

【中文标题】Qt3D:根据实体和相机之间的距离缩放实体大小【英文标题】:Qt3D: Scale entity size according to a distance between entity and camera 【发布时间】:2018-08-30 08:15:42 【问题描述】:

在代码中调整实体大小很容易:

self.transform = Qt3DCore.QTransform()
self.transform.setScale(1.5)

但我想动态调整实体的大小。我希望我的实体在我将相机远离它时放大或在我接近相机时缩小。是否可以使用适当的着色器来做到这一点?

【问题讨论】:

为什么不简单地在相机移动时这样设置比例?为什么要让它变得复杂并使用着色器? 在我看来,使用 GPU 比使用 CPU 更好。 这当然适用于计算密集型高度并行化的应用程序,例如渲染 3D 场景所需的大量矩阵乘法。根据您的程序,摄像机位置可以每秒更新 60 - 200 次 (fps)。 CPU 很容易处理这么多的调用,我假设 Qt3D 实际上可以像您想要的那样处理缩放 - 使用一个使用矩阵来缩放顶点的着色器。顺便说一句,你必须以某种方式将新的比例传递给 GPU,即你需要 CPU 来传递它 -> 使用 Qt3D 的功能保持它的一致性。 如果你真的 真的 真的想按照你的方式去做(虽然我会避免这样做)你需要创建自己的材质 - 效果 - 技术 - 以所需的比例渲染通道作为材质上的可设置。然后,您需要将比例传递给渲染通道并将其添加为参数。这样,您可以使用您指定的名称在自定义着色器(也在渲染过程中设置)中使用它。您可以在互联网上找到如何在 OpenGL 着色器中缩放和对象。 再次感谢您,@FlorianBluem。我会按照你的方式去做。 【参考方案1】:

我找到了这个link。

我添加到顶点着色器的代码在哪里:

in vec3 vertexPosition;
uniform mat4 modelViewProjection;

void main()

    float reciprScaleOnscreen = 0.005;
    float w = (modelViewProjection * vec4(0.0, 0.0, 0.0, 1.0)).w;
    w *= reciprScaleOnscreen;

    gl_Position = modelViewProjection * vec4(vertexPosition.xyz * w , 1.0);

因此无需在程序中缩放实体。使用着色器更简单。

【讨论】:

当然可以使用着色器,但更简单取决于您是否使用自定义材质。我以为你不是,这就是为什么我建议使用 Qt3D 的内置功能 ;)

以上是关于Qt3D:根据实体和相机之间的距离缩放实体大小的主要内容,如果未能解决你的问题,请参考以下文章

计算相机和不同大小物体之间的距离

java list<实体> 集合排序问题 根据实体的 time属性,降序排列(距离现在时间越短,越靠前)

Python:不仅根据值,还根据其他参与者的最小距离对选择单个最小距离对

如何测量物体或人脸与相机的距离

简单图中的递归回溯

使用光流查找相机支架和墙壁之间的距离