Crear efectos 3D en presentaciones usando Java

Visión general

Aspose.Slides for Java puede crear, editar, conservar y representar el formato 3D estilo PowerPoint para formas y texto. Este artículo cubre efectos 3D como rotación, extrusión, biseles, iluminación, material, degradados o rellenos con imagen y texto 3D.

Conceptos de formato 3D

Utilice IShape.getThreeDFormat() para aplicar formato 3D a una forma. El objeto de formato devuelto controla la escena 3D para esa forma.

Para texto, utilice ITextFrameFormat.getThreeDFormat(). Esto aplica formato 3D al marco de texto en lugar del cuerpo de la forma.

Los miembros de API más importantes son:

Miembro de la API Qué controla Cuándo usarlo
getCamera Punto de vista, tipo de cámara predefinido, rotación, zoom y perspectiva. Gire el objeto en el espacio 3D o coincida con un ajuste predefinido de rotación 3D de PowerPoint.
getLightRig Luz predefinida, dirección y rotación de la luz. Cambie cómo aparecen los reflejos y sombras en la superficie 3D.
getMaterial y setMaterial Material de la superficie, como plano, mate, plástico o metal. Haga que la misma geometría parezca más plana, suave, brillante o metálica.
getExtrusionHeight y setExtrusionHeight Cuán lejos la forma se extiende hacia atrás desde su cara frontal. Convierta una forma plana en un objeto 3D visiblemente grueso.
getExtrusionColor Color de los lados extruidos. Haga visible la profundidad o coordine el color lateral con el relleno frontal.
getDepth y setDepth Profundidad 3D adicional usada por el formato 3D de PowerPoint. Ajuste finamente la profundidad de formas o texto, especialmente junto con biseles y material.
getBevelTop y getBevelBottom Bordes elevados o redondeados en las caras frontal y posterior. Añada un borde suavizado o moldeado en lugar de una cara plana y afilada.
getContourColor, getContourWidth, y setContourWidth Contorno alrededor del objeto 3D. Resalte el borde del objeto en la salida renderizada.

Crear una forma 3D

Una forma suele necesitar cuatro tipos de ajustes antes de parecer convincentemente 3D:

  • Ajustes de cámara, porque la vista frontal predeterminada puede ocultar la extrusión.
  • Ajustes de luz, porque la iluminación hace que las caras y los lados sean legibles.
  • Ajustes de material, porque la superficie afecta cómo se representa la luz.
  • Ajustes de extrusión o profundidad, porque una forma plana necesita grosor.

El siguiente ejemplo crea un rectángulo, añade texto a su cara frontal, aplica formato 3D, guarda la presentación como PPTX y representa la diapositiva en una imagen PNG.

final float imageScale = 2;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 200, 200);
    shape.getTextFrame().setText("3D");
    shape.getTextFrame().getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat().setFontHeight(64);

    shape.getFillFormat().setFillType(FillType.Solid);
    shape.getFillFormat().getSolidFillColor().setColor(Color.BLUE);

    shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront);
    shape.getThreeDFormat().getCamera().setRotation(20, 30, 40);
    shape.getThreeDFormat().getLightRig().setLightType(LightRigPresetType.Flat);
    shape.getThreeDFormat().getLightRig().setDirection(LightingDirection.Top);
    shape.getThreeDFormat().setMaterial(MaterialPresetType.Flat);
    shape.getThreeDFormat().setExtrusionHeight(100);
    shape.getThreeDFormat().getExtrusionColor().setColor(Color.BLUE);

    IImage thumbnail = slide.getImage(imageScale, imageScale);
    try {
        thumbnail.save("shape_3d.png", ImageFormat.Png);
    } finally {
        thumbnail.dispose();
    }

    presentation.save("shape_3d.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

La imagen de la diapositiva renderizada muestra el rectángulo como un bloque 3D grueso:

Rectángulo 3D azul renderizado con texto 3D blanco en la cara frontal

Rotar una forma con la cámara

En PowerPoint, la rotación 3D se configura desde el panel 3‑D Rotation. Los valores de rotación X, Y y Z corresponden a la rotación que se establece mediante la API de cámara.

Panel 3‑D Rotation de PowerPoint con valores de rotación X, Y y Z resaltados

En Aspose.Slides, establezca el tipo de cámara y la rotación a través del formato 3D devuelto por shape.getThreeDFormat():

shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront);
shape.getThreeDFormat().getCamera().setRotation(20, 30, 40);

