Re: What is the difference between ModelLayer and ModelNode?
ModelLayer just loads an static external model file as a Map layer. It's the same as simply loading a model with osgDB::readRefNodeFile, except the get the benefit of it showing up as a Layer.
ModelNode is part of the "Annotation" subsystem and, while you can certainly load a static object with it as well, it's useful for dynamic entities since it lives under a GeoTransform and a PositionAttitudeTransform. It will also support model symbology (ModelSymbol) for things like terrain clamping.
See "simple_model.earth" for an example of a ModelLayer;
See "annotation.earth" for an example of ModelNode.