Mostrar textos sobre la cara de un cuadro en función del área visible al acercar / alejar

Tengo una aplicación 3D de muestra (creada tomando la referencia del ejemplo 3DViewer de Javafx) que tiene una tabla creada al diseñar Cuadros y paneles:

La tabla está centrada en coordenadas wrt (0,0,0) y la cámara está en la posición -z inicialmente.

Tiene el acercamiento / alejamiento basado en la posición z de la cámara desde el objeto. Al acercar / alejar los límites del objeto, InParent aumenta / disminuye, es decir, el área de la cara aumenta / disminuye. Entonces, la idea es poner más texto cuando tenemos más área (siempre confinada dentro de la cara) y menos texto o ningún texto cuando el área de la cara es demasiado pequeña. Puedo hacerlo usando esta jerarquía de nodos:

y cambiar el tamaño del Panel (y administrar el vBox y el número de textos en él) según el Cuadro en cada acercamiento / alejamiento.

Ahora el problema es que la tabla limitsInParent está dando resultados incorrectos (imagen de la mesa mostrando el cuadro de límite en la parte superior) cada vez que se agrega un texto al vBox por primera vez solamente. Al acercar / alejar aún más, el cuadro de límite correcto no se apaga.

A continuación se muestra la clase 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);
        }
    }
}

}

El código que se llama al final después de todas las manipulaciones:

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);
}

Dos cosas:

No se actualizan los límites de table3D de table3D correctamente cuando se agregan textos por primera vez.

¿Cuál sería la forma correcta de colocar textos en nodos 3D? Tengo que manipular mucho para traer los textos según sea necesario.

Código de intercambioaquí.