1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g3d.vtk.utils;
\r
14 import javax.vecmath.AxisAngle4d;
\r
15 import javax.vecmath.Vector3d;
\r
17 import org.simantics.g3d.math.MathTools;
\r
18 import org.simantics.g3d.vtk.shape.IvtkVisualObject;
\r
20 import vtk.vtkActor;
\r
21 import vtk.vtkCamera;
\r
22 import vtk.vtkContourFilter;
\r
23 import vtk.vtkDataObject;
\r
24 import vtk.vtkOutlineFilter;
\r
25 import vtk.vtkOutlineSource;
\r
26 import vtk.vtkPolyData;
\r
27 import vtk.vtkPolyDataMapper;
\r
28 import vtk.vtkPolyDataSilhouette;
\r
29 import vtk.vtkProp3D;
\r
30 import vtk.vtkRenderWindow;
\r
31 import vtk.vtkRenderer;
\r
32 import vtk.vtkTransform;
\r
33 import vtk.vtkTransformPolyDataFilter;
\r
34 import vtk.vtkWindowToImageFilter;
\r
36 public class vtkEffect {
\r
38 private static vtkRenderer tmpRenderer;
\r
40 public static vtkRenderer getRenderer() {
\r
41 if (tmpRenderer == null)
\r
42 tmpRenderer = new vtkRenderer();
\r
45 public static vtkActor createContour(vtkProp3D tmpProp) {
\r
47 vtkRenderer tmpRenderer = getRenderer();
\r
48 tmpRenderer.SetBackground(1,1,1);
\r
51 if (tmpProp instanceof IvtkVisualObject) {
\r
52 ((IvtkVisualObject)tmpProp).addToRenderer();
\r
54 tmpRenderer.AddActor(tmpProp);
\r
57 if (tmpProp instanceof vtkActor) {
\r
58 ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);
\r
62 double bounds_data[] = tmpProp.GetBounds();
\r
63 double center_data[] = tmpProp.GetCenter();
\r
65 tmpRenderer.ResetCamera();
\r
66 tmpRenderer.GetActiveCamera().SetParallelProjection(1);
\r
68 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();
\r
69 tmpRenderWindow.SetOffScreenRendering(1);
\r
70 tmpRenderWindow.AddRenderer(tmpRenderer);
\r
71 tmpRenderWindow.Render();
\r
73 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();
\r
74 windowToImageFilter.SetInput(tmpRenderWindow);
\r
75 windowToImageFilter.SetMagnification(2);
\r
76 windowToImageFilter.Update();
\r
78 vtkContourFilter contourFilter = new vtkContourFilter();
\r
79 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());
\r
81 contourFilter.SetValue(0, 255);
\r
82 contourFilter.Update();
\r
84 vtkPolyData contour = contourFilter.GetOutput();
\r
86 double bounds_contour[] = new double[6];
\r
87 double center_contour[] = new double[3];
\r
88 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0., ratio_y=0.;
\r
89 contour.GetBounds(bounds_contour);
\r
91 ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);
\r
92 ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);
\r
94 vtkTransform transform1 = new vtkTransform();
\r
95 transform1.Scale(ratio_x,ratio_y,1);
\r
97 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();
\r
98 tFilter1.SetInput(contour);
\r
99 tFilter1.SetTransform(transform1);
\r
102 contour = tFilter1.GetOutput();
\r
104 contour.GetCenter(center_contour);
\r
105 trans_x = center_data[0]-center_contour[0];
\r
106 trans_y = center_data[1]-center_contour[1];
\r
107 trans_z = center_data[2]-center_contour[2];
\r
109 vtkTransform transform2 = new vtkTransform();
\r
110 transform2.Translate( trans_x, trans_y, trans_z);
\r
112 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();
\r
113 tFilter2.SetInput(contour);
\r
114 tFilter2.SetTransform(transform2);
\r
117 contour = tFilter2.GetOutput();
\r
119 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
120 mapper.SetInput(contour);
\r
123 vtkActor actor =new vtkActor();
\r
124 actor.SetMapper(mapper);
\r
125 actor.GetProperty().SetLineWidth(2.);
\r
127 tmpRenderer.RemoveActor(tmpProp);
\r
132 contourFilter.Delete();
\r
134 tmpRenderWindow.Delete();
\r
135 transform1.Delete();
\r
136 transform2.Delete();
\r
137 windowToImageFilter.Delete();
\r
142 public static vtkActor createContour(vtkProp3D tmpProp, vtkRenderer ren) {
\r
144 vtkRenderer tmpRenderer = getRenderer();
\r
145 tmpRenderer.SetBackground(1,1,1);
\r
148 if (tmpProp instanceof IvtkVisualObject) {
\r
149 ((IvtkVisualObject)tmpProp).addToRenderer();
\r
151 tmpRenderer.AddActor(tmpProp);
\r
154 if (tmpProp instanceof vtkActor) {
\r
155 ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);
\r
159 //double bounds_data[] = tmpProp.GetBounds();
\r
160 double center_data[] = tmpProp.GetCenter();
\r
162 tmpRenderer.ResetCamera();
\r
164 vtkCamera camera = ren.GetActiveCamera();
\r
166 vtkCamera tmpCamera = tmpRenderer.GetActiveCamera();
\r
167 tmpCamera.SetParallelProjection(camera.GetParallelProjection());
\r
170 Vector3d pos = new Vector3d(camera.GetPosition());
\r
171 Vector3d foc = new Vector3d(camera.GetFocalPoint());
\r
172 Vector3d dir = new Vector3d();
\r
174 double l = dir.length();
\r
175 // dir.scale(1.0/l);
\r
181 // Vector3d tmpFoc = new Vector3d(tmpCamera.GetFocalPoint());
\r
182 // tmpFoc.add(dir);
\r
183 // tmpCamera.SetPosition(tmpFoc.x,tmpFoc.y,tmpFoc.z);
\r
184 // tmpCamera.SetRoll(camera.GetRoll());
\r
186 tmpCamera.DeepCopy(camera);
\r
187 //tmpCamera.SetModelTransformMatrix(camera.GetModelTransformMatrix());
\r
188 tmpCamera.UpdateViewport(tmpRenderer);
\r
190 vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();
\r
191 tmpRenderWindow.SetOffScreenRendering(1);
\r
192 tmpRenderWindow.AddRenderer(tmpRenderer);
\r
193 tmpRenderWindow.Render();
\r
195 vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();
\r
196 windowToImageFilter.SetInput(tmpRenderWindow);
\r
197 windowToImageFilter.SetMagnification(2);
\r
198 windowToImageFilter.Update();
\r
200 vtkContourFilter contourFilter = new vtkContourFilter();
\r
201 contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());
\r
203 contourFilter.SetValue(0, 255);
\r
204 contourFilter.Update();
\r
206 vtkPolyData contour = contourFilter.GetOutput();
\r
209 double or[] = camera.GetOrientationWXYZ();
\r
210 AxisAngle4d aa = new AxisAngle4d();
\r
211 aa.angle = -MathTools.degToRad(or[0]);
\r
216 vtkTransform transform0 = new vtkTransform();
\r
217 transform0.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
\r
219 vtkTransformPolyDataFilter tFilter0 = new vtkTransformPolyDataFilter();
\r
220 tFilter0.SetInput(contour);
\r
221 tFilter0.SetTransform(transform0);
\r
225 contour = tFilter0.GetOutput();
\r
227 double bounds_contour[] = new double[6];
\r
229 double trans_x=0., trans_y=0., trans_z=0., ratio_x=0.002, ratio_y=0.002, ratio_z=0.002;
\r
230 contour.GetBounds(bounds_contour);
\r
232 // ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);
\r
233 // ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);
\r
234 // ratio_z = (bounds_data[5]-bounds_data[4])/(bounds_contour[5]-bounds_contour[4]);
\r
235 ratio_x = l*0.0008;
\r
236 ratio_y = l*0.0008;
\r
237 ratio_z = l*0.0008;
\r
240 System.out.println(ratio_x + " " + ratio_y);
\r
244 vtkTransform transform1 = new vtkTransform();
\r
245 transform1.Scale(ratio_x,ratio_y,ratio_z);
\r
247 vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();
\r
248 tFilter1.SetInput(contour);
\r
249 tFilter1.SetTransform(transform1);
\r
253 contour = tFilter1.GetOutput();
\r
255 double center_contour[] = new double[3];
\r
256 contour.GetCenter(center_contour);
\r
257 trans_x = center_data[0]-center_contour[0];
\r
258 trans_y = center_data[1]-center_contour[1];
\r
259 trans_z = center_data[2]-center_contour[2];
\r
261 System.out.println(trans_x + " " + trans_y + " " + trans_z);
\r
263 vtkTransform transform2 = new vtkTransform();
\r
264 transform2.Translate( trans_x, trans_y, trans_z);
\r
266 vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();
\r
267 tFilter2.SetInput(contour);
\r
268 tFilter2.SetTransform(transform2);
\r
272 contour = tFilter2.GetOutput();
\r
274 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
275 mapper.SetInput(contour);
\r
278 vtkActor actor =new vtkActor();
\r
279 actor.SetMapper(mapper);
\r
280 actor.GetProperty().SetLineWidth(2.);
\r
281 actor.GetProperty().SetColor(0,0,1);
\r
282 actor.GetProperty().Delete();
\r
284 tmpRenderer.RemoveActor(tmpProp);
\r
290 contourFilter.Delete();
\r
292 tmpRenderWindow.Delete();
\r
293 transform0.Delete();
\r
294 transform1.Delete();
\r
295 transform2.Delete();
\r
296 windowToImageFilter.GetOutputPort().Delete();
\r
297 windowToImageFilter.Delete();
\r
299 ren.AddActor(actor);
\r
301 // vtkMatrix4x4 m = camera.GetModelTransformMatrix();
\r
303 // actor.SetUserMatrix(m);
\r
305 //actor.SetPosition(trans_x,trans_y, trans_z);
\r
306 //actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);
\r
311 public static vtkActor createSilhouette(vtkRenderer ren, vtkDataObject data) {
\r
314 vtkPolyDataSilhouette silhouette = new vtkPolyDataSilhouette();
\r
316 silhouette.SetInput(data);
\r
317 silhouette.SetCamera(ren.GetActiveCamera());
\r
318 silhouette.SetEnableFeatureAngle(0);
\r
319 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
321 mapper.SetInputConnection(silhouette.GetOutputPort());
\r
323 vtkActor actor = new vtkActor();
\r
324 actor.SetMapper(mapper);
\r
326 silhouette.GetOutputPort().Delete();
\r
327 silhouette.Delete();
\r
333 public static vtkActor createOutline(vtkDataObject data) {
\r
334 vtkOutlineFilter filter = new vtkOutlineFilter();
\r
335 filter.SetInput(data);
\r
336 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
337 mapper.SetInputConnection(filter.GetOutputPort());
\r
339 vtkActor actor = new vtkActor();
\r
340 actor.SetMapper(mapper);
\r
342 filter.GetOutputPort().Delete();
\r
349 public static vtkActor createOutline(vtkProp3D prop) {
\r
351 double bounds[] = prop.GetBounds();
\r
353 vtkOutlineSource source = new vtkOutlineSource();
\r
354 source.SetBounds(bounds);
\r
356 vtkOutlineFilter filter = new vtkOutlineFilter();
\r
357 filter.SetInput(source.GetOutput());
\r
358 vtkPolyDataMapper mapper = new vtkPolyDataMapper();
\r
359 mapper.SetInputConnection(filter.GetOutputPort());
\r
361 vtkActor actor = new vtkActor();
\r
362 actor.SetMapper(mapper);
\r
364 source.GetOutput().Delete();
\r
366 filter.GetOutputPort().Delete();
\r
370 actor.SetPickable(0);
\r