I'm not sure, but instead of doing this
gun.rotateX(PI/2f);
gun.rotateAxis(gun.getYAxis(), PI);
in onDrawFrame(), i suggest to do this
Object3D gun=....;
gun.rotateX(PI/2f);
gun.rotateAxis(gun.getYAxis(), PI);
gun.rotateMesh();
gun.clearRotation();
gun.build();
right after loading the gun (from storage...
). That might help already and if not, it will ease debugging. Also, remove the call to build() in onDrawFrame()...it hurts performance and serves no purpose there. About the overlays...i think that comes from the fact that you create the position variables based on the width and height in onCreate(). You should better use w and h in onSurfaceChanged(), because that will reflect that actual change in orientation.