001: /*
002: * Apollo - Motion capture and animation system
003: * Copyright (c) 2005 Apollo
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License
007: * as published by the Free Software Foundation; either version 2
008: * of the License, or (at your option) any later version.
009: *
010: * This program is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU General Public License for more details.
014: *
015: * You should have received a copy of the GNU General Public License
016: * along with this program; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
018: *
019: * http://www.gnu.org/copyleft/gpl.html
020: *
021: * @author Giovane.Kuhn - brain@netuno.com.br
022: *
023: */
024: package org.apollo.trackmodel;
025:
026: import org.apollo.datamodel.EffectingFrame;
027: import org.apollo.datamodel.TrackingFrame;
028: import org.apollo.datamodel.Video;
029:
030: /**
031: * Class responsible to track model joints through the video.
032: * Based on tracked markers.
033: * @author Giovane.Kuhn on 28/05/2005
034: */
035: public final class ModelTracker {
036:
037: /** Video to be tracked */
038: protected final Video video;
039:
040: public ModelTracker(Video video) {
041: this .video = video;
042: }
043:
044: public void track() {
045: // must have tracking video to track model
046: if (video.getEffectingVideo() == null
047: || video.getTrackingVideo() == null) {
048: return;
049: }
050:
051: // visitor used to calculate position based on markers
052: AbstractPositioner markPositioner = new MarkerBasedPositioner(
053: video.getEffectingVideo(), video.getTrackingVideo());
054: // visitor to calculate position based on parent and child position
055: AbstractPositioner pcPositioner = new ParentChildPositioner(
056: video.getTrackingVideo());
057: // visitor to calculate position based on grandparent and parent position
058: AbstractPositioner ancPositioner = new AncestralPositioner(
059: video.getTrackingVideo());
060: // visitor used to calculate position based on model
061: AbstractPositioner modelPositioner = new ModelBasedPositioner(
062: video.getTrackingVideo());
063:
064: // analyze all frames
065: for (int i = 1; i < video.getEffectingVideo().getFrames()
066: .size(); i++) {
067: final EffectingFrame effectFrame = video
068: .getEffectingVideo().getFrame(i);
069:
070: // create new tracking frame
071: TrackingFrame trackFrame = video.getTrackingVideo()
072: .getFrame(effectFrame.getSequence());
073: if (trackFrame != null) {
074: trackFrame.reset();
075: }
076: trackFrame = new TrackingFrame();
077: trackFrame.setSequence(effectFrame.getSequence());
078: video.getTrackingVideo().addFrame(trackFrame);
079:
080: // calculate position for joint that aren't simulated and must exists markers at frame
081: markPositioner.track(trackFrame);
082:
083: // calculate position based on parent and child position
084: pcPositioner.track(trackFrame);
085:
086: // calculate position based on grandparent and parent position
087: ancPositioner.track(trackFrame);
088:
089: // calculate position based on model
090: modelPositioner.track(trackFrame);
091:
092: // NOTE : code removed, cause is better to simulate
093: // when is generating motion data cause it is relative
094: // simulate position for joint not accepted by the plan
095: // simulateVisitor.track(trackFrame);
096: }
097:
098: }
099:
100: }
|