Utilice la cámara cuando necesite cambiar cómo el observador ve el objeto. No modifica la geometría 2D de la forma en la diapositiva. Cambia el punto de vista 3D usado por PowerPoint y por Aspose.Slides al renderizar.

Añadir extrusión y profundidad

La extrusión hace que una forma parezca gruesa al extenderla detrás de la cara frontal. En PowerPoint, el control de profundidad establece este grosor visible, y el control de color establece el color de las caras laterales.

Controles de profundidad de PowerPoint asignados a las propiedades de color de extrusión y altura de extrusión

Establezca la altura de extrusión para el grosor y el color de extrusión para el color lateral:

Color extrusionColor = new Color(128, 0, 128);

shape.getThreeDFormat().getCamera().setRotation(20, 30, 40);
shape.getThreeDFormat().setExtrusionHeight(100);
shape.getThreeDFormat().getExtrusionColor().setColor(extrusionColor);

Utilice el ajuste de profundidad cuando necesite trabajar directamente con el valor de profundidad de PowerPoint o combinar profundidad con bisel, material y efectos de texto. En muchos escenarios de forma, la altura de extrusión es el ajuste más claro porque expresa directamente la extrusión visible.

Usar rellenos degradados o con imagen con efectos 3D

El formato 3D es independiente del relleno de la forma. Puede aplicar un color sólido, degradado, patrón o relleno con imagen a la cara frontal y seguir usando la misma cámara, luz, material y ajustes de extrusión.

Este ejemplo aplica un relleno degradado a la forma y un color de extrusión más oscuro a los lados:

final float imageScale = 2;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 250, 250);
    shape.getTextFrame().setText("3D Gradient");
    shape.getTextFrame().getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat().setFontHeight(64);

    shape.getFillFormat().setFillType(FillType.Gradient);
    shape.getFillFormat().getGradientFormat().getGradientStops().add(0, Color.BLUE);
    shape.getFillFormat().getGradientFormat().getGradientStops().add(100, Color.ORANGE);

    shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront);
    shape.getThreeDFormat().getCamera().setRotation(10, 20, 30);
    shape.getThreeDFormat().getLightRig().setLightType(LightRigPresetType.Flat);
    shape.getThreeDFormat().getLightRig().setDirection(LightingDirection.Top);
    shape.getThreeDFormat().setMaterial(MaterialPresetType.Flat);
    Color extrusionColor = new Color(255, 140, 0);
    shape.getThreeDFormat().setExtrusionHeight(150);
    shape.getThreeDFormat().getExtrusionColor().setColor(extrusionColor);

    IImage thumbnail = slide.getImage(imageScale, imageScale);
    try {
        thumbnail.save("gradient_3d.png", ImageFormat.Png);
    } finally {
        thumbnail.dispose();
    }
} finally {
    presentation.dispose();
}

La salida renderizada mantiene el degradado en la cara frontal y representa la extrusión por separado:

Rectángulo 3D renderizado con relleno degradado azul‑a‑naranja y extrusión naranja

Para usar un relleno con imagen, añada la imagen a la presentación y asígnela al relleno de la forma:

java.nio.file.Path imagePath = java.nio.file.Paths.get("image.jpg");
byte[] imageData = java.nio.file.Files.readAllBytes(imagePath);
IPPImage image = presentation.getImages().addImage(imageData);

shape.getFillFormat().setFillType(FillType.Picture);
shape.getFillFormat().getPictureFillFormat().getPicture().setImage(image);
shape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);

Color extrusionColor = new Color(255, 140, 0);
shape.getThreeDFormat().getCamera().setRotation(10, 20, 30);
shape.getThreeDFormat().setExtrusionHeight(150);
shape.getThreeDFormat().getExtrusionColor().setColor(extrusionColor);

La imagen se representa en la cara frontal, mientras que la extrusión se representa como la superficie lateral 3D:

Rectángulo 3D renderizado con relleno fotográfico en la cara frontal y extrusión naranja

Aplicar formato 3D al texto

El formato 3D de forma afecta al cuerpo de la forma. El formato 3D de texto afecta al marco de texto. Esto es útil para efectos estilo WordArt donde las propias letras necesitan extrusión, material, iluminación y ajustes de cámara.

El siguiente ejemplo crea texto con relleno de patrón, aplica una transformación WordArt y configura los ajustes 3D en ITextFrameFormat:

final float imageScale = 2;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 250, 250);
    shape.getFillFormat().setFillType(FillType.NoFill);
    shape.getLineFormat().getFillFormat().setFillType(FillType.NoFill);
    shape.getTextFrame().setText("3D Text");

    IPortion portion = shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
    portion.getPortionFormat().getFillFormat().setFillType(FillType.Pattern);
    Color patternColor = new Color(255, 140, 0);
    portion.getPortionFormat().getFillFormat().getPatternFormat().getForeColor().setColor(patternColor);
    portion.getPortionFormat().getFillFormat().getPatternFormat().getBackColor().setColor(Color.WHITE);
    portion.getPortionFormat().getFillFormat().getPatternFormat().setPatternStyle(PatternStyle.LargeGrid);

    shape.getTextFrame().getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat().setFontHeight(128);

    ITextFrameFormat textFrameFormat = shape.getTextFrame().getTextFrameFormat();
    textFrameFormat.setTransform(TextShapeType.ArchUp);
    textFrameFormat.getThreeDFormat().setExtrusionHeight(3.5f);
    textFrameFormat.getThreeDFormat().setDepth(3);
    textFrameFormat.getThreeDFormat().setMaterial(MaterialPresetType.Plastic);
    textFrameFormat.getThreeDFormat().getLightRig().setDirection(LightingDirection.Top);
    textFrameFormat.getThreeDFormat().getLightRig().setLightType(LightRigPresetType.Balanced);
    textFrameFormat.getThreeDFormat().getLightRig().setRotation(0, 0, 40);
    textFrameFormat.getThreeDFormat().getCamera().setCameraType(CameraPresetType.PerspectiveContrastingRightFacing);

    IImage thumbnail = slide.getImage(imageScale, imageScale);
    try {
        thumbnail.save("text_3d.png", ImageFormat.Png);
    } finally {
        thumbnail.dispose();
    }

    presentation.save("text_3d.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

El texto se representa como letras 3D curvadas y extruidas:

Texto 3D renderizado con transformación WordArt arqueada, relleno de patrón naranja y extrusión oscura

Comportamiento de exportación y renderizado

Aspose.Slides conserva el formato 3D al guardar en formatos PowerPoint como PPTX. Al renderizar o exportar a formatos de diseño fijo, la escena 3D se rasteriza o dibuja en la salida como un resultado 2D. Esto se aplica cuando representa diapositivas a PNG, exporta a PDF, exporta a HTML, o genera fotogramas para conversión de video.

Tenga en cuenta los siguientes puntos:

  • Las imágenes y PDFs exportados no son interactivos. El objeto no puede ser rotado por el espectador después de la exportación.
  • La apariencia final depende de la combinación de cámara, rig de luz, material, extrusión, relleno y escalado de la diapositiva.
  • Si necesita inspeccionar valores de formato heredados o basados en el tema, lea las propiedades efectivas de la forma.
  • Algunos formatos de salida no pueden almacenar el formato 3D editable de PowerPoint. En esos formatos, el resultado visual se representa en lugar de conservarse como ajustes 3D editables.

Preguntas frecuentes

¿Puede Aspose.Slides crear presentaciones 3D interactivas?

Aspose.Slides crea y renderiza los efectos 3D de PowerPoint para formas y texto. No convierte imágenes, PDFs o páginas HTML exportadas en escenas 3D interactivas que un espectador pueda rotar. En PPTX, el formato 3D sigue siendo editable en PowerPoint cuando el formato lo permite.

¿Cuál es la diferencia entre un modelo 3D y un efecto 3D?

Un modelo 3D es un objeto 3D independiente insertado en una presentación. Un efecto 3D es un formato aplicado a una forma o texto normal de PowerPoint, como rotación, extrusión, bisel, iluminación y material. Este artículo trata los efectos 3D.

¿Qué ajustes son necesarios para una forma 3D visible?

Como mínimo, establezca una rotación de cámara y ya sea extrusión o profundidad. En la práctica, también configure un rig de luz y material para que las caras renderizadas tengan reflejos y sombras claros.

¿Puedo aplicar efectos 3D tanto a formas como a texto?

Sí. Utilice IShape.getThreeDFormat() para el cuerpo de la forma y ITextFrameFormat.getThreeDFormat() para el texto.

¿Aparecerán los efectos 3D al exportar a imágenes, PDF, HTML o fotogramas de video?

Sí. Aspose.Slides renderiza los efectos 3D al producir imágenes de diapositivas, salida PDF, salida HTML y fotogramas usados para la conversión a video. La salida exportada contiene la apariencia renderizada, no un objeto 3D editable.

¿Puedo leer los valores finales 3D después de aplicar herencia y ajustes de tema?

Sí. Utilice las API de formato efectivo descritas en Propiedades efectivas de la forma para leer la cámara final, rig de luz, bisel y valores 3D relacionados.