Создание 3D‑эффектов в презентациях на Android
Обзор
Aspose.Slides for Android via Java может создавать, редактировать, сохранять и отображать 3D‑форматирование в стиле PowerPoint для фигур и текста. В этой статье рассматриваются 3D‑эффекты, такие как вращение, экструзия, фаски, освещение, материал, градиентные или растровые заливки и 3D‑текст.
Концепции 3D‑форматирования
Используйте метод IShape.getThreeDFormat для применения 3D‑форматирования к фигуре. Метод возвращает IThreeDFormat, который управляет 3D‑сценой для этой фигуры.
Для текста используйте метод ITextFrameFormat.getThreeDFormat . Он применяет 3D‑форматирование к текстовому фрейму, а не к телу фигуры.
Самые важные члены API:
| API member | Что управляет | Когда использовать |
|---|---|---|
| getCamera | Точка просмотра, предустановленный тип камеры, вращение, масштаб и перспектива. | Вращайте объект в 3‑D пространстве или используйте предустановку вращения PowerPoint. |
| getLightRig | Предустановка освещения, направление и вращение света. | Измените отображение бликов и теней на 3‑D поверхности. |
| getMaterial и setMaterial | Материал поверхности, например плоский, матовый, пластик или металл. | Сделайте одну и ту же геометрию более плоской, мягкой, блестящей или металлической. |
| getExtrusionHeight и setExtrusionHeight | Наглубление фигуры обратно от её передней грани. | Преобразуйте плоскую фигуру в видимый толстый 3‑D объект. |
| getExtrusionColor | Цвет экструзированных боковых граней. | Сделайте глубину видимой или согласуйте цвет боков с передней заливкой. |
| getDepth и setDepth | Дополнительная 3‑D глубина, используемая форматированием PowerPoint. | Тонко настройте глубину фигур или текста, особенно совместно с настройками фаски и материала. |
| getBevelTop и getBevelBottom | Поднятые или скруглённые кромки на передних и задних гранях. | Добавьте смягчённую или формованную кромку вместо острой плоской грани. |
| getContourColor, getContourWidth, и setContourWidth | Контур вокруг 3‑D объекта. | Подчеркните границу объекта в отрисованном выводе. |
Создание 3D‑формы
Фигуре обычно нужны четыре типа настроек, чтобы она выглядела убедительно 3D:
- Настройки камеры, потому что вид по умолчанию может скрывать экструзию.
- Настройки света, потому что освещение делает грани и боковики читаемыми.
- Настройки материала, потому что поверхность влияет на то, как свет отображается.
- Настройки экструзии или глубины, потому что плоской фигуре нужна толщина.
Следующий пример создаёт прямоугольник, добавляет текст к передней грани, применяет 3D‑форматирование, сохраняет презентацию как PPTX и рендерит слайд в 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.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();
}
Сгенерированное изображение слайда показывает прямоугольник как толстый 3D‑блок:

Вращение фигуры с помощью камеры
В PowerPoint 3‑D‑вращение настраивается в панели 3‑D‑Rotation. Значения вращения по осям X, Y и Z соответствуют вращению, задаваемому через API камеры.

В Aspose.Slides задайте тип камеры и вращение через IThreeDFormat.getCamera:
shape.getThreeDFormat().getCamera().setCameraType(CameraPresetType.OrthographicFront);
shape.getThreeDFormat().getCamera().setRotation(20, 30, 40);
Используйте камеру, когда нужно изменить точку зрения наблюдателя. Это не меняет 2D‑геометрию фигуры на слайде, а меняет 3D‑вид, который используют PowerPoint и Aspose.Slides при рендеринге.
Добавление экструзии и глубины
Экструзия делает фигуру толстой, вытягивая её за переднюю грань. В PowerPoint управление глубиной задаёт эту видимую толщину, а управление цветом задаёт цвет боковых граней.

Установите IThreeDFormat.setExtrusionHeight для толщины и IThreeDFormat.getExtrusionColor для цвета боков:
shape.getThreeDFormat().getCamera().setRotation(20, 30, 40);
shape.getThreeDFormat().setExtrusionHeight(100);
shape.getThreeDFormat().getExtrusionColor().setColor(Color.rgb(128, 0, 128));
Используйте IThreeDFormat.setDepth когда необходимо работать напрямую со значением глубины PowerPoint или комбинировать глубину с фаской, материалом и эффектами текста. Во многих сценариях фигур setExtrusionHeight яснее, потому что сразу задаёт видимую экструзию.
Использование градиентных или растровых заливок с 3D‑эффектами
3D‑форматирование независимо от заливки фигуры. Вы можете применить сплошной цвет, градиент, узор или растровую заливку к передней грани и при этом использовать те же настройки камеры, света, материала и экструзии.
В этом примере градиентная заливка применяется к фигуре, а боковым граням задаётся более тёмный цвет экструзии:
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);
shape.getThreeDFormat().setExtrusionHeight(150);
shape.getThreeDFormat().getExtrusionColor().setColor(Color.rgb(255, 140, 0));
IImage thumbnail = slide.getImage(imageScale, imageScale);
try {
thumbnail.save("gradient_3d.png", ImageFormat.Png);
} finally {
thumbnail.dispose();
}
} finally {
presentation.dispose();
}
Отрисованный результат сохраняет градиент на передней грани и отдельно рендерит экструзию:

Чтобы вместо этого использовать растровую заливку, добавьте изображение в презентацию и назначьте его заливкой фигуры:
IPPImage image;
try (FileInputStream imageStream = new FileInputStream("image.png")) {
image = presentation.getImages().addImage(imageStream);
}
shape.getFillFormat().setFillType(FillType.Picture);
shape.getFillFormat().getPictureFillFormat().getPicture().setImage(image);
shape.getFillFormat().getPictureFillFormat().setPictureFillMode(PictureFillMode.Stretch);
shape.getThreeDFormat().getCamera().setRotation(10, 20, 30);
shape.getThreeDFormat().setExtrusionHeight(150);
shape.getThreeDFormat().getExtrusionColor().setColor(Color.rgb(255, 140, 0));
Изображение рендерится на передней грани, а экструзия отображается как 3D‑поверхность боков:

Применение 3D‑форматирования к тексту
3D‑форматирование фигуры влияет на её тело. 3D‑форматирование текста влияет на текстовый фрейм. Это удобно для эффектов типа WordArt, когда сами буквы нуждаются в экструзии, материале, освещении и настройках камеры.
Следующий пример создаёт текст с узорной заливкой, применяет трансформацию WordArt и настраивает 3D‑параметры у 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);
portion.getPortionFormat().getFillFormat().getPatternFormat().getForeColor().setColor(Color.rgb(255, 140, 0));
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.5);
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();
}
Текст отображается как изогнутые, экструзированные 3D‑буквы:

Поведение при экспорте и рендеринге
Aspose.Slides сохраняет 3D‑форматирование при сохранении в форматы PowerPoint, такие как PPTX. При рендеринге или экспорте в форматы фиксированного макета 3D‑сцена растеризуется или отрисовывается в вывод как 2D‑результат. Это относится к рендерингу слайдов в PNG, экспорту в PDF, экспорту в HTML, или созданию кадров для видеоконвертации.
Имейте в виду следующее:
- Экспортированные изображения и PDF не интерактивны. Объект нельзя вращать после экспорта.
- Финальный вид зависит от комбинации камеры, световой установки, материала, экструзии, заливки и масштабирования слайда.
- Если необходимо просмотреть унаследованные или тематические значения форматирования, читайте Эффективные свойства фигур.
- Некоторые форматы вывода не могут хранить редактируемое 3D‑форматирование PowerPoint. В этих форматах визуальный результат рендерится, а не сохраняется как редактируемые 3D‑настройки.
Часто задаваемые вопросы
Может ли Aspose.Slides создавать интерактивные 3D‑презентации?
Aspose.Slides создаёт и рендерит 3D‑эффекты PowerPoint для фигур и текста. Он не делает экспортированные изображения, PDF или HTML‑страницы интерактивными 3D‑сценами, которые пользователь может вращать. В PPTX 3D‑форматирование остаётся редактируемым в PowerPoint, если формат поддерживает его.
В чём разница между 3D‑моделью и 3D‑эффектом?
3D‑модель — это отдельный 3D‑объект, вставляемый в презентацию. 3D‑эффект — это форматирование, применяемое к обычной фигуре или тексту PowerPoint, например вращение, экструзия, фаска, освещение и материал. Эта статья охватывает именно 3D‑эффекты.
Какие настройки необходимы для видимой 3D‑фигуры?
Как минимум нужно задать вращение камеры и либо экструзию, либо глубину. На практике также задают световую установку и материал, чтобы рендеренные грани имели чёткие блики и тени.
Можно ли применять 3D‑эффекты одновременно к фигурам и тексту?
Да. Используйте IShape.getThreeDFormat для тела фигуры и ITextFrameFormat.getThreeDFormat для текста.
Будут ли 3D‑эффекты сохранены при экспорте в изображения, PDF, HTML или видеокадры?
Да. Aspose.Slides рендерит 3D‑эффекты при создании изображений слайдов, PDF‑вывода, HTML‑вывода и кадров для видеоконвертации. Экспортированный вывод содержит отрисованный вид, а не редактируемый 3D‑объект.
Можно ли прочитать окончательные 3D‑значения после применения наследования и тем?
Да. Используйте API эффективного форматирования, описанное в Эффективных свойствах фигур, чтобы получить финальные значения камеры, световой установки, фаски и связанных 3D‑параметров.