1 package org.simantics.g3d.vtk.utils;
\r
3 import javax.vecmath.AxisAngle4d;
\r
4 import javax.vecmath.Vector3d;
\r
6 import org.simantics.g3d.math.MathTools;
\r
7 import org.simantics.g3d.vtk.shape.IvtkVisualObject;
\r
10 import vtk.vtkCamera;
\r
11 import vtk.vtkContourFilter;
\r
12 import vtk.vtkDataObject;
\r
13 import vtk.vtkOutlineFilter;
\r
14 import vtk.vtkOutlineSource;
\r
15 import vtk.vtkPolyData;
\r
16 import vtk.vtkPolyDataMapper;
\r
17 import vtk.vtkPolyDataSilhouette;
\r
18 import vtk.vtkProp3D;
\r
19 import vtk.vtkRenderWindow;
\r
20 import vtk.vtkRenderer;
\r
21 import vtk.vtkTransform;
\r
22 import vtk.vtkTransformPolyDataFilter;
\r
23 import vtk.vtkWindowToImageFilter;
\r
25 public class vtkEffect {
\r
27 private static vtkRenderer tmpRenderer;
\r
29 public static vtkRenderer getRenderer() {
\r
30 if (tmpRenderer == null)
\r
31 tmpRenderer = new vtkRenderer();
\r
34 public static vtkActor createContour(vtkProp3D tmpProp) {
\r
36 vtkRenderer tmpRenderer = getRenderer();
\r
37 tmpRenderer.SetBackground(1,1,1);
\r
40 if (tmpProp instanceof IvtkVisualObject) {
\r
41 ((IvtkVisualObject)tmpProp).addToRenderer();
\r
43 tmpRenderer.AddActor(tmpProp);
\r
46 if (tmpProp instanceof vtkActor) {
\r
47 ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);
\r
51 double bounds_data[] = tmpProp.GetBounds();
\r
52 double center_data[] = tmpProp.GetCenter();
\r
54 tmpRenderer.ResetCamera();
\r
55 tmpRenderer.GetActiveCamera().SetParallelProjection(1);
\r
57 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();
\r
58 tmpRenderWindow.SetOffScreenRendering(1);
\r
59 tmpRenderWindow.AddRenderer(tmpRenderer);
\r
60 tmpRenderWindow.Render();
\r
62 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();
\r
63 windowToImageFilter.SetInput(tmpRenderWindow);
\r
64 windowToImageFilter.SetMagnification(2);
\r
65 windowToImageFilter.Update();
\r
67 vtkContourFilter contourFilter = new vtkContourFilter();
\r
68 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());
\r
70 contourFilter.SetValue(0, 255);
\r
71 contourFilter.Update();
\r
73 vtkPolyData contour = contourFilter.GetOutput();
\r
75 double bounds_contour[] = new double[6];
\r
76 double center_contour[] = new double[3];
\r
77 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0., ratio_y=0.;
\r
78 contour.GetBounds(bounds_contour);
\r
80 ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);
\r
81 ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);
\r
83 vtkTransform transform1 = new vtkTransform();
\r
84 transform1.Scale(ratio_x,ratio_y,1);
\r
86 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();
\r
87 tFilter1.SetInput(contour);
\r
88 tFilter1.SetTransform(transform1);
\r
91 contour = tFilter1.GetOutput();
\r
93 contour.GetCenter(center_contour);
\r
94 trans_x = center_data[0]-center_contour[0];
\r
95 trans_y = center_data[1]-center_contour[1];
\r
96 trans_z = center_data[2]-center_contour[2];
\r
98 vtkTransform transform2 = new vtkTransform();
\r
99 transform2.Translate( trans_x, trans_y, trans_z);
\r
101 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();
\r
102 tFilter2.SetInput(contour);
\r
103 tFilter2.SetTransform(transform2);
\r
106 contour = tFilter2.GetOutput();
\r
108 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
109 mapper.SetInput(contour);
\r
112 vtkActor actor =new vtkActor();
\r
113 actor.SetMapper(mapper);
\r
114 actor.GetProperty().SetLineWidth(2.);
\r
116 tmpRenderer.RemoveActor(tmpProp);
\r
121 contourFilter.Delete();
\r
123 tmpRenderWindow.Delete();
\r
124 transform1.Delete();
\r
125 transform2.Delete();
\r
126 windowToImageFilter.Delete();
\r
131 public static vtkActor createContour(vtkProp3D tmpProp, vtkRenderer ren) {
\r
133 vtkRenderer tmpRenderer = getRenderer();
\r
134 tmpRenderer.SetBackground(1,1,1);
\r
137 if (tmpProp instanceof IvtkVisualObject) {
\r
138 ((IvtkVisualObject)tmpProp).addToRenderer();
\r
140 tmpRenderer.AddActor(tmpProp);
\r
143 if (tmpProp instanceof vtkActor) {
\r
144 ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);
\r
148 //double bounds_data[] = tmpProp.GetBounds();
\r
149 double center_data[] = tmpProp.GetCenter();
\r
151 tmpRenderer.ResetCamera();
\r
153 vtkCamera camera = ren.GetActiveCamera();
\r
155 vtkCamera tmpCamera = tmpRenderer.GetActiveCamera();
\r
156 tmpCamera.SetParallelProjection(camera.GetParallelProjection());
\r
159 Vector3d pos = new Vector3d(camera.GetPosition());
\r
160 Vector3d foc = new Vector3d(camera.GetFocalPoint());
\r
161 Vector3d dir = new Vector3d();
\r
163 double l = dir.length();
\r
164 // dir.scale(1.0/l);
\r
170 // Vector3d tmpFoc = new Vector3d(tmpCamera.GetFocalPoint());
\r
171 // tmpFoc.add(dir);
\r
172 // tmpCamera.SetPosition(tmpFoc.x,tmpFoc.y,tmpFoc.z);
\r
173 // tmpCamera.SetRoll(camera.GetRoll());
\r
175 tmpCamera.DeepCopy(camera);
\r
176 //tmpCamera.SetModelTransformMatrix(camera.GetModelTransformMatrix());
\r
177 tmpCamera.UpdateViewport(tmpRenderer);
\r
179 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();
\r
180 tmpRenderWindow.SetOffScreenRendering(1);
\r
181 tmpRenderWindow.AddRenderer(tmpRenderer);
\r
182 tmpRenderWindow.Render();
\r
184 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();
\r
185 windowToImageFilter.SetInput(tmpRenderWindow);
\r
186 windowToImageFilter.SetMagnification(2);
\r
187 windowToImageFilter.Update();
\r
189 vtkContourFilter contourFilter = new vtkContourFilter();
\r
190 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());
\r
192 contourFilter.SetValue(0, 255);
\r
193 contourFilter.Update();
\r
195 vtkPolyData contour = contourFilter.GetOutput();
\r
198 double or[] = camera.GetOrientationWXYZ();
\r
199 AxisAngle4d aa = new AxisAngle4d();
\r
200 aa.angle = -MathTools.degToRad(or[0]);
\r
205 vtkTransform transform0 = new vtkTransform();
\r
206 transform0.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
\r
208 vtkTransformPolyDataFilter tFilter0 = new vtkTransformPolyDataFilter();
\r
209 tFilter0.SetInput(contour);
\r
210 tFilter0.SetTransform(transform0);
\r
214 contour = tFilter0.GetOutput();
\r
216 double bounds_contour[] = new double[6];
\r
218 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0.002, ratio_y=0.002, ratio_z=0.002;
\r
219 contour.GetBounds(bounds_contour);
\r
221 // ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);
\r
222 // ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);
\r
223 // ratio_z = (bounds_data[5]-bounds_data[4])/(bounds_contour[5]-bounds_contour[4]);
\r
224 ratio_x = l*0.0008;
\r
225 ratio_y = l*0.0008;
\r
226 ratio_z = l*0.0008;
\r
229 System.out.println(ratio_x + " " + ratio_y);
\r
233 vtkTransform transform1 = new vtkTransform();
\r
234 transform1.Scale(ratio_x,ratio_y,ratio_z);
\r
236 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();
\r
237 tFilter1.SetInput(contour);
\r
238 tFilter1.SetTransform(transform1);
\r
242 contour = tFilter1.GetOutput();
\r
244 double center_contour[] = new double[3];
\r
245 contour.GetCenter(center_contour);
\r
246 trans_x = center_data[0]-center_contour[0];
\r
247 trans_y = center_data[1]-center_contour[1];
\r
248 trans_z = center_data[2]-center_contour[2];
\r
250 System.out.println(trans_x + " " + trans_y + " " + trans_z);
\r
252 vtkTransform transform2 = new vtkTransform();
\r
253 transform2.Translate( trans_x, trans_y, trans_z);
\r
255 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();
\r
256 tFilter2.SetInput(contour);
\r
257 tFilter2.SetTransform(transform2);
\r
261 contour = tFilter2.GetOutput();
\r
263 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
264 mapper.SetInput(contour);
\r
267 vtkActor actor =new vtkActor();
\r
268 actor.SetMapper(mapper);
\r
269 actor.GetProperty().SetLineWidth(2.);
\r
270 actor.GetProperty().SetColor(0,0,1);
\r
271 actor.GetProperty().Delete();
\r
273 tmpRenderer.RemoveActor(tmpProp);
\r
279 contourFilter.Delete();
\r
281 tmpRenderWindow.Delete();
\r
282 transform0.Delete();
\r
283 transform1.Delete();
\r
284 transform2.Delete();
\r
285 windowToImageFilter.GetOutputPort().Delete();
\r
286 windowToImageFilter.Delete();
\r
288 ren.AddActor(actor);
\r
290 // vtkMatrix4x4 m = camera.GetModelTransformMatrix();
\r
292 // actor.SetUserMatrix(m);
\r
294 //actor.SetPosition(trans_x,trans_y, trans_z);
\r
295 //actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
\r
300 public static vtkActor createSilhouette(vtkRenderer ren, vtkDataObject data) {
\r
303 vtkPolyDataSilhouette silhouette = new vtkPolyDataSilhouette();
\r
305 silhouette.SetInput(data);
\r
306 silhouette.SetCamera(ren.GetActiveCamera());
\r
307 silhouette.SetEnableFeatureAngle(0);
\r
308 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
310 mapper.SetInputConnection(silhouette.GetOutputPort());
\r
312 vtkActor actor = new vtkActor();
\r
313 actor.SetMapper(mapper);
\r
315 silhouette.GetOutputPort().Delete();
\r
316 silhouette.Delete();
\r
322 public static vtkActor createOutline(vtkDataObject data) {
\r
323 vtkOutlineFilter filter = new vtkOutlineFilter();
\r
324 filter.SetInput(data);
\r
325 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
326 mapper.SetInputConnection(filter.GetOutputPort());
\r
328 vtkActor actor = new vtkActor();
\r
329 actor.SetMapper(mapper);
\r
331 filter.GetOutputPort().Delete();
\r
338 public static vtkActor createOutline(vtkProp3D prop) {
\r
340 double bounds[] = prop.GetBounds();
\r
342 vtkOutlineSource source = new vtkOutlineSource();
\r
343 source.SetBounds(bounds);
\r
345 vtkOutlineFilter filter = new vtkOutlineFilter();
\r
346 filter.SetInput(source.GetOutput());
\r
347 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
348 mapper.SetInputConnection(filter.GetOutputPort());
\r
350 vtkActor actor = new vtkActor();
\r
351 actor.SetMapper(mapper);
\r
353 source.GetOutput().Delete();
\r
355 filter.GetOutputPort().Delete();
\r
359 actor.SetPickable(0);
\r