root / trunk / libraries / libAnimation3D / src / main / java / com / iver / cit / gvsig / animation / interpolator / Interpolator3DSpherical.java @ 23595
History | View | Annotate | Download (4.54 KB)
1 | 23595 | afraile | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | */
|
||
19 | |||
20 | 20205 | jcampos | package com.iver.cit.gvsig.animation.interpolator; |
21 | |||
22 | import java.util.List; |
||
23 | |||
24 | 20952 | jcampos | import org.gvsig.osgvp.Matrix; |
25 | import org.gvsig.osgvp.Quat; |
||
26 | import org.gvsig.osgvp.Vec3; |
||
27 | import org.gvsig.osgvp.viewer.Camera; |
||
28 | |||
29 | 20205 | jcampos | import com.iver.ai2.gvsig3d.camera.ProjectCamera; |
30 | import com.iver.cit.gvsig.animation.keyFrame.KeyFrame3DFlat; |
||
31 | import com.iver.cit.gvsig.animation.keyframe.IKeyFrame; |
||
32 | import com.iver.cit.gvsig.animation.keyframe.interpolator.IInterpolator; |
||
33 | import com.iver.cit.gvsig.animation.keyframe.interpolator.IInterpolatorTimeFuntion; |
||
34 | import com.iver.utiles.XMLEntity; |
||
35 | |||
36 | public class Interpolator3DSpherical implements IInterpolator { |
||
37 | |||
38 | private IInterpolatorTimeFuntion function;
|
||
39 | 23595 | afraile | private String description = "Interpolaci?n basada en encuadres"; |
40 | 20205 | jcampos | private String name = "Interpolator3DSpherical"; |
41 | |||
42 | 23595 | afraile | public IKeyFrame interpolate(List<IKeyFrame> kfList, int index, double time) { |
43 | 20205 | jcampos | KeyFrame3DFlat KF = new KeyFrame3DFlat();
|
44 | |||
45 | if (kfList == null) |
||
46 | return null; |
||
47 | |||
48 | |||
49 | 23595 | afraile | /*Interpolaci?n por quaterniones.*/
|
50 | 20205 | jcampos | |
51 | double newTime = this.getFuntion().interpolate(time); |
||
52 | |||
53 | switch (kfList.size()) {
|
||
54 | // this case when there are only has 2 keyframes
|
||
55 | case 2: |
||
56 | // getting the keyframes
|
||
57 | KeyFrame3DFlat kf1 = (KeyFrame3DFlat) kfList.get(0);
|
||
58 | KeyFrame3DFlat kf2 = (KeyFrame3DFlat) kfList.get(1);
|
||
59 | |||
60 | if (index == 1) { |
||
61 | KeyFrame3DFlat kaux = kf1; |
||
62 | kf1 = kf2; |
||
63 | kf2 = kaux; |
||
64 | } |
||
65 | |||
66 | if ((kf1 == null) ||(kf2 == null)) |
||
67 | return null; |
||
68 | |||
69 | ProjectCamera vp1 = (ProjectCamera) kf1.getAnimatedObject(); |
||
70 | ProjectCamera vp2 = (ProjectCamera) kf2.getAnimatedObject(); |
||
71 | |||
72 | Camera cam1 = vp1.getCamera(); |
||
73 | Camera cam2 = vp2.getCamera(); |
||
74 | double time1 = kf1.getTime();
|
||
75 | double time2 = kf2.getTime();
|
||
76 | |||
77 | newTime = (newTime-time1)/(time2-time1);//normalize time 0..1
|
||
78 | |||
79 | 23246 | jtorres | Quat from = cam1.getViewMatrix().getRotate(); |
80 | Quat to = cam2.getViewMatrix().getRotate(); |
||
81 | 20205 | jcampos | |
82 | 23246 | jtorres | Vec3 trans1 = cam1.getViewMatrix().getTrans(); |
83 | Vec3 trans2 = cam2.getViewMatrix().getTrans(); |
||
84 | |||
85 | Vec3 new_trans = vec3LinearInterpolate(trans1, trans2, newTime); |
||
86 | Matrix m1 = Matrix.translate(new_trans); |
||
87 | 20205 | jcampos | Quat q = sphericalInterpolate(from, to, newTime); |
88 | Matrix m = Matrix.rotate(q); |
||
89 | 23246 | jtorres | Matrix m2 = m.prod(m1); |
90 | 20205 | jcampos | |
91 | 23246 | jtorres | Camera c = new Camera();
|
92 | c.setViewMatrix(m2); |
||
93 | |||
94 | 20205 | jcampos | ProjectCamera pe = new ProjectCamera();
|
95 | pe.setCamera(c); |
||
96 | KF.setName("temporal_keyframe");
|
||
97 | KF.setAnimatedObject(pe); |
||
98 | break;
|
||
99 | |||
100 | } |
||
101 | |||
102 | |||
103 | return KF;
|
||
104 | } |
||
105 | |||
106 | private Quat sphericalInterpolate(Quat from, Quat to, double time) { |
||
107 | |||
108 | Quat fromQuat = new Quat();
|
||
109 | |||
110 | return fromQuat.slerp(time, from, to);
|
||
111 | |||
112 | } |
||
113 | |||
114 | 23595 | afraile | // private double doubleInterpolate(double from, double to, double time) {
|
115 | // if (from == to)
|
||
116 | // return from;
|
||
117 | // return from + (to - from) * time;
|
||
118 | // }
|
||
119 | 20205 | jcampos | |
120 | private Vec3 vec3LinearInterpolate(Vec3 from, Vec3 to, double time) { |
||
121 | if (from.equals(to))
|
||
122 | return new Vec3(from); |
||
123 | return from.sum(to.sub(from).escalarProduct(time));
|
||
124 | } |
||
125 | 23246 | jtorres | |
126 | 20205 | jcampos | public IInterpolatorTimeFuntion getFuntion() {
|
127 | return this.function; |
||
128 | } |
||
129 | |||
130 | public void setFuntion(IInterpolatorTimeFuntion function) { |
||
131 | this.function = function;
|
||
132 | |||
133 | } |
||
134 | |||
135 | public String getClassName() { |
||
136 | return this.getClass().getName(); |
||
137 | } |
||
138 | |||
139 | public String getDescription() { |
||
140 | return this.description; |
||
141 | } |
||
142 | |||
143 | public String getName() { |
||
144 | return this.name; |
||
145 | } |
||
146 | |||
147 | /*
|
||
148 | * IPersistence methods.
|
||
149 | */
|
||
150 | |||
151 | public XMLEntity getXMLEntity() {
|
||
152 | XMLEntity xml = new XMLEntity();
|
||
153 | xml.putProperty("className", this.getClassName()); |
||
154 | xml.putProperty("description", this.description); |
||
155 | return xml;
|
||
156 | } |
||
157 | |||
158 | public void setXMLEntity(XMLEntity xml) { |
||
159 | if (xml.contains("description")) |
||
160 | this.description = xml.getStringProperty("description"); |
||
161 | |||
162 | } |
||
163 | } |