@ JoséPereda ссылка на общий код, основной класс: JFXApp.java

я есть пример трехмерного приложения (созданного на основе ссылки из образца 3DViewer Javafx), в котором есть таблица, созданная путем разметки Boxes и Panes:

Таблица центрирована относительно (0,0,0) координат, и камера изначально находится в положении -z.

Он имеет увеличение / уменьшение на основе положения камеры z от объекта. При увеличении / уменьшении объекта boundsInParent увеличивается / уменьшается, т.е. площадь лица увеличивается / уменьшается. Таким образом, идея состоит в том, чтобы поместить больше текста, когда у нас больше области (всегда ограничивающей лицо), и меньше текста или нет текста, когда область лица слишком мала. Я могу сделать это, используя эту иерархию узлов:

и изменение размера панели (и управление vBox и количеством текстов в нем) в соответствии с блоком при каждом увеличении / уменьшении.

Теперь проблема в том, что таблица boundsInParent дает неверные результаты (изображение стола показывать boundingBox в верхней части) всякий раз, когда текст добавляется в vBox только в первый раз. При дальнейшем увеличении / уменьшении выдает корректный boundingBox и не отключается.

Ниже приведен класс UIpane3D:

public class UIPane3D extends Pane
{
VBox textPane;

ArrayList<String> infoTextKeys = new ArrayList<>();
ArrayList<Text> infoTextValues = new ArrayList<>();

Rectangle bgCanvasRect = null;

final double fontSize = 16.0;   

public UIPane3D() {
    setMouseTransparent(true);
    textPane = new VBox(2.0)
}

public void updateContent() {
    textPane.getChildren().clear();
    getChildren().clear();

    for (Text textNode : infoTextValues) {
        textPane.getChildren().add(textNode);
        textPane.autosize();
        if (textPane.getHeight() > getHeight()) {
            textPane.getChildren().remove(textNode);
            textPane.autosize();

            break;
        }
    }

    textPane.setTranslateY(getHeight() / 2 - textPane.getHeight() / 2.0);

    bgCanvasRect = new Rectangle(getWidth(), getHeight());
    bgCanvasRect.setFill(Color.web(Color.BURLYWOOD.toString(), 0.10));
    bgCanvasRect.setVisible(true);

    getChildren().addAll(bgCanvasRect, textPane);
}


public void resetInfoTextMap()
{
    if (infoTextKeys != null || infoTextValues != null) 
    {
        try 
        {
            infoTextKeys.clear();
            infoTextValues.clear();     
        } catch (Exception e){e.printStackTrace();}
    }
}


public void updateInfoTextMap(String pKey, String pValue)
{
    int index = -1;
    boolean objectFound = false;

    for (String string : infoTextKeys) 
    {
        index++;
        if(string.equals(pKey))
        {
            objectFound = true;
            break;
        }
    }

    if(objectFound)
    {
        infoTextValues.get(index).setText(pValue.toUpperCase());
    }
    else
    {
        if (pValue != null) 
        {   
            Text textNode = new Text(pValue.toUpperCase());
            textNode.setFont(Font.font("Consolas", FontWeight.BLACK, FontPosture.REGULAR, fontSize));
            textNode.wrappingWidthProperty().bind(widthProperty());
            textNode.setTextAlignment(TextAlignment.CENTER);
            infoTextKeys.add(pKey);
            infoTextValues.add(textNode);
        }
    }
}

}

Код, который вызывается в конце после всех манипуляций:

public void refreshBoundingBox()
{
    if(boundingBox != null)
    {
        root3D.getChildren().remove(boundingBox);
    }

    PhongMaterial blueMaterial = new PhongMaterial();
    blueMaterial.setDiffuseColor(Color.web(Color.CRIMSON.toString(), 0.25));

    Bounds tableBounds = table.getBoundsInParent();
    boundingBox = new Box(tableBounds.getWidth(), tableBounds.getHeight(), tableBounds.getDepth());
    boundingBox.setMaterial(blueMaterial);
    boundingBox.setTranslateX(tableBounds.getMinX() + tableBounds.getWidth()/2.0);
    boundingBox.setTranslateY(tableBounds.getMinY() + tableBounds.getHeight()/2.0);
    boundingBox.setTranslateZ(tableBounds.getMinZ() + tableBounds.getDepth()/2.0);
    boundingBox.setMouseTransparent(true);

    root3D.getChildren().add(boundingBox);
}

Две вещи:

BoundsInParent таблицы 3D не обновляется должным образом при первом добавлении текстов.

Как правильно разместить текст на трехмерных узлах? Мне приходится много манипулировать, чтобы привести тексты по мере необходимости.

Код обменаВот.