2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2003, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: DriftInterpolator.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.4 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2006/02/23 20:59:56 $ |
2 |
26 Feb 07 |
jari |
* $Author: caliente $ |
2 |
26 Feb 07 |
jari |
* $State: Exp $ |
2 |
26 Feb 07 |
jari |
11 |
*/ |
2 |
26 Feb 07 |
jari |
12 |
package org.tigr.microarray.mev.cluster.gui.impl.terrain; |
2 |
26 Feb 07 |
jari |
13 |
|
2 |
26 Feb 07 |
jari |
14 |
import java.util.Enumeration; |
2 |
26 Feb 07 |
jari |
15 |
|
2 |
26 Feb 07 |
jari |
16 |
import javax.media.j3d.Alpha; |
2 |
26 Feb 07 |
jari |
17 |
import javax.media.j3d.BoundingLeaf; |
2 |
26 Feb 07 |
jari |
18 |
import javax.media.j3d.Interpolator; |
2 |
26 Feb 07 |
jari |
19 |
import javax.media.j3d.Transform3D; |
2 |
26 Feb 07 |
jari |
20 |
import javax.media.j3d.TransformGroup; |
2 |
26 Feb 07 |
jari |
21 |
import javax.media.j3d.WakeupOnBehaviorPost; |
2 |
26 Feb 07 |
jari |
22 |
import javax.vecmath.Matrix3d; |
2 |
26 Feb 07 |
jari |
23 |
import javax.vecmath.Point3d; |
2 |
26 Feb 07 |
jari |
24 |
import javax.vecmath.Vector3d; |
2 |
26 Feb 07 |
jari |
25 |
import javax.vecmath.Vector3f; |
2 |
26 Feb 07 |
jari |
26 |
|
2 |
26 Feb 07 |
jari |
27 |
public class DriftInterpolator extends Interpolator { |
2 |
26 Feb 07 |
jari |
28 |
|
2 |
26 Feb 07 |
jari |
29 |
private static final int POST_ID = 0; |
2 |
26 Feb 07 |
jari |
30 |
|
2 |
26 Feb 07 |
jari |
31 |
private TransformGroup target; |
2 |
26 Feb 07 |
jari |
32 |
private float min_distance = 0.15f; |
2 |
26 Feb 07 |
jari |
// initial position |
2 |
26 Feb 07 |
jari |
34 |
private Vector3d start_v3d = new Vector3d(); |
2 |
26 Feb 07 |
jari |
35 |
private Point3d start_eye_p3d = new Point3d(); |
2 |
26 Feb 07 |
jari |
36 |
private Vector3d start_up_v3d = new Vector3d(); |
2 |
26 Feb 07 |
jari |
// desired position |
2 |
26 Feb 07 |
jari |
38 |
private Point3d finish_p3d = new Point3d(); |
2 |
26 Feb 07 |
jari |
39 |
private Point3d lookat_p3d = new Point3d(); |
2 |
26 Feb 07 |
jari |
40 |
|
2 |
26 Feb 07 |
jari |
41 |
public DriftInterpolator(TransformGroup target, BoundingLeaf boundingLeaf) { |
2 |
26 Feb 07 |
jari |
42 |
super(new Alpha(1, 3000)); |
2 |
26 Feb 07 |
jari |
43 |
this.target = target; |
2 |
26 Feb 07 |
jari |
44 |
setSchedulingBoundingLeaf(boundingLeaf); |
2 |
26 Feb 07 |
jari |
45 |
} |
2 |
26 Feb 07 |
jari |
46 |
|
2 |
26 Feb 07 |
jari |
47 |
public void setMinDistance(float distance) { |
2 |
26 Feb 07 |
jari |
48 |
this.min_distance = distance; |
2 |
26 Feb 07 |
jari |
49 |
} |
2 |
26 Feb 07 |
jari |
50 |
|
2 |
26 Feb 07 |
jari |
51 |
public float getMinDistance() { |
2 |
26 Feb 07 |
jari |
52 |
return this.min_distance; |
2 |
26 Feb 07 |
jari |
53 |
} |
2 |
26 Feb 07 |
jari |
54 |
|
2 |
26 Feb 07 |
jari |
55 |
public void initialize() { |
2 |
26 Feb 07 |
jari |
56 |
wakeupOn(new WakeupOnBehaviorPost(this, POST_ID)); |
2 |
26 Feb 07 |
jari |
57 |
} |
2 |
26 Feb 07 |
jari |
58 |
|
2 |
26 Feb 07 |
jari |
59 |
public void processStimulus(Enumeration enumeration) { |
2 |
26 Feb 07 |
jari |
60 |
Alpha alpha = getAlpha(); |
2 |
26 Feb 07 |
jari |
61 |
doDrifting(alpha); |
2 |
26 Feb 07 |
jari |
62 |
if (alpha.finished()) { |
2 |
26 Feb 07 |
jari |
63 |
wakeupOn(new WakeupOnBehaviorPost(this, POST_ID)); |
2 |
26 Feb 07 |
jari |
64 |
} else { |
2 |
26 Feb 07 |
jari |
65 |
wakeupOn(super.defaultWakeupCriterion); |
2 |
26 Feb 07 |
jari |
66 |
} |
2 |
26 Feb 07 |
jari |
67 |
} |
2 |
26 Feb 07 |
jari |
68 |
|
2 |
26 Feb 07 |
jari |
69 |
public void drift(Point3d point, Vector3f normal) { |
2 |
26 Feb 07 |
jari |
70 |
Transform3D target_t3d = new Transform3D(); |
2 |
26 Feb 07 |
jari |
71 |
this.target.getTransform(target_t3d); |
2 |
26 Feb 07 |
jari |
72 |
target_t3d.get(this.start_v3d); // position |
2 |
26 Feb 07 |
jari |
73 |
Matrix3d scale_m3d = new Matrix3d(); |
2 |
26 Feb 07 |
jari |
74 |
target_t3d.getRotationScale(scale_m3d);// rotation |
2 |
26 Feb 07 |
jari |
75 |
Vector3d z_normal = new Vector3d(); |
2 |
26 Feb 07 |
jari |
76 |
scale_m3d.getColumn(2, z_normal); // z normal |
2 |
26 Feb 07 |
jari |
77 |
this.start_up_v3d.set(-scale_m3d.m10/scale_m3d.m22, scale_m3d.m00/scale_m3d.m22, 0); |
2 |
26 Feb 07 |
jari |
78 |
this.start_up_v3d.normalize(); // up vector |
2 |
26 Feb 07 |
jari |
// sets a desired position |
2 |
26 Feb 07 |
jari |
80 |
this.lookat_p3d.set(point); |
2 |
26 Feb 07 |
jari |
81 |
this.finish_p3d.x = point.x + min_distance*normal.x; |
2 |
26 Feb 07 |
jari |
82 |
this.finish_p3d.y = point.y + min_distance*normal.y; |
2 |
26 Feb 07 |
jari |
83 |
this.finish_p3d.z = point.z + min_distance*normal.z; |
2 |
26 Feb 07 |
jari |
// init eye |
2 |
26 Feb 07 |
jari |
85 |
Transform3D eye_t3d = new Transform3D(); |
2 |
26 Feb 07 |
jari |
86 |
Vector3d temp_v3d = new Vector3d(0, 0, -1); |
2 |
26 Feb 07 |
jari |
87 |
eye_t3d.set(temp_v3d); |
2 |
26 Feb 07 |
jari |
88 |
target_t3d.mul(eye_t3d); |
2 |
26 Feb 07 |
jari |
89 |
target_t3d.get(temp_v3d); |
2 |
26 Feb 07 |
jari |
90 |
this.start_eye_p3d.set(temp_v3d); |
2 |
26 Feb 07 |
jari |
// start the motion |
2 |
26 Feb 07 |
jari |
92 |
getAlpha().setStartTime(System.currentTimeMillis()); |
2 |
26 Feb 07 |
jari |
93 |
postId(POST_ID); |
2 |
26 Feb 07 |
jari |
94 |
} |
2 |
26 Feb 07 |
jari |
95 |
|
2 |
26 Feb 07 |
jari |
96 |
private void doDrifting(Alpha alpha) { |
2 |
26 Feb 07 |
jari |
97 |
Transform3D target_t3d = new Transform3D(); |
2 |
26 Feb 07 |
jari |
98 |
this.target.getTransform(target_t3d); |
2 |
26 Feb 07 |
jari |
99 |
|
2 |
26 Feb 07 |
jari |
100 |
move(target_t3d, alpha); |
2 |
26 Feb 07 |
jari |
101 |
rotate(target_t3d, alpha); |
2 |
26 Feb 07 |
jari |
102 |
|
2 |
26 Feb 07 |
jari |
103 |
this.target.setTransform(target_t3d); |
2 |
26 Feb 07 |
jari |
104 |
} |
2 |
26 Feb 07 |
jari |
105 |
|
2 |
26 Feb 07 |
jari |
106 |
private void move(Transform3D target_t3d, Alpha alpha) { |
2 |
26 Feb 07 |
jari |
// getting current direction |
2 |
26 Feb 07 |
jari |
108 |
Vector3d target_v3d = new Vector3d(); |
2 |
26 Feb 07 |
jari |
109 |
target_t3d.get(target_v3d); |
2 |
26 Feb 07 |
jari |
110 |
Matrix3d scale_m3d = new Matrix3d(); |
2 |
26 Feb 07 |
jari |
111 |
target_t3d.getRotationScale(scale_m3d); |
2 |
26 Feb 07 |
jari |
112 |
Vector3d finish_v3d = new Vector3d(this.finish_p3d); |
2 |
26 Feb 07 |
jari |
113 |
Matrix3d diff_m3d = new Matrix3d(); |
2 |
26 Feb 07 |
jari |
114 |
diff_m3d.m00 = finish_v3d.x - target_v3d.x; |
2 |
26 Feb 07 |
jari |
115 |
diff_m3d.m10 = finish_v3d.y - target_v3d.y; |
2 |
26 Feb 07 |
jari |
116 |
diff_m3d.m20 = finish_v3d.z - target_v3d.z; |
2 |
26 Feb 07 |
jari |
117 |
scale_m3d.transpose(); |
2 |
26 Feb 07 |
jari |
118 |
scale_m3d.mul(diff_m3d); |
2 |
26 Feb 07 |
jari |
119 |
Vector3d direction_v3d = new Vector3d(); |
2 |
26 Feb 07 |
jari |
120 |
scale_m3d.getColumn(0, direction_v3d); |
2 |
26 Feb 07 |
jari |
121 |
double desired_distance = distance(this.start_v3d, finish_v3d)*(1-alpha.value()); |
2 |
26 Feb 07 |
jari |
122 |
if (desired_distance < 0.000001) |
2 |
26 Feb 07 |
jari |
123 |
return; |
2 |
26 Feb 07 |
jari |
124 |
double current_distance = distance(target_v3d, finish_v3d); |
2 |
26 Feb 07 |
jari |
125 |
direction_v3d.scale(1-desired_distance/current_distance); |
2 |
26 Feb 07 |
jari |
126 |
Transform3D move_t3d = new Transform3D(); |
2 |
26 Feb 07 |
jari |
127 |
move_t3d.set(direction_v3d); |
2 |
26 Feb 07 |
jari |
128 |
target_t3d.mul(move_t3d); |
2 |
26 Feb 07 |
jari |
129 |
} |
2 |
26 Feb 07 |
jari |
130 |
|
2 |
26 Feb 07 |
jari |
131 |
private void rotate(Transform3D target_t3d, Alpha alpha) { |
2 |
26 Feb 07 |
jari |
132 |
Point3d diff_p3d = new Point3d(); |
2 |
26 Feb 07 |
jari |
133 |
diff_p3d.sub(this.lookat_p3d, this.start_eye_p3d); |
2 |
26 Feb 07 |
jari |
134 |
diff_p3d.scale(alpha.value()); |
2 |
26 Feb 07 |
jari |
135 |
Point3d curr_p3d = new Point3d(); |
2 |
26 Feb 07 |
jari |
136 |
curr_p3d.add(this.start_eye_p3d, diff_p3d); |
2 |
26 Feb 07 |
jari |
137 |
|
2 |
26 Feb 07 |
jari |
138 |
Matrix3d scale_m3d = new Matrix3d(); |
2 |
26 Feb 07 |
jari |
139 |
target_t3d.getRotationScale(scale_m3d); |
2 |
26 Feb 07 |
jari |
140 |
double up_y = this.start_up_v3d.y+(1-this.start_up_v3d.y)*alpha.value(); |
2 |
26 Feb 07 |
jari |
141 |
double up_x = Math.sqrt(1-up_y*up_y); |
2 |
26 Feb 07 |
jari |
142 |
up_x = (scale_m3d.m10 < 0 && scale_m3d.m22 < 0 || scale_m3d.m10 > 0 && scale_m3d.m22 > 0) ? -up_x : up_x; |
2 |
26 Feb 07 |
jari |
143 |
Vector3d up_v3d = new Vector3d(up_x, up_y, 0); |
2 |
26 Feb 07 |
jari |
144 |
|
2 |
26 Feb 07 |
jari |
145 |
Vector3d current_v3d = new Vector3d(); |
2 |
26 Feb 07 |
jari |
146 |
target_t3d.get(current_v3d); |
2 |
26 Feb 07 |
jari |
147 |
if (current_v3d.x == curr_p3d.x) |
2 |
26 Feb 07 |
jari |
148 |
curr_p3d.x -= 0.000001; |
2 |
26 Feb 07 |
jari |
149 |
if (current_v3d.y == curr_p3d.y) |
2 |
26 Feb 07 |
jari |
150 |
curr_p3d.y -= 0.000001; |
2 |
26 Feb 07 |
jari |
151 |
if (current_v3d.z == curr_p3d.z) |
2 |
26 Feb 07 |
jari |
152 |
curr_p3d.z -= 0.000001; |
2 |
26 Feb 07 |
jari |
153 |
Transform3D t3d = new Transform3D(); |
2 |
26 Feb 07 |
jari |
154 |
t3d.lookAt(new Point3d(current_v3d), curr_p3d, up_v3d); |
2 |
26 Feb 07 |
jari |
155 |
t3d.invert(); |
2 |
26 Feb 07 |
jari |
156 |
target_t3d.set(t3d); |
2 |
26 Feb 07 |
jari |
157 |
} |
2 |
26 Feb 07 |
jari |
158 |
|
2 |
26 Feb 07 |
jari |
159 |
private final double distance(Vector3d v1, Vector3d v2) { |
2 |
26 Feb 07 |
jari |
160 |
double x = v1.x - v2.x; |
2 |
26 Feb 07 |
jari |
161 |
double y = v1.y - v2.y; |
2 |
26 Feb 07 |
jari |
162 |
double z = v1.z - v2.z; |
2 |
26 Feb 07 |
jari |
163 |
return Math.sqrt(x*x + y*y + z*z); |
2 |
26 Feb 07 |
jari |
164 |
} |
2 |
26 Feb 07 |
jari |
165 |
} |