【问题标题】:Qt3D: Scale entity size according to a distance between entity and cameraQt3D:根据实体和相机之间的距离缩放实体大小
【发布时间】: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。我会按照你的方式去做。

标签: python python-3.x opengl qt3d pyside2


【解决方案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 的内置功能 ;)
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多