public void createDataPanels() { removeAll(); for (ReferenceFrame f : FrameManager.getFrames()) { if (f.isVisible()) { DataPanel dp = new DataPanel(f, this); add(dp); } } invalidate(); }
@Override protected void onAbsoluteTransformationChange() { super.onAbsoluteTransformationChange(); synchronized (m_absoluteTransformationLock) { m_absoluteTransformation = null; m_inverseAbsoluteTransformation = null; } }
public Matrix44 calculateTransformation(javax.vecmath.Matrix4d m, ReferenceFrame asSeenBy) { ReferenceFrame vehicle = (ReferenceFrame) getParent(); if (asSeenBy == null) { asSeenBy = vehicle; } if (asSeenBy == vehicle) { return new Matrix44(m); } else { javax.vecmath.Matrix4d vehicleInverse; if (vehicle != null) { vehicleInverse = vehicle.getInverseAbsoluteTransformation(); } else { vehicleInverse = new javax.vecmath.Matrix4d(); vehicleInverse.setIdentity(); } return Matrix44.multiply( m, Matrix44.multiply(asSeenBy.getAbsoluteTransformation(), vehicleInverse)); } }
/** Refreshes step positions. */ protected void refreshSteps() { locked = true; if (refreshStepsLater) return; // return if this is an empty dynamic system if (this instanceof DynamicSystem) { DynamicSystem system = (DynamicSystem) this; if (system.particles.length == 0) return; } if (trackerPanel != null) { refreshDerivsLater = trackerPanel.getPlayer().getClipControl().isPlaying(); int n = trackerPanel.getFrameNumber(); VideoClip clip = trackerPanel.getPlayer().getVideoClip(); // determine last frame to be marked (must satisfy both model and clip) int end = Math.min(getEndFrame(), n); while (end > getStartFrame() && !clip.includesFrame(end)) { end--; } if (end <= lastValidFrame) return; if (lastValidFrame == -1) { reset(); // initializes model, sets lastValidFrame to marked frame, if any if (lastValidFrame == -1 || end <= lastValidFrame) return; } int start = lastValidFrame; Tracker.logTime( this.getClass().getSimpleName() + this.hashCode() + " refreshing steps " + start + " to " + end); //$NON-NLS-1$ //$NON-NLS-2$ boolean singleStep = (end - start == 1); // step forward to end ImageCoordSystem coords = trackerPanel.getCoords(); // get underlying coords if appropriate boolean useDefault = isUseDefaultReferenceFrame(); while (useDefault && coords instanceof ReferenceFrame) { coords = ((ReferenceFrame) coords).getCoords(); } double startTime = t0 + dt * tracePtsPerStep * (start - getStartFrame()) / clip.getStepSize(); double stepSize = 1.0 * clip.getStepSize() / tracePtsPerStep; int stepCount = (tracePtsPerStep * (end - start)) / clip.getStepSize(); ParticleModel[] models = getModels(); // prepare larger trace arrays and copy existing points into them for (ParticleModel next : models) { next.locked = false; int traceLength = next.traceX.length + stepCount; next.prevX = next.traceX; next.prevY = next.traceY; next.traceX = new double[traceLength]; next.traceY = new double[traceLength]; System.arraycopy(next.prevX, 0, next.traceX, 0, next.prevX.length); System.arraycopy(next.prevY, 0, next.traceY, 0, next.prevY.length); } for (int i = 0; i < stepCount; i++) { int stepNumber = i + 1; int frameNumber = start + (int) (stepNumber * stepSize); time = startTime + stepNumber * dt; Point2D[] points = getNextTracePositions(); if (points == null) continue; AffineTransform transform = coords.getToImageTransform(frameNumber); for (int j = 0; j < models.length; j++) { transform.transform(points[j], points[j]); // determine if point is invalid due to out of bounds boolean valid = Math.abs(points[j].getX()) < xLimit && Math.abs(points[j].getY()) < yLimit; if (!valid && !invalidWarningShown) { invalidWarningShown = true; Runnable runner = new Runnable() { // avoids deadlock? public void run() { // if (invalidWarningShown) return; JOptionPane.showMessageDialog( trackerPanel, TrackerRes.getString("ParticleModel.Dialog.Offscreen.Message1") + XML.NEW_LINE //$NON-NLS-1$ + TrackerRes.getString( "ParticleModel.Dialog.Offscreen.Message2"), //$NON-NLS-1$ TrackerRes.getString("ParticleModel.Dialog.Offscreen.Title"), // $NON-NLS-1$ JOptionPane.WARNING_MESSAGE); } }; SwingUtilities.invokeLater(runner); } models[j].traceX[models[j].prevX.length + i] = valid ? points[j].getX() : Double.NaN; models[j].traceY[models[j].prevY.length + i] = valid ? points[j].getY() : Double.NaN; if (stepNumber % tracePtsPerStep == 0) { // refresh position step saveState(frameNumber); PositionStep step = (PositionStep) models[j].getStep(frameNumber); if (step == null) { step = createPositionStep(models[j], frameNumber, 0, 0); step.setFootprint(models[j].getFootprint()); models[j].steps.setStep(frameNumber, step); } step.getPosition().setPosition(valid ? points[j] : nan); // this method is fast } } } int count = 4 + (end - start); int startUpdate = start; // step back twice to pick up possible valid derivatives if (startUpdate > clip.getStepSize()) startUpdate -= clip.getStepSize(); if (startUpdate > clip.getStepSize()) startUpdate -= clip.getStepSize(); lastValidFrame = end; for (ParticleModel next : models) { next.steps.setLength(end + 1); coords = trackerPanel.getCoords(); // get active coords // special treatment if this is the origin of current reference frame if (coords instanceof ReferenceFrame && ((ReferenceFrame) coords).getOriginTrack() == next) { // set origins of reference frame boolean prev = next.refreshing; // save refreshing value next.refreshing = true; ((ReferenceFrame) coords).setOrigins(); // then set positions to zero wrt origins for (int i = 0; i < clip.getStepCount(); i++) { int frameNumber = clip.stepToFrame(i); PositionStep step = (PositionStep) next.getStep(frameNumber); if (step == null) continue; AffineTransform transform = coords.getToImageTransform(frameNumber); next.point.setLocation(0, 0); transform.transform(next.point, next.point); step.getPosition().setPosition(next.point); // this method is fast } next.refreshing = prev; // restore refreshing value if (!refreshDerivsLater) { next.updateDerivatives(startUpdate, count); } } else if (!refreshDerivsLater) { next.updateDerivatives(startUpdate, count); } if (next.vAtOrigin) next.vTailsToOriginItem.doClick(); if (next.aAtOrigin) next.aTailsToOriginItem.doClick(); if (!refreshDerivsLater) { if (singleStep) next.support.firePropertyChange("step", null, new Integer(n)); // $NON-NLS-1$ else next.support.firePropertyChange("steps", null, null); // $NON-NLS-1$ } // erase refreshed steps for (int i = start + 1; i <= end; i++) { Step step = next.getStep(i); if (step != null) step.erase(); } next.locked = true; } trackerPanel.repaint(); } }
public Matrix33 calculatePointAt( ReferenceFrame target, javax.vecmath.Vector3d offset, javax.vecmath.Vector3d upGuide, ReferenceFrame asSeenBy, boolean onlyAffectYaw) { synchronized (s_calculatePointAtHelperOffset) { if (upGuide == null) { upGuide = MathUtilities.getYAxis(); } if (asSeenBy == null) { asSeenBy = (ReferenceFrame) getParent(); } Matrix44 transform = getTransformation(asSeenBy); Vector3 position = transform.getPosition(); // Vector3 position = new Vector3( transform.m30, transform.m31, // transform.m32 ); ReferenceFrame actualTarget; if (offset == null) { actualTarget = target; } else { s_calculatePointAtHelperOffset.setParent(target); Matrix44 m = new Matrix44(); m.m30 = offset.x; m.m31 = offset.y; m.m32 = offset.z; s_calculatePointAtHelperOffset.setLocalTransformation(m); actualTarget = s_calculatePointAtHelperOffset; } Matrix33 result; if (onlyAffectYaw) { // setup "helperA" with the orientation of "asSeenBy" and the // position of "this" s_calculatePointAtHelperA.setParent(asSeenBy); s_calculatePointAtHelperA.setLocalTransformation(new Matrix44()); s_calculatePointAtHelperA.setPosition(Vector3.ZERO, this); // calculate the angle of rotation around y of "actualTarget" as // seen by "helperA" Vector3 targetPosition = actualTarget.getPosition(s_calculatePointAtHelperA); double targetTheta = Math.atan2(targetPosition.x, targetPosition.z); // place "helperB" out in front of "this" s_calculatePointAtHelperB.setParent(this); s_calculatePointAtHelperB.setPosition(MathUtilities.getZAxis(), this); // calculate the angle of rotation around Y of "helperB" as seen // by "helperA" Vector3 forwardPosition = s_calculatePointAtHelperB.getPosition(s_calculatePointAtHelperA); double forwardTheta = Math.atan2(forwardPosition.x, forwardPosition.z); // setup "helperB" to have position and orientation of "this" s_calculatePointAtHelperB.setLocalTransformation(new Matrix44()); // calculate how much to rotate double deltaTheta = targetTheta - forwardTheta; // rotate "helperB" around Y as seen by "helperA" s_calculatePointAtHelperB.rotate( MathUtilities.getYAxis(), deltaTheta, s_calculatePointAtHelperA); // extract result result = s_calculatePointAtHelperB.getAxes(asSeenBy); // clean up s_calculatePointAtHelperA.setParent(null); s_calculatePointAtHelperB.setParent(null); } else { javax.vecmath.Vector3d targetPosition = actualTarget.getPosition(asSeenBy); javax.vecmath.Vector3d zAxis = MathUtilities.normalizeV(MathUtilities.subtract(targetPosition, position)); javax.vecmath.Vector3d xAxis = MathUtilities.normalizeV(MathUtilities.crossProduct(upGuide, zAxis)); if (Double.isNaN(xAxis.lengthSquared())) { xAxis.set(0, 0, 0); zAxis.set(0, 0, 0); // throw new RuntimeException( // "cannot calculate point at: zAxis=" + zAxis + " upGuide=" // + upGuide ); } javax.vecmath.Vector3d yAxis = MathUtilities.crossProduct(zAxis, xAxis); result = new Matrix33(xAxis, yAxis, zAxis); } if (offset == null) { s_calculatePointAtHelperOffset.setParent(null); } return result; } }
public void setAbsoluteTransformation(javax.vecmath.Matrix4d m) { ReferenceFrame vehicle = (ReferenceFrame) getParent(); setLocalTransformation(MathUtilities.multiply(m, vehicle.getInverseAbsoluteTransformation())); }