Создание 3D презентаций в .NET

Обзор

Как обычно создаёте 3D презентацию в PowerPoint? Microsoft PowerPoint позволяет создавать 3D‑презентации, в которые можно добавлять 3D‑модели, применять 3D‑эффекты к фигурам, создавать 3D‑текст, загружать 3D‑графику в презентацию, создавать 3D‑анимацию PowerPoint.

Создание 3D‑эффектов существенно улучшает вашу презентацию, преобразуя её в 3D‑презентацию, и может быть самым простым способом внедрения 3D.

Начиная с версии Aspose.Slides 20.9 добавлен новый кроссплатформенный 3D‑движок. Новый 3D‑движок позволяет экспортировать и растеризовать фигуры и текст с 3D‑эффектами. В предыдущих версиях фигуры Slides с применёнными 3D‑эффектами отображались плоско. Теперь же можно отображать фигуры с полноценным 3D.

Более того, теперь можно создавать фигуры с 3D‑эффектами через публичный API Slides.

В API Aspose.Slides, чтобы превратить фигуру в 3D‑фигуру PowerPoint, используйте свойство IShape.ThreeDFormat, которое наследует возможности интерфейса IThreeDFormat:

  • BevelBottom и BevelTop: задают фаску фигуре, определяют тип фаски (например, Angle, Circle, SoftRound), высоту и ширину фаски.
  • Camera: используется для имитации перемещений камеры вокруг объекта. Другими словами, задавая вращение, масштаб и другие свойства камеры, вы можете «развлекать» свои фигуры, как 3D‑модель в PowerPoint.
  • ContourColor и ContourWidth: задают свойства контура, чтобы фигура выглядела как 3D‑фигура PowerPoint.
  • Depth, ExtrusionColor и ExtrusionHeight: используются для придания фигуре трёхмерности, то есть для преобразования 2D‑фигуры в 3D‑фигуру, задавая её глубину или экструзию.
  • LightRig: может создавать световой эффект на 3D‑фигуре. Логика этого свойства похожа на Camera, вы можете задать вращение света относительно 3D‑фигуры и выбрать тип света.
  • Material: установка типа материала 3D‑фигуры придаёт ей более живой вид. Свойство предоставляет набор предопределённых материалов, таких как: Metal, Plastic, Powder, Matte и др.

Все 3D‑возможности могут применяться как к фигурам, так и к тексту. Давайте посмотрим, как получить доступ к перечисленным выше свойствам, а затем подробно рассмотрим их шаг за шагом:

const float imageScale = 2;

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    IAutoShape shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 150, 200, 200);
    shape.TextFrame.Text = "3D";
    shape.TextFrame.Paragraphs[0].ParagraphFormat.DefaultPortionFormat.FontHeight = 64;

    shape.ThreeDFormat.Camera.CameraType = CameraPresetType.OrthographicFront;
    shape.ThreeDFormat.Camera.SetRotation(20, 30, 40);
    shape.ThreeDFormat.LightRig.LightType = LightRigPresetType.Flat;
    shape.ThreeDFormat.LightRig.Direction = LightingDirection.Top;
    shape.ThreeDFormat.Material = MaterialPresetType.Flat;
    shape.ThreeDFormat.ExtrusionHeight = 100;
    shape.ThreeDFormat.ExtrusionColor.Color = Color.Blue;

    using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
    {
        thumbnail.Save("sample_3d.png");
    }

    presentation.Save("sandbox_3d.pptx", SaveFormat.Pptx);
}

Полученный миниатюрный образ выглядит так:

todo:image_alt_text

3D‑вращение

Можно вращать 3D‑фигуры PowerPoint в 3D‑пространстве, что добавляет интерактивность. Чтобы вращать 3D‑фигуру в PowerPoint, обычно используют следующее меню:

todo:image_alt_text

В API Aspose.Slides вращение 3D‑фигур можно управлять с помощью свойства IThreeDFormat.Camera:

IAutoShape shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 150, 200, 200);
shape.ThreeDFormat.Camera.SetRotation(20, 30, 40);
// ... установить другие параметры 3D-сцены

using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
{
    thumbnail.Save("sample_3d.png");
}

3D‑глубина и экструзия

Чтобы добавить третье измерение вашей фигуре и сделать её 3D‑фигурой, используйте свойства IThreeDFormat.ExtrusionHeight и IThreeDFormat.ExtrusionColor.Color:

IAutoShape shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 150, 200, 200);
shape.ThreeDFormat.Camera.SetRotation(20, 30, 40);
shape.ThreeDFormat.ExtrusionHeight = 100;
shape.ThreeDFormat.ExtrusionColor.Color = Color.Purple;
// ... установить другие параметры 3D-сцены

using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
{
    thumbnail.Save("sample_3d.png");
}

Обычно вы используете меню Depth в PowerPoint, чтобы задать глубину для 3D‑фигуры PowerPoint:

todo:image_alt_text

3D‑градиент

Градиент можно использовать для заполнения цвета 3D‑фигуры PowerPoint. Давайте создадим фигуру с градиентной заливкой и применим к ней 3D‑эффект:

const float imageScale = 2;

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    IAutoShape shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 150, 250, 250);
    shape.TextFrame.Text = "3D Gradient";
    shape.TextFrame.Paragraphs[0].ParagraphFormat.DefaultPortionFormat.FontHeight = 64;

    shape.FillFormat.FillType = FillType.Gradient;
    shape.FillFormat.GradientFormat.GradientStops.Add(0, Color.Blue);
    shape.FillFormat.GradientFormat.GradientStops.Add(100, Color.Orange);
    
    shape.ThreeDFormat.Camera.CameraType = CameraPresetType.OrthographicFront;
    shape.ThreeDFormat.Camera.SetRotation(10, 20, 30);
    shape.ThreeDFormat.LightRig.LightType = LightRigPresetType.Flat;
    shape.ThreeDFormat.LightRig.Direction = LightingDirection.Top;
    shape.ThreeDFormat.ExtrusionHeight = 150;
    shape.ThreeDFormat.ExtrusionColor.Color = Color.DarkOrange;

    using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
    {
        thumbnail.Save("sample_3d.png");
    }
}

И вот результат:

todo:image_alt_text

Помимо градиентной заливки, фигуры можно заполнить изображением:

byte[] imageData = File.ReadAllBytes("image.jpg");
IPPImage image = presentation.Images.AddImage(imageData);

shape.FillFormat.FillType = FillType.Picture;
shape.FillFormat.PictureFillFormat.Picture.Image = image;
shape.FillFormat.PictureFillFormat.PictureFillMode = PictureFillMode.Stretch;
// ... настройка 3D: shape.ThreeDFormat.Camera, shape.ThreeDFormat.LightRig, shape.ThreeDFormat.Extrusion* свойства

using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
{
    thumbnail.Save("sample_3d.png");
}

Вот как это выглядит:

todo:image_alt_text

3D‑текст (WordArt)

Aspose.Slides также позволяет применять 3D к тексту. Для создания 3D‑текста можно использовать трансформирующий эффект WordArt:

const float imageScale = 2;

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    IAutoShape shape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 200, 150, 250, 250);
    shape.FillFormat.FillType = FillType.NoFill;
    shape.LineFormat.FillFormat.FillType = FillType.NoFill;
    shape.TextFrame.Text = "3D Text";

    Portion portion = (Portion)shape.TextFrame.Paragraphs[0].Portions[0];
    portion.PortionFormat.FillFormat.FillType = FillType.Pattern;
    portion.PortionFormat.FillFormat.PatternFormat.ForeColor.Color = Color.DarkOrange;
    portion.PortionFormat.FillFormat.PatternFormat.BackColor.Color = Color.White;
    portion.PortionFormat.FillFormat.PatternFormat.PatternStyle = PatternStyle.LargeGrid;

    shape.TextFrame.Paragraphs[0].ParagraphFormat.DefaultPortionFormat.FontHeight = 128;

    ITextFrameFormat textFrameFormat = shape.TextFrame.TextFrameFormat;
    // установить трансформирующий эффект WordArt "Arch Up"
    textFrameFormat.Transform = TextShapeType.ArchUp;

    textFrameFormat.ThreeDFormat.ExtrusionHeight = 3.5f;
    textFrameFormat.ThreeDFormat.Depth = 3;
    textFrameFormat.ThreeDFormat.Material = MaterialPresetType.Plastic;
    textFrameFormat.ThreeDFormat.LightRig.Direction = LightingDirection.Top;
    textFrameFormat.ThreeDFormat.LightRig.LightType = LightRigPresetType.Balanced;
    textFrameFormat.ThreeDFormat.LightRig.SetRotation(0, 0, 40);

    textFrameFormat.ThreeDFormat.Camera.CameraType = CameraPresetType.PerspectiveContrastingRightFacing;

    using (IImage thumbnail = slide.GetImage(imageScale, imageScale))
    {
        thumbnail.Save("text3d.png");
    }

    presentation.Save("text3d.pptx", SaveFormat.Pptx);
}

Вот результат:

todo:image_alt_text

FAQ

Будут ли 3D‑эффекты сохранены при экспорте презентации в изображения/PDF/HTML?

Да. 3D‑движок Slides рендерит 3D‑эффекты при экспорте в поддерживаемые форматы (images, PDF, HTML, и т.д.).

Могу ли я получить «эффективные» (окончательные) значения параметров 3D, учитывающие темы, наследование и т.п.?

Да. Slides предоставляет API для чтения эффективных значений (в том числе для 3D — освещения, фасок и т.д.), чтобы вы могли увидеть окончательные применённые настройки.

Работают ли 3D‑эффекты при конвертации презентации в видео?

Да. При генерации кадров для видео 3D‑эффекты рендерятся так же, как и при экспорте изображений.