Advertisement
Guest User

3D Object Rotate and Screenshot

a guest
Feb 24th, 2025
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.54 KB | Source Code | 0 0
  1. import vtk
  2. import os
  3. import re
  4. from PIL import Image, ImageEnhance, ImageDraw, ImageFont
  5. from vtkmodules.vtkCommonTransforms import vtkTransform
  6. import numpy as np
  7. import math
  8.  
  9.  
  10. def calculate_direction_vector(p1, p2):
  11.     """Calculate direction vector from p1 to p2."""
  12.     return [p2[i] - p1[i] for i in range(3)]
  13.  
  14.  
  15. def normalize_vector(vector):
  16.     """Normalize the given vector."""
  17.     norm = np.linalg.norm(vector)
  18.     return [v / norm for v in vector]
  19.  
  20.  
  21. def configure_camera(renderer, centroid, left, right, anterior, posterior):
  22.     """Configure the camera to look from the posterior towards the anterior with up defined by left and right."""
  23.     # Calculate the forward vector pointing from posterior to anterior
  24.     forward_vector = calculate_direction_vector(posterior, anterior)
  25.     forward_vector = normalize_vector(forward_vector)
  26.  
  27.     # Up vector should be perpendicular to the plane formed by left, right, and the forward vector
  28.     side_vector = calculate_direction_vector(left, right)
  29.     side_vector = normalize_vector(side_vector)
  30.     up_vector = np.cross(side_vector, forward_vector)  # Ensure correct order for right-hand rule
  31.     up_vector = normalize_vector(up_vector)
  32.  
  33.     # Position the camera at the anterior, looking towards the posterior
  34.     camera_position = [anterior[i] - forward_vector[i] * 50 for i in range(3)]  # Adjust the distance as needed (- front, + back)
  35.  
  36.     # Create the camera and set its position and orientation
  37.     camera = vtk.vtkCamera()
  38.     camera.SetPosition(*camera_position)
  39.     camera.SetFocalPoint(*anterior)
  40.     camera.SetViewUp(*up_vector)
  41.  
  42.     # Calculate rotation around the up vector
  43.     transform = vtk.vtkTransform()
  44.     transform.Identity()  # Reset any previous transformations
  45.     transform.Translate(*anterior)  # Move the rotation axis to the focal point (anterior)
  46.     transform.RotateWXYZ(35, *up_vector)  # Rotate 30 degrees around the up vector
  47.     transform.Translate(*[-x for x in anterior])  # Move back to the original position
  48.  
  49.     camera.ApplyTransform(transform)
  50.  
  51.     renderer.SetActiveCamera(camera)
  52.     renderer.ResetCamera()
  53.  
  54.  
  55. def take_screenshot(renderer, filename):
  56.     """Take a screenshot."""
  57.     render_window = vtk.vtkRenderWindow()
  58.     render_window.AddRenderer(renderer)
  59.     render_window.SetSize(1000, 1000)
  60.     render_window.SetOffScreenRendering(1)
  61.     render_window.Render()
  62.     window_to_image_filter = vtk.vtkWindowToImageFilter()
  63.     window_to_image_filter.SetInput(render_window)
  64.     window_to_image_filter.Update()
  65.     writer = vtk.vtkPNGWriter()
  66.     writer.SetFileName(filename)
  67.     writer.SetInputConnection(window_to_image_filter.GetOutputPort())
  68.     writer.Write()
  69.  
  70.  
  71. def rotate_image(image_path, rotation_angle):
  72.     """Rotate an image by the specified angle."""
  73.     image = Image.open(image_path)
  74.     rotated_image = image.rotate(rotation_angle, expand=True)
  75.     rotated_image.save(image_path)
  76.  
  77.  
  78. def generate_image(renderer, output_dir, centroid, left, right, anterior, posterior, rotation_angle=180):
  79.     """Generate the image."""
  80.     # Updated to pass all necessary arguments to configure_camera
  81.     configure_camera(renderer, centroid, left, right, anterior, posterior)
  82.  
  83.     filename = os.path.join(output_dir, "isometric_view_measurement.png")
  84.     take_screenshot(renderer, filename)
  85.     rotate_image(filename, rotation_angle)
  86.     return filename
  87.  
  88.  
  89. def main(stl_filename_main, output_dir, centroid, left, right, anterior, posterior):
  90.     reader_main = vtk.vtkSTLReader()
  91.     reader_main.SetFileName(stl_filename_main)
  92.     reader_main.Update()
  93.  
  94.     mapper_main = vtk.vtkPolyDataMapper()
  95.     mapper_main.SetInputConnection(reader_main.GetOutputPort())
  96.  
  97.     actor_main = vtk.vtkActor()
  98.     actor_main.SetMapper(mapper_main)
  99.     actor_main.GetProperty().SetColor(0.67, 0.67, 0.67)
  100.  
  101.     renderer = vtk.vtkRenderer()
  102.     renderer.AddActor(actor_main)
  103.     renderer.SetBackground(1, 1, 1)
  104.  
  105.     os.makedirs(output_dir, exist_ok=True)
  106.  
  107.     # Ensure all parameters are passed to generate_image
  108.     image_file = generate_image(renderer, output_dir, centroid, left, right, anterior, posterior)
  109.  
  110.     return image_file
  111.  
  112.  
  113. if __name__ == "__main__":
  114.     stl_filename_main = r"C:\\Users\\\\3DObject.stl"
  115.     output_dir = r"C:\\Users\\\\screenshots3"
  116.     centroid = [-12.372, 26.476, -210.97]
  117.     posterior = [-12.29, 6.5007, -209.98]
  118.     anterior = [-12.454, 46.451, -211.97]
  119.     left = [7.6066, 26.603, -210.05]
  120.     right = [-32.35, 26.348, -211.89]
  121.  
  122.     main(stl_filename_main, output_dir, centroid, left, right, anterior, posterior)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement