threejs实现三维泡泡球聚集碰撞物理动画效果代码

代码语言:html

所属分类:三维

代码描述:threejs实现三维泡泡球聚集碰撞物理动画效果代码

代码标签: 泡泡 聚集 碰撞 物理 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>

    <meta charset="UTF-8">

 
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel='stylesheet' href='https://cdn.jsdelivr.net/gh/alphardex/aqua.css/dist/aqua.min.css'>

    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            margin: 0;
        }

:root {
            --white-grad-1: linear-gradient(to top, #e6e9f0 0%, #eef1f5 100%);
        }

        .bg-white-grad-1 {
            background: var(--white-grad-1);
        }
    </style>




</head>

<body>
    <div class="relative w-screen h-screen">
        <div class="bouncy-balloon w-full h-full bg-black bg-white-grad-1"></div>
    </div>


    <script type="module">
        import * as THREE from "https://cdn.skypack.dev/three@0.124.0";
        import ky from "https://cdn.skypack.dev/kyouka@1.2.5";
        import {
            OrbitControls
        } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/controls/OrbitControls";
        import {
            GLTFLoader
        } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/loaders/GLTFLoader";
        import {
            FBXLoader
        } from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/loaders/FBXLoader";
        import Stats from "https://cdn.skypack.dev/three@0.124.0/examples/jsm/libs/stats.module";
        import * as CANNON from "https://cdn.skypack.dev/cannon-es@0.18.0";
        import {
            EffectComposer,
            RenderPass,
            NormalPass,
            SSAOEffect,
            EffectPass
        } from "https://cdn.skypack.dev/postprocessing@6.22.2";
        const calcAspect = (el) => el.clientWidth / el.clientHeight;
        const getNormalizedMousePos = (e) => {
            return {
                x: (e.clientX / window.innerWidth) * 2 - 1,
                y: -(e.clientY / window.innerHeight) * 2 + 1
            };
        };
        // 三维点
        class Point {
            constructor(p) {
                this.x = p.x;
                this.y = p.y;
                this.z = p.z;
            }
        }
        // 数组转化为点
        const array2Point = (arr) => new Point({
            x: arr[0], y: arr[1], z: arr[2]
        });
        // 点转化为数组
        const point2Array = (point) => [point.x, point.y, point.z];
        // 多个数组转化为多个点
        const arrays2Point = (arrs) => arrs.map((item) => array2Point(item));
        // 点转化为Three.js的向量
        const point2ThreeVector = (point) => new THREE.Vector3(point.x, point.y, point.z);
        // 点转化为Cannon.js的向量
        const point2CannonVec = (point) => new CANNON.Vec3(point.x, point.y, point.z);
        class MeshPhysicsObject {
            constructor(mesh, body, copyPosition = true, copyQuaternion = true) {
                this.mesh = mesh;
                this.body = body;
                this.copyPosition = copyPosition;
                this.copyQuaternion = copyQuaternion;
            }
        }
        class Base {
            constructor(sel, debug = false) {
                this.debug = debug;
                this.container = document.querySelector(sel);
                this.perspectiveCameraParams = {
                    fov: 75,
                    near: 0.1,
                    far: 100
                };
                this.orthographicCameraParams = {
                    zoom: 2,
                    near: -100,
                    far: 1000
                };
                this.cameraPosition = new THREE.Vector3(0, 3, 10);
                this.lookAtPosition = new THREE.Vector3(0, 0, 0);
                this.rendererParams = {
                    outputEncoding: THREE.LinearEncoding,
                    config: {
                        alpha: true,
                        antialias: true
                    }
                };
                this.mousePos = new THREE.Vector2(0, 0);
                this.mouseSpeed = 0;
            }
            // 初始化
            init() {
                this.createScene();
                this.createPerspectiveCamera();
                this.createRenderer();
                this.createMesh({});
                this.createLight();
                this.createOrbitControls();
                this.addListeners();
                this.setLoop();
            }
            // 创建场景
            createScene() {
                const scene = new THREE.Scene();
                if (this.debug) {
                    scene.add(new THREE.AxesHelper());
                    const stats = Stats();
                    this.container.appendChild(stats.dom);
                    this.stats = stats;
                }
                this.scene = scene;
            }
            // 创建透视相机
            createPerspectiveCamera() {
                const {
                    perspectiveCameraParams,
                    cameraPosition,
                    lookAtPosition
                } = this;
                const {
                    fov,
                    near,
                    far
                } = perspectiveCameraParams;
                const aspect = calcAspect(this.container);
                const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
                camera.position.copy(cameraPosition);
                camera.lookA.........完整代码请登录后点击上方下载按钮下载查看

网友评论0