Tworzenie efektów 3D w prezentacjach na Androidzie

Przegląd

Aspose.Slides for Android via Java może tworzyć, edytować, zachowywać i renderować formatowanie 3D w stylu PowerPoint dla kształtów i tekstu. Ten artykuł opisuje efekty 3D, takie jak rotacja, ekstruzja, fazety, oświetlenie, materiał, wypełnienia gradientowe lub obrazkowe oraz tekst 3D.

Koncepcje formatowania 3D

Użyj metody IShape.getThreeDFormat aby zastosować formatowanie 3D do kształtu. Metoda zwraca IThreeDFormat, który kontroluje scenę 3D dla tego kształtu.

Dla tekstu użyj metody ITextFrameFormat.getThreeDFormat . Spowoduje to zastosowanie formatowania 3D do ramki tekstowej, a nie do ciała kształtu.

Najważniejsze członki API to:

Członek API Co kontroluje Kiedy używać
getCamera Punkt widzenia, predefiniowany typ kamery, obrót, powiększenie i perspektywa. Obróć obiekt w przestrzeni 3D lub dopasuj do predefiniowanego ustawienia rotacji 3D w PowerPoint.
getLightRig Predefiniowane oświetlenie, kierunek i rotacja światła. Zmień sposób, w jaki podświetlenia i cienie pojawiają się na powierzchni 3D.
getMaterial i setMaterial Materiał powierzchni, np. płaski, matowy, plastikowy lub metalowy. Spraw, aby ta sama geometria wyglądała bardziej płasko, miękko, błyszcząco lub metalicznie.
getExtrusionHeight i setExtrusionHeight Jak daleko kształt wystaje w tył od swojej przedniej powierzchni. Przekształć płaski kształt w widocznie grubą bryłę 3D.
getExtrusionColor Kolor ekstruzowanych boków. Uwypuklij głębokość lub dopasuj kolor boków do wypełnienia przedniej powierzchni.
getDepth i setDepth Dodatkowa głębokość 3D używana przez formatowanie 3D w PowerPoint. Dopracuj głębokość kształtów lub tekstu, szczególnie w połączeniu z ustawieniami fazetu i materiału.
getBevelTop i getBevelBottom Wygięte lub zaokrąglone krawędzie na przedniej i tylnej powierzchni. Dodaj złagodzoną lub formowaną krawędź zamiast ostrej, płaskiej powierzchni.
getContourColor oraz getContourWidth i setContourWidth Kontur wokół obiektu 3D. Podkreśl granicę obiektu w renderowanym wyjściu.

Utworzenie kształtu 3D

Kształt zazwyczaj wymaga czterech rodzajów ustawień, aby wyglądał przekonująco 3D:

  • Ustawienia kamery, ponieważ domyślny widok z przodu może ukrywać ekstruzję.
  • Ustawienia oświetlenia, ponieważ światło sprawia, że powierzchnie i boki są czytelne.
  • Ustawienia materiału, ponieważ powierzchnia wpływa na sposób renderowania światła.
  • Ustawienia ekstruzji lub głębokości, ponieważ płaski kształt potrzebuje grubości.

Poniższy przykład tworzy prostokąt, dodaje tekst do jego przedniej powierzchni i stosuje formatowanie 3D. Wartości rotacji kamery podane są w stopniach, a wysokość ekstruzji wynosi 100 punktów. Przykład renderuje slajd do obrazu PNG w podwójnych domyślnych wymiarach i zapisuje prezentację jako PPTX.

import com.aspose.slides.*;
import android.graphics.Color;

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.rgb(100, 149, 237));

    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();
}

Renderowany obraz slajdu pokazuje prostokąt jako grubą bryłę 3D:

Renderowany niebieski prostokąt 3D z białym tekstem 3D na przedniej powierzchni

Obrócenie kształtu przy użyciu kamery

W PowerPoint rotacja 3D jest konfigurowana z panelu Obrót 3‑D. Wartości rotacji X, Y i Z odpowiadają rotacji ustawionej przez API kamery.

Panel Obrót 3‑D w PowerPoint z podświetlonymi wartościami rotacji X, Y i Z

W Aspose.Slides dostęp do kamery uzyskuje się przez IThreeDFormat.getCamera. Ten przykład tworzy prostokąt, wybiera ortograficzny widok z przodu i ustawia rotacje X, Y i Z na 20, 30 i 40 stopni. Konfiguruje kształt w pamięci bez zapisywania pliku:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape 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();
}

Używaj kamery, gdy musisz zmienić sposób, w jaki obserwator widzi obiekt. Nie zmienia to geometrii 2D kształtu na slajdzie. Zmienia jedynie punkt widzenia 3D używany przez PowerPoint i Aspose.Slides podczas renderowania.

Dodanie ekstruzji i głębokości

Ekstruzja sprawia, że kształt wygląda na gruby, wydłużając go za przednią powierzchnię. W PowerPoint kontrolka głębokości ustawia tę widoczną grubość, a kontrolka koloru ustawia kolor boków.

Kontrolki głębokości w PowerPoint powiązane z właściwościami koloru i wysokości ekstruzji

Użyj IThreeDFormat.setExtrusionHeight aby ustawić grubość i IThreeDFormat.getExtrusionColor aby odczytać kolor boków. Ten przykład nadaje prostokątowi ekstruzję 100 punktów z fioletowymi bokami i obraca kamerę, aby uwidocznić grubość. Konfiguruje kształt w pamięci bez zapisywania pliku:

import com.aspose.slides.*;
import android.graphics.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 200, 200);

    int extrusionColor = Color.rgb(128, 0, 128);

    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(extrusionColor);
} finally {
    presentation.dispose();
}

Metoda IThreeDFormat.setDepth ustawia głębokość kształtu 3D. Metoda setExtrusionHeight kontroluje wysokość efektu ekstruzji, co pokazano w tym przykładzie.

Użycie wypełnie gradientowych lub obrazkowych z efektami 3D

Formatowanie 3D jest niezależne od wypełnienia kształtu. Możesz zastosować jednolity kolor, gradient, wzór lub obraz jako wypełnienie przedniej powierzchni i nadal korzystać z tych samych ustawień kamery, światła, materiału i ekstruzji.

Ten przykład stosuje gradient od niebieskiego do pomarańczowego na przedniej powierzchni oraz ciemnopomarańczowy kolor dla ekstruzji 150 punktów. Punkty zatrzymania gradientu 0 i 100 oznaczają początek i koniec gradientu. Wartości rotacji kamery podane są w stopniach. Slajd renderowany jest do obrazu PNG w podwójnych domyślnych wymiarach:

import com.aspose.slides.*;
import android.graphics.Color;

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.rgb(255, 165, 0));

    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);
    int extrusionColor = Color.rgb(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();
}

Renderowane wyjście zachowuje gradient na przedniej powierzchni i renderuje ekstruzję osobno:

Renderowany prostokąt 3D z gradientem niebiesko‑pomarańczowym i pomarańczową ekstruzją

Aby użyć wypełnienia obrazkowego, dodaj obraz do prezentacji i przypisz go jako wypełnienie kształtu. Ten przykład wymaga istniejącego pliku o nazwie “image.jpg” w katalogu roboczym. Rozciąga zdjęcie, aby wypełnić prostokąt, stosuje ekstruzję 150 punktów i ustawia rotację kamery w stopniach. Konfiguruje kształt w pamięci bez zapisywania ani renderowania pliku:

import com.aspose.slides.*;
import android.graphics.Color;
import java.io.FileInputStream;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 150, 250, 250);

    IPPImage image;
    try (FileInputStream imageStream = new FileInputStream("image.jpg")) {
        image = presentation.getImages().addImage(imageStream);
    }

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

    int extrusionColor = Color.rgb(255, 140, 0);
    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);
    shape.getThreeDFormat().setExtrusionHeight(150);
    shape.getThreeDFormat().getExtrusionColor().setColor(extrusionColor);
} finally {
    presentation.dispose();
}

Obraz jest renderowany na przedniej powierzchni, natomiast ekstruzja jest renderowana jako boczna powierzchnia 3D:

Renderowany prostokąt 3D z wypełnieniem zdjęciem na przedniej powierzchni i pomarańczową ekstruzją

Zastosowanie formatowania 3D do tekstu

Formatowanie 3D kształtu wpływa na ciało kształtu. Formatowanie 3D tekstu wpływa na ramkę tekstową. Jest to przydatne dla efektów przypominających WordArt, gdzie same litery wymagają ekstruzji, materiału, oświetlenia i ustawień kamery.

Poniższy przykład tworzy tekst z pomarańczowo‑białym wzorem siatki, stosuje łuk w górę i konfiguruje ustawienia 3D poprzez ITextFrameFormat.getThreeDFormat. Wysokość ekstruzji i głębokość podane są w punktach, a rotacja światła w stopniach. Wypełnienie i kontur kształtu są ukryte, aby widoczny był tylko tekst. Przykład renderuje obraz PNG w podwójnych domyślnych wymiarach slajdu i zapisuje prezentację jako PPTX:

import com.aspose.slides.*;
import android.graphics.Color;

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);
    int patternColor = Color.rgb(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();
}

Tekst renderowany jest jako zakrzywione, ekstruzowane litery 3D:

Renderowany tekst 3D z łukowatą transformacją WordArt, pomarańczowym wypełnieniem wzorem i ciemną ekstruzją

Utrzymanie tekstu płaskiego na kształcie 3D

Aby tekst był czytelny przy zachowaniu wyglądu 3D kształtu, wywołaj ITextFrameFormat.setKeepTextFlat przez ITextFrame.getTextFrameFormat. Gdy wartość wynosi true, tekst pozostaje poza sceną 3D. Gdy jest false, tekst uczestniczy w scenie i podąża za jej orientacją 3D.

To ustawienie nie usuwa formatowania 3D kształtu: jego kamera, oświetlenie, materiał i ekstruzja pozostają skonfigurowane przez IShape.getThreeDFormat. Różni się to także od zwykłej rotacji. IShape.setRotation obraca kształt w płaszczyźnie slajdu, natomiast ITextFrameFormat.setRotationAngle kontroluje niestandardową rotację tekstu w jego prostokącie ograniczającym. Utrzymanie tekstu poza sceną 3D nie resetuje żadnego z tych kątów.

Poniższy samodzielny przykład tworzy niebieski prostokąt z tekstem i klonuje go obok oryginału. Oba kształty mają identyczne formatowanie 3D; jedynie ustawienie tekstu różni się: false po lewej i true po prawej. Kąty kamery podane są w stopniach, a wysokość ekstruzji to 40 punktów. Przykład zapisuje prezentację jako PPTX i renderuje porównawczy slajd do PNG w podwójnych domyślnych wymiarach.

import com.aspose.slides.*;
import android.graphics.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 70, 160, 240, 140);

    shape.getTextFrame().setText("Readable text");
    shape.getTextFrame().getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat().setFontHeight(28);
    shape.getTextFrame().getParagraphs().get_Item(0).getParagraphFormat().setAlignment(TextAlignment.Center);
    shape.getTextFrame().getTextFrameFormat().setAnchoringType(TextAnchorType.Center);
    shape.getFillFormat().setFillType(FillType.Solid);
    shape.getFillFormat().getSolidFillColor().setColor(Color.rgb(100, 149, 237));

    shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront);
    shape.getThreeDFormat().getCamera().setRotation(30, 30, 0);
    shape.getThreeDFormat().getLightRig().setLightType(LightRigPresetType.Flat);
    shape.getThreeDFormat().getLightRig().setDirection(LightingDirection.Top);
    shape.getThreeDFormat().setMaterial(MaterialPresetType.Flat);
    shape.getThreeDFormat().setExtrusionHeight(40);
    shape.getThreeDFormat().getExtrusionColor().setColor(Color.rgb(65, 105, 225));
    shape.getTextFrame().getTextFrameFormat().setKeepTextFlat(false);

    IAutoShape flatTextShape = (IAutoShape) slide.getShapes().addClone(shape, 400, 160);
    flatTextShape.getTextFrame().getTextFrameFormat().setKeepTextFlat(true);

    presentation.save("keep_text_flat.pptx", SaveFormat.Pptx);
    IImage image = slide.getImage(2, 2);
    try {
        image.save("keep_text_flat.png", ImageFormat.Png);
    } finally {
        image.dispose();
    }
} finally {
    presentation.dispose();
}

Po lewej tekst podąża za orientacją 3D. Po prawej pozostaje płaski i łatwiejszy do odczytania. Oba prostokąty zachowują tę samą widoczną ekstruzję i orientację 3D.

Prostokąty 3D obok siebie: tekst podąża za orientacją 3D po lewej i pozostaje płaski po prawej

Zachowanie przy eksporcie i renderowaniu

Aspose.Slides zachowuje formatowanie 3D przy zapisie do formatów PowerPoint, takich jak PPTX. Przy renderowaniu lub eksporcie do formatów o stałym układzie, scena 3D jest rastrowana lub rysowana w wyjściu jako wynik 2D. Dotyczy to renderowania slajdów do PNG, eksportu do PDF, eksportu do HTML lub generowania klatek do konwersji wideo.

Pamiętaj o następujących punktach:

  • Eksportowane obrazy i pliki PDF nie są interaktywne. Obiekt nie może być obracany przez odbiorcę po eksporcie.
  • Ostateczny wygląd zależy od kombinacji kamery, zestawu świateł, materiału, ekstruzji, wypełnienia i skalowania slajdu.
  • Jeśli potrzebujesz sprawdzić odziedziczone lub oparte na temacie wartości formatowania, odczytaj efektywne właściwości kształtu.
  • Niektóre formaty wyjściowe nie mogą przechowywać edytowalnego formatowania 3D PowerPoint. W tych formatach wynik wizualny jest renderowany, a nie zachowywany jako edytowalne ustawienia 3D.

FAQ

Czy Aspose.Slides może tworzyć interaktywne prezentacje 3D?

Aspose.Slides tworzy i renderuje efekty 3D PowerPoint dla kształtów i tekstu. Nie sprawia, że wyeksportowane obrazy, PDF‑y ani strony HTML są interaktywnymi scenami 3D, które odbiorca może obracać. W PPTX formatowanie 3D pozostaje edytowalne w PowerPoint, o ile format to obsługuje.

Jaka jest różnica między modelem 3D a efektem 3D?

Model 3D to osobny obiekt 3D wstawiony do prezentacji. Efekt 3D to formatowanie zastosowane do zwykłego kształtu PowerPoint lub tekstu, takie jak rotacja, ekstruzja, fazet, oświetlenie i materiał. Ten artykuł opisuje efekty 3D.

Jakie ustawienia są wymagane, aby kształt był widocznie 3D?

Co najmniej ustaw rotację kamery oraz ekstruzję lub głębokość. W praktyce warto także ustawić zestaw świateł i materiał, aby renderowane powierzchnie miały wyraźne podświetlenia i cienie.

Czy mogę zastosować efekty 3D zarówno do kształtów, jak i do tekstu?

Tak. Użyj IShape.getThreeDFormat dla ciała kształtu i ITextFrameFormat.getThreeDFormat dla tekstu.

Czy efekty 3D pojawią się przy eksporcie do obrazów, PDF, HTML lub klatek wideo?

Tak. Aspose.Slides renderuje efekty 3D podczas generowania obrazów slajdów, wyjścia PDF, HTML oraz klatek używanych do konwersji wideo. Wyjściowy plik zawiera wyrenderowany wygląd, a nie edytowalny obiekt 3D.

Czy mogę odczytać ostateczne wartości 3D po zastosowaniu dziedziczenia i ustawień tematu?

Tak. Użyj API efektywnego formatowania opisanych w Właściwościach efektywnych kształtu, aby odczytać końcowe wartości kamery, zestawu świateł, fazetu i powiązane wartości 3D.