Crear presentaciones 3D en Python

Visión general

¿Cómo sueles crear una presentación 3D en PowerPoint? Microsoft PowerPoint te permite añadir modelos 3D, aplicar efectos 3D a formas, crear texto 3D, insertar gráficos 3D y crear animaciones 3D.

Crear efectos 3D tiene un gran impacto y suele ser la forma más sencilla de convertir una presentación estándar en una presentación 3D. Desde Aspose.Slides 20.9, se ha añadido un nuevo motor 3D multiplataforma. Este motor permite exportar y rasterizar formas y texto con efectos 3D. En versiones anteriores, las formas con efectos 3D se renderizaban de forma plana; ahora pueden renderizarse con 3D completo. También puedes crear formas con efectos 3D mediante la API de Aspose.Slides.

En la API de Aspose.Slides, para convertir una forma en una forma 3D de PowerPoint, usa la propiedad Shape.three_d_format, que expone los miembros de la clase ThreeDFormat:

  • bevel_bottom y bevel_top: establece biseles, elige un tipo de bisel (por ejemplo, Angle, Circle, SoftRound) y define la altura y el ancho del bisel.
  • camera: simula el movimiento de la cámara alrededor del objeto; al ajustar la rotación, el zoom y otras propiedades de la cámara, puedes manipular las formas como modelos 3D en PowerPoint.
  • contour_color y contour_width: define las propiedades del contorno para que una forma parezca un objeto 3D de PowerPoint.
  • depth, extrusion_color y extrusion_height: convierte una forma en tridimensional estableciendo su profundidad o extruyéndola.
  • light_rig: crea efectos de iluminación en una forma 3D; al igual que con la cámara, puedes establecer la rotación de la luz con respecto a la forma 3D y elegir un tipo de luz.
  • material: selecciona un material para que la forma 3D parezca más realista. Los materiales predefinidos incluyen Metal, Plastic, Powder, Matte y más.

Todas las funciones 3D pueden aplicarse tanto a formas como a texto. Las secciones siguientes muestran cómo acceder a estas propiedades y examinarlas paso a paso.

import aspose.pydrawing as drawing
import aspose.slides as slides

image_scale = 2

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 150, 200, 200)
    shape.text_frame.text = "3D"
    shape.text_frame.paragraphs[0].paragraph_format.default_portion_format.font_height = 64

    shape.three_d_format.camera.camera_type = slides.CameraPresetType.ORTHOGRAPHIC_FRONT
    shape.three_d_format.camera.set_rotation(20, 30, 40)
    shape.three_d_format.light_rig.light_type = slides.LightRigPresetType.FLAT
    shape.three_d_format.light_rig.direction = slides.LightingDirection.TOP
    shape.three_d_format.material = slides.MaterialPresetType.FLAT
    shape.three_d_format.extrusion_height = 100
    shape.three_d_format.extrusion_color.color = drawing.Color.blue

    with slide.get_image(image_scale, image_scale) as thumbnail:
        thumbnail.save("sample_3d.png")

    presentation.save("sandbox_3d.pptx", slides.export.SaveFormat.PPTX)

La miniatura renderizada se ve así:

todo:image_alt_text

Rotación 3D

Puedes rotar formas 3D de PowerPoint en un espacio tridimensional para añadir interactividad. Para rotar una forma 3D en PowerPoint, usa el siguiente menú:

todo:image_alt_text

En la API de Aspose.Slides, controlas la rotación 3D de una forma mediante la propiedad camera.

shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 150, 200, 200)
shape.three_d_format.camera.set_rotation(20, 30, 40)
# ... establecer otros parámetros de la escena 3D

with slide.get_image(image_scale, image_scale) as thumbnail:
    thumbnail.save("sample_3d.png")

Profundidad y Extrusión 3D

Para añadir una tercera dimensión a tu forma y que sea realmente 3D, usa las propiedades ThreeDFormat.extrusion_height y ThreeDFormat.extrusion_color:

shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 150, 200, 200)
shape.three_d_format.camera.set_rotation(20, 30, 40)
shape.three_d_format.extrusion_height = 100
shape.three_d_format.extrusion_color.color = drawing.Color.purple
# ... establecer otros parámetros de la escena 3D

with slide.get_image(image_scale, image_scale) as thumbnail:
    thumbnail.save("sample_3d.png")

En PowerPoint, normalmente utilizas el menú Depth para establecer la profundidad de una forma 3D:

todo:image_alt_text

Degradado 3D

Un degradado puede usarse para rellenar una forma 3D de PowerPoint. Creemos una forma con relleno degradado y apliquemos un efecto 3D:

import aspose.pydrawing as drawing
import aspose.slides as slides

image_scale = 2

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 150, 250, 250)
    shape.text_frame.text = "3D Gradient"
    shape.text_frame.paragraphs[0].paragraph_format.default_portion_format.font_height = 64

    shape.fill_format.fill_type = slides.FillType.GRADIENT
    shape.fill_format.gradient_format.gradient_stops.add(0, drawing.Color.blue)
    shape.fill_format.gradient_format.gradient_stops.add(100, drawing.Color.orange)
   
    shape.three_d_format.camera.camera_type = slides.CameraPresetType.ORTHOGRAPHIC_FRONT
    shape.three_d_format.camera.set_rotation(10, 20, 30)
    shape.three_d_format.light_rig.light_type = slides.LightRigPresetType.FLAT
    shape.three_d_format.light_rig.direction = slides.LightingDirection.TOP
    shape.three_d_format.extrusion_height = 150
    shape.three_d_format.extrusion_color.color = drawing.Color.dark_orange
   
    with slide.get_image(image_scale, image_scale) as thumbnail:
        thumbnail.save("sample_3d.png")

Y aquí tienes el resultado:

todo:image_alt_text

Además de los rellenos degradados, puedes rellenar formas con una imagen:

with open("image.png", "rb") as image_file:
    image_data = image_file.read()

    shape.fill_format.fill_type = slides.FillType.PICTURE
    shape.fill_format.picture_fill_format.picture.image = presentation.images.add_image(image_data)
    shape.fill_format.picture_fill_format.picture_fill_mode = slides.PictureFillMode.STRETCH
    # ... configurar 3D: shape.three_d_format.camera, shape.three_d_format.light_rig, shape.three_d_format.Extrusion* propiedades

    with slide.get_image(image_scale, image_scale) as thumbnail:
        thumbnail.save("sample_3d.png")

Así es como se ve:

todo:image_alt_text

Texto 3D (WordArt)

Aspose.Slides permite aplicar efectos 3D al texto también. Para crear texto 3D, puedes usar el efecto de transformación WordArt:

import aspose.pydrawing as drawing
import aspose.slides as slides

image_scale = 2

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 150, 250, 250)
    shape.fill_format.fill_type = slides.FillType.NO_FILL
    shape.fill_format.fill_type = slides.FillType.NO_FILL
    shape.line_format.fill_format.fill_type = slides.FillType.NO_FILL
    shape.text_frame.text = "3D text"
   
    portion = shape.text_frame.paragraphs[0].portions[0]
    portion.portion_format.fill_format.fill_type = slides.FillType.PATTERN
    portion.portion_format.fill_format.pattern_format.fore_color.color = drawing.Color.dark_orange
    portion.portion_format.fill_format.pattern_format.back_color.color = drawing.Color.white
    portion.portion_format.fill_format.pattern_format.pattern_style = slides.PatternStyle.LARGE_GRID
   
    shape.text_frame.paragraphs[0].paragraph_format.default_portion_format.font_height = 128
   
    text_frame_format = shape.text_frame.text_frame_format
    # configurar efecto de transformación WordArt "Arch Up"
    text_frame_format.transform = slides.TextShapeType.ARCH_UP

    text_frame_format.three_d_format.extrusion_height = 3.5
    text_frame_format.three_d_format.depth = 3
    text_frame_format.three_d_format.material = slides.MaterialPresetType.PLASTIC
    text_frame_format.three_d_format.light_rig.direction = slides.LightingDirection.TOP
    text_frame_format.three_d_format.light_rig.light_type = slides.LightRigPresetType.BALANCED
    text_frame_format.three_d_format.light_rig.set_rotation(0, 0, 40)
    text_frame_format.three_d_format.camera.camera_type = slides.CameraPresetType.PERSPECTIVE_CONTRASTING_RIGHT_FACING
   
    with slide.get_image(image_scale, image_scale) as thumbnail:
        thumbnail.save("text3d.png")

    presentation.save("text3d.pptx", slides.export.SaveFormat.PPTX)

Este es el resultado:

todo:image_alt_text

FAQ

¿Se conservarán los efectos 3D al exportar una presentación a imágenes/PDF/HTML?

Sí. El motor 3D de Slides renderiza los efectos 3D al exportar a formatos compatibles (imágenes, PDF, HTML, etc.).

¿Puedo obtener los valores “efectivos” (finales) de los parámetros 3D que tienen en cuenta temas, herencia, etc.?

Sí. Slides proporciona APIs para leer valores efectivos (incluidos los de 3D—iluminación, biseles, etc.) para que puedas ver la configuración final aplicada.

¿Funcionan los efectos 3D al convertir una presentación a video?

Sí. Al generar fotogramas para el video, los efectos 3D se renderizan de la misma forma que en las imágenes exportadas.