Das Length+1 beim SetLength war ja auch richtig, du musst nur bei den Indizes High benutzen.
Delphi-Quellcode:
procedure TS3DObject.AddGroup(Name:String; Visible: Boolean);
begin
SetLength(self.Groups,Length(self.Groups)+1);
self.Groups[High(self.Groups)]:= TS3DGroup.Create;
self.Groups[High(self.Groups)].Visible:= Visible;
self.Groups[High(self.Groups)].Name:= Name;
end;