function predict(obj, t0)
	% predict position of all tracks which are active at time-step t0
	% to find the expected position at time t0+1

	camera		= obj.setup.camera;
	t1			= t0+1;

	%% get index of all active tracks
	i_active	= obj.active(t0);
	n_active	= numel(i_active);

	%% position and velocity of all active tracks
	re_pos_t0	= obj.get_track_property(i_active, t0, 're_pos', true);
	re_vel_t0	= obj.get_track_property(i_active, t0, 're_vel', true);
	
	%% predict new position
	% object space position
	re_pos_t1   = re_pos_t0 + re_vel_t0;
	% predicted velocity
	re_vel_t1   = re_vel_t0;
	% image space position
	im_pred_t1  = zeros(2, n_active, obj.n_cameras);
	for c = 1 : n_cameras
		im_pred_t1(:,:,c) = pinhole_model(re_pos_t1, camera(c).calib);
	end

	%% check bounds
	% assumes all cameras have same image coordinate system limits
	i_lim		= sort(camera(1).i_axis([1 end]));
	j_lim		= sort(camera(1).j_axis([1 end]));
	b_oob		= any(im_pred_t1(1,:,:) < i_lim(1), 3) ...
				| any(im_pred_t1(1,:,:) > i_lim(2), 3) ...
				| any(im_pred_t1(2,:,:) < j_lim(1), 3) ...
				| any(im_pred_t1(2,:,:) > j_lim(2), 3);

	%% update track array
	for n = 1 : n_active
		it		= i_active(n);
		% update prediction of position/velocity in object space
		obj.tracks(it).re_pred(:, t1)	= re_pos_t1(:, n);
		obj.tracks(it).re_vel(:, t1)    = re_vel_t1(:, n);
		% prediction in image space and out of bounds flag
		obj.tracks(it).im_pred(:, t1,:) = im_pred_t1(:, n,:);
		obj.tracks(it).oob(1, t1) = b_oob(n);
	end
end




