You can avoid using an empty group node by passing the link object as the tracker. For example:
Code:
#Create tracker contain raw data
raw_tracker = createMyRawTracker()
#Create link that offsets raw data to actual center of eye
eye_tracker = viz.link(raw_tracker,viz.NullLinkable)
eye_tracker.preTrans([x,y,z])
#Use link as cave tracker
cave.setTracker(pos=eye_tracker,ori=eye_tracker)