предисловие
Недавно я хочу сделать эффект 3D карты.Схема конструкции выглядит следующим образом:
Выходные данные
Версия, используемая PixiJS: PixiJS 4.8.7 — WebGL
причина попробовать
В моей первой попытке я использовал PixiJS, с которым я знаком.Хотя PixiJS — это механизм 2D-рендеринга,pixi-projectionПлагин обеспечивает 2D- и 3D-проекцию в будущих версиях PixiJS.
На момент публикации этой статьи официальный API для v5 не был предоставлен.
Я использовал его в предыдущих проектахSprite2d
,Container2d
,setAxisY
,AFFINE.AXIS_X
После того, как API реализовал эффект 2d проекции, эффект неплохой.Если вам интересно, вы можетеНажмите здесь, чтобы просмотреть.
Итак, на этот раз я хочу использоватьCamera3d
,Container3d
,Sprite3d
,position3d
,euler
Подождите, пока API-интерфейс 3D-проекции реализует эффект этой 3D-карты.
Эффект
Схема эффекта выглядит следующим образом:Предварительный просмотр онлайн нажмите здесь. Если вы считаете, что эффект ужасен, просто пропустите раздел кода ниже и прочитайте сводку или посмотрите мою вторую попытку использовать CSS3DRenderer с помощью three.js для достижениястатья,Используйте three.js для достижения эффекта нажмите здесь.
Процесс реализации
Сначала создайте камеру (Camera3d), затем пройдитеContainer3d
а такжеSprite3d
Добавьте 3d элементы в камеру, затем передайтеeuler
а такжеposition3d
Чтобы настроить макет и, наконец, анимировать, изменив положение и проекцию элементов или изменение положения камеры. Следующий основной код пропускает настройку центра положения и вращения.
основной код
импортные компоненты
import * as PIXI from 'pixi.js';
import 'pixi-projection';
import {TweenMax} from "gsap/TweenMax";
камера3d инициализация
const camera = new PIXI.projection.Camera3d();
camera.setPlanes(350,-5000,5000); // 参数依次为 焦距、z 轴最近距离, z 轴最远距离
app.stage.addChild(camera);
Инициализировать вертикальный фон
const card_bg_vertical = new PIXI.projection.Sprite3d(PIXI.loader.resources['bg_0.jpg'].texture);
camera.addChild(card_bg_vertical);
наземная инициализация
this.card_ground = new PIXI.projection.Container3d();
this.card_ground.euler.x = -Math.PI/180*10; // 给地面添加透视
camera.addChild(this.card_ground);
const card_ground_bg:PIXI.projection.Sprite3d = new PIXI.projection.Sprite3d(PIXI.loader.resources['bg_1.jpg'].texture);
this.card_ground.addChild(card_ground_bg);
Добавьте элементы сцены на землю
for(let i = 0; i < 10; i++){
const thing = new PIXI.projection.Sprite3d(PIXI.loader.resources['card1_thing_'+i+'.png'].texture);
thing.euler.x = Math.PI/180*10; // 将父元素的透视复原
this.card_ground.addChild(thing);
}
Добавьте анимацию, чтобы повернуть землю, чтобы закрыть карту
const cardTween = new TweenMax.to(this.card_ground.euler,2,{x:-Math.PI/180*180});
Суммировать
об API
-
Camera3d
3d сцена определена, нам нужно добавить 3d элементы в камеру,Camera3d
Предоставляет такие параметры, как фокусное расстояние, ближайшая ось z, самая дальняя ось z и является ли это ортогональной проекцией; -
Container3d
,Sprite3d
Используется для определения 3D-элементов тем же методом, что иContainer
,Sprite
Точно так же некоторые свойства добавляют управление по оси Z; -
Container3d
,Sprite3d
свойства:position3d
,scale3d
,pivot3d
а такжеposition
,scale
,pivot
Отличие заключается в добавлении управления по оси Z. где API не предоставляетсяrotation3d
,можно использоватьeuler
добиться трехмерного вращения;
Отзывы
- Для студентов, знакомых с API PixiJS, относительно просто начать работу с эффектами 2d и 3d проекции, но официальная документация не предоставляется, и необходимо изучить примеры на официальном сайте, чтобы проверить функцию и эффект. каждого API;
- Эффект проекции 2d и 3d основан на расширении старой версии, поэтому преимущества старой версии все еще могут быть использованы в новой версии;
- В конце концов, PixiJS — это движок 2D-рендеринга.
- Во второй попытке я добился вышеуказанного эффекта, используя CSS3DRenderer в three.js,Нажмите здесь, чтобы просмотреть, эффект хоть и вышел, но тоже неудачная попытка, и в дальнейшем будет написано краткое содержание.
больше статей
Посмотрите еще мои статьи:GitHub.com/NingboNingbo/Первоначально…