Créer des effets 3D dans les présentations avec Python

Aperçu

Aspose.Slides for Python via Java peut créer, modifier, conserver et rendre le formatage 3D de style PowerPoint pour les formes et le texte. Cet article couvre les effets 3D tels que la rotation, l’extrusion, les biseaux, l’éclairage, le matériau, les remplissages en dégradé ou image, et le texte 3D.

Installez le package comme décrit dans Installation. Chaque exemple importe asposeslides, lance la JVM si nécessaire, puis importe l’API. L’exemple de remplissage d’image nécessite un fichier image.jpg dans le répertoire de travail.

Concepts de formatage 3D

Utilisez Shape.getThreeDFormat pour appliquer un formatage 3D à une forme. L’objet de format renvoyé contrôle la scène 3D pour cette forme.

Pour le texte, utilisez TextFrameFormat.getThreeDFormat. Cela applique le formatage 3D au cadre de texte plutôt qu’au corps de la forme.

Membre de l’API Ce qu’il contrôle Quand l’utiliser
getCamera Point de vue, type de caméra prédéfini, rotation, zoom et perspective. Faire pivoter l’objet dans l’espace 3D ou correspondre à un préréglage de rotation 3D de PowerPoint.
getLightRig Réglage d’éclairage, direction et rotation de la lumière. Modifier la façon dont les reflets et les ombres apparaissent sur la surface 3D.
getMaterial et setMaterial Matériau de surface, tel que plat, mat, plastique ou métal. Faire paraître la même géométrie plus plate, plus douce, brillante ou métallique.
getExtrusionHeight et setExtrusionHeight Distance d’extension de la forme vers l’arrière depuis sa face avant. Transformer une forme plane en un objet 3D visiblement épais.
getExtrusionColor Couleur des côtés extrudés. Rendre la profondeur visible ou harmoniser la couleur des côtés avec le remplissage frontal.
getDepth et setDepth Profondeur 3D supplémentaire utilisée par le formatage 3D de PowerPoint. Ajuster finement la profondeur des formes ou du texte, surtout avec les réglages de biseau et de matériau.
getBevelTop et getBevelBottom Arêtes surélevées ou arrondies sur les faces avant et arrière. Ajouter un bord adouci ou moulé au lieu d’une face plane et tranchante.
getContourColor, getContourWidth et setContourWidth Contour autour de l’objet 3D. Mettre en évidence les limites de l’objet dans le rendu.

Créer une forme 3D

  • Paramètres de caméra, car la vue avant par défaut peut masquer l’extrusion.
  • Paramètres d’éclairage, car l’éclairage rend les faces et les côtés lisibles.
  • Paramètres de matériau, car la surface affecte la façon dont la lumière est rendue.
  • Paramètres d’extrusion ou de profondeur, car une forme plane nécessite de l’épaisseur.

L’exemple suivant crée un rectangle, ajoute du texte à sa face avant, applique un formatage 3D, enregistre la présentation au format PPTX et rend la diapositive en image PNG.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import CameraPresetType, FillType, ImageFormat, LightRigPresetType, LightingDirection, MaterialPresetType, Presentation, SaveFormat, ShapeType
from java.awt import Color

image_scale = 2.0

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    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)

    thumbnail = slide.getImage(image_scale, image_scale)
    try:
        thumbnail.save("shape_3d.png", ImageFormat.Png)
    finally:
        thumbnail.dispose()

    presentation.save("shape_3d.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

L’image de la diapositive rendue montre le rectangle sous forme d’un bloc 3D épais :

Rendered blue 3D rectangle with white 3D text on the front face

Faire pivoter une forme avec la caméra

Dans PowerPoint, la rotation 3D est configurée depuis le volet Rotation 3-D. Les valeurs de rotation X, Y et Z correspondent à la rotation définie via l’API caméra.

PowerPoint 3-D Rotation pane with X, Y, and Z rotation values highlighted

Dans Aspose.Slides, définissez le type de caméra et la rotation via le format 3D renvoyé par Shape.getThreeDFormat :

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import CameraPresetType, Presentation, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 200, 200)

    shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront)
    shape.getThreeDFormat().getCamera().setRotation(20, 30, 40)
finally:
    presentation.dispose()

Utilisez la caméra lorsque vous devez modifier la façon dont le spectateur voit l’objet. Elle ne modifie pas la géométrie 2D de la forme sur la diapositive. Elle modifie le point de vue 3D utilisé par PowerPoint et par Aspose.Slides lors du rendu.

Ajouter une extrusion et une profondeur

L’extrusion donne à une forme un aspect épais en l’étendant derrière la face avant. Dans PowerPoint, le réglage de profondeur définit cette épaisseur visible, et le réglage de couleur définit la couleur des faces latérales.

PowerPoint depth controls mapped to extrusion color and extrusion height properties

Définissez la hauteur d’extrusion pour l’épaisseur et la couleur d’extrusion pour la couleur des côtés :

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 200, 200)

    extrusion_color = Color(128, 0, 128)

    shape.getThreeDFormat().getCamera().setRotation(20, 30, 40)
    shape.getThreeDFormat().setExtrusionHeight(100)
    shape.getThreeDFormat().getExtrusionColor().setColor(extrusion_color)
finally:
    presentation.dispose()

Utilisez le réglage de profondeur lorsque vous devez travailler directement avec la valeur de profondeur de PowerPoint ou combiner la profondeur avec les effets de biseau, de matériau et de texte. Dans de nombreux scénarios de forme, la hauteur d’extrusion est le réglage le plus clair car elle exprime directement l’extrusion visible.

Utiliser des remplissages en dégradé ou image avec des effets 3D

Le formatage 3D est indépendant du remplissage de la forme. Vous pouvez appliquer une couleur unie, un dégradé, un motif ou un remplissage image à la face avant tout en utilisant les mêmes paramètres de caméra, lumière, matériau et extrusion.

Cet exemple applique un remplissage en dégradé à la forme et une couleur d’extrusion plus sombre aux côtés :

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import CameraPresetType, FillType, ImageFormat, LightRigPresetType, LightingDirection, MaterialPresetType, Presentation, ShapeType
from java.awt import Color

image_scale = 2.0

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    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)
    extrusion_color = Color(255, 140, 0)
    shape.getThreeDFormat().setExtrusionHeight(150)
    shape.getThreeDFormat().getExtrusionColor().setColor(extrusion_color)

    thumbnail = slide.getImage(image_scale, image_scale)
    try:
        thumbnail.save("gradient_3d.png", ImageFormat.Png)
    finally:
        thumbnail.dispose()
finally:
    presentation.dispose()

Le rendu conserve le dégradé sur la face avant et rend séparément l’extrusion :

Rendered 3D rectangle with a blue-to-orange gradient fill and orange extrusion

Pour utiliser un remplissage image à la place, ajoutez l’image à la présentation et affectez‑la au remplissage de la forme :

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, PictureFillMode, Presentation, ShapeType
from java.awt import Color
from pathlib import Path

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 250, 250)

    image_data = Path("image.jpg").read_bytes()
    java_image_data = jpype.JArray(jpype.JByte)(image_data)
    image = presentation.getImages().addImage(java_image_data)

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

    extrusion_color = Color(255, 140, 0)
    shape.getThreeDFormat().getCamera().setRotation(10, 20, 30)
    shape.getThreeDFormat().setExtrusionHeight(150)
    shape.getThreeDFormat().getExtrusionColor().setColor(extrusion_color)
finally:
    presentation.dispose()

Rendered 3D rectangle with a photo fill on the front face and orange extrusion

Appliquer le formatage 3D au texte

Le formatage 3D d’une forme affecte le corps de la forme. Le formatage 3D du texte affecte le cadre de texte. Ceci est utile pour des effets similaires à WordArt où les lettres elles‑mêmes nécessitent extrusion, matériau, éclairage et paramètres de caméra.

L’exemple suivant crée du texte avec un remplissage en motif, applique une transformation WordArt et configure les paramètres 3D sur TextFrameFormat :

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import CameraPresetType, FillType, ImageFormat, LightRigPresetType, LightingDirection, MaterialPresetType, PatternStyle, Presentation, SaveFormat, ShapeType, TextShapeType
from java.awt import Color

image_scale = 2.0

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    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")

    portion = shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0)
    portion.getPortionFormat().getFillFormat().setFillType(FillType.Pattern)
    pattern_color = Color(255, 140, 0)
    portion.getPortionFormat().getFillFormat().getPatternFormat().getForeColor().setColor(pattern_color)
    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)

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

    thumbnail = slide.getImage(image_scale, image_scale)
    try:
        thumbnail.save("text_3d.png", ImageFormat.Png)
    finally:
        thumbnail.dispose()

    presentation.save("text_3d.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Rendered 3D text with an arched WordArt transform, orange pattern fill, and dark extrusion

Comportement d’exportation et de rendu

Aspose.Slides conserve le formatage 3D lors de l’enregistrement aux formats PowerPoint comme PPTX. Lors du rendu ou de l’exportation vers des formats à mise en page fixe, la scène 3D est rasterisée ou dessinée dans le résultat sous forme 2D. Cela s’applique lorsque vous rendez des diapositives en PNG, exportez en PDF, exportez en HTML ou générez des images pour la conversion vidéo.

  • Les images et PDF exportés ne sont pas interactifs. L’objet ne peut pas être pivoté par le spectateur après l’exportation.
  • L’apparence finale dépend de la combinaison de la caméra, du système d’éclairage, du matériau, de l’extrusion, du remplissage et du redimensionnement de la diapositive.
  • Si vous devez inspecter les valeurs de formatage héritées ou basées sur le thème, utilisez l’API de formatage effectif.
  • Certains formats de sortie ne peuvent pas stocker le formatage 3D PowerPoint éditable. Dans ces formats, le résultat visuel est rendu plutôt que conservé comme paramètres 3D éditables.

FAQ

Aspose.Slides peut-il créer des présentations 3D interactives ?

Aspose.Slides crée et rend les effets 3D de PowerPoint pour les formes et le texte. Il ne rend pas les images, les PDF ou les pages HTML exportés interactifs sous forme de scènes 3D que le spectateur pourrait faire pivoter. Dans le format PPTX, le formatage 3D reste éditable dans PowerPoint lorsque le format le prend en charge.

Quelle est la différence entre un modèle 3D et un effet 3D ?

Un modèle 3D est un objet 3D distinct inséré dans une présentation. Un effet 3D est un formatage appliqué à une forme ou un texte PowerPoint ordinaire, tel que rotation, extrusion, biseau, éclairage et matériau. Cet article traite des effets 3D.

Quels réglages sont nécessaires pour qu’une forme 3D soit visible ?

Au minimum, définissez une rotation de caméra et soit l’extrusion, soit la profondeur. En pratique, définissez également un système d’éclairage et un matériau afin que les faces rendues aient des reflets et des ombres clairement visibles.

Puis‑je appliquer des effets 3D aux formes et au texte ?

Oui. Utilisez Shape.getThreeDFormat pour le corps de la forme et TextFrameFormat.getThreeDFormat pour le texte.

Les effets 3D apparaîtront‑ils lors de l’exportation vers des images, PDF, HTML ou des images vidéo ?

Oui. Aspose.Slides rend les effets 3D lors de la génération d’images de diapositives, de la sortie PDF, de la sortie HTML et des images utilisées pour la conversion vidéo. La sortie exportée contient l’apparence rendue, pas un objet 3D éditable.

Puis‑je lire les valeurs 3D finales après l’application de l’héritage et des paramètres de thème ?

Oui. Utilisez ThreeDFormat.getEffective pour lire les valeurs finales de caméra, de système d’éclairage, de biseau et les valeurs 3D associées.