4

我在过去的 simphony 中建立了一个 3D 模型,它工作(相当)好。然而,由于模型的性质,代理往往会形成密集的团块。我想知道是否有一种方法可以通过生成连续更新的 2D 显示或最终状态视图来生成通过团块中间的 2D 切片或横截面,以查看代理在团块内所做的事情。

我已经探索了 gui 中的显示选项并尝试了代理的不同分层,但由于密度的原因,这些都不起作用。是否有一种方法可以稍微改变 gui 的这一方面,以在 50x50x50 的网格中给出 x=25 处的 yz 平面的 2D 视图(例如)。

预先感谢您的帮助!

4

1 回答 1

3

您可以通过根据代理的可见性属性更改样式类中的透明度属性来更改 3D 显示中形状的透明度。例如,您的代理可以检查其在 3D 空间中的当前位置,并且仅当代理位于您想要可视化的空间平面中时才返回 isVisible() true。这将仅在 3D 显示中显示存在于您定义的平面上的代理,该平面可以是穿过空间的任何 x、y、z 方向。在您的样式类中,您需要更新 getAppearance(...) 方法中的透明度,如下所示:

public TaggedAppearance getAppearance(MyAgent agent, TaggedAppearance taggedAppearance, Object shapeID) {
    if (taggedAppearance == null) {
        taggedAppearance = new TaggedAppearance();

    // Customize your agent style here...           

     AppearanceFactory.setMaterialAppearance(taggedAppearance.getAppearance(), Color.white);
    }


    if (trans == null) { 
        trans = new TransparencyAttributes();
        trans.setCapability(TransparencyAttributes.ALLOW_VALUE_READ);
        trans.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
        trans.setCapability(TransparencyAttributes.ALLOW_MODE_READ);
        trans.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE);
        trans.setTransparencyMode(TransparencyAttributes.FASTEST);
        taggedAppearance.getAppearance().setTransparencyAttributes(trans);
    }

    if (agent.isVisible())
        trans.setTransparency(0.0f);
    else 
        trans.setTransparency(1.0f);

    return taggedAppearance;
}

您还可以将透明度值从 0 调整为 1 以提供不同级别的透明度,以便感兴趣的代理完全不透明 (0.0f) 而外围的代理非常透明 (0.8f)。

于 2018-09-20T22:44:57.653 回答