three.js 内置的几何体Geometry

6 篇文章 4 订阅
2 篇文章 0 订阅

案例效果

所有案例效果地址

前言

前面我们了解了,一个three.js三大基础renderer,camera,scene和响应式three.js
现在我们来学习一下three.js内置的geometry。three.js提供了很多的几何体给我们直接使用,
我就不多说了直接看代码(有点多):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Three.js Geometry Browser</title>
    <style>
        html, body {
            margin: 0;
            height: 100%;
        }

        canvas {
            display: block;
            width: 100%;
            height: 100%;
        }

        #newWindow {
            display: block;
            padding: 10px;
            box-sizing: border-box;
            background: #606366;
            border-radius: 5px;
            position: absolute;
            bottom: 0.3em;
            left: 0.5em;
            color: #fff;
            z-index: 10;
            text-decoration: none;
        }
    </style>
</head>
<body>
<canvas id="canvas"></canvas>

<script type="module">
    import {
        BoxGeometry, BoxBufferGeometry,
        BufferGeometry,
        CircleGeometry, CircleBufferGeometry,
        Color,
        ConeGeometry, ConeBufferGeometry,
        Curve,
        CylinderGeometry, CylinderBufferGeometry,
        DodecahedronGeometry, DodecahedronBufferGeometry,
        DoubleSide,
        ExtrudeGeometry, ExtrudeBufferGeometry,
        Float32BufferAttribute,
        FontLoader,
        Group,
        IcosahedronGeometry, IcosahedronBufferGeometry,
        LatheGeometry, LatheBufferGeometry,
        LineSegments,
        LineBasicMaterial,
        Mesh,
        MeshPhongMaterial,PointsMaterial,Points,
        OctahedronGeometry, OctahedronBufferGeometry,
        ParametricGeometry, ParametricBufferGeometry,
        PerspectiveCamera,
        PlaneGeometry, PlaneBufferGeometry,
        PointLight,
        RingGeometry, RingBufferGeometry,
        Scene,
        Shape,
        ShapeGeometry, ShapeBufferGeometry,
        SphereGeometry, SphereBufferGeometry,
        TetrahedronGeometry, TetrahedronBufferGeometry,
        TextGeometry, TextBufferGeometry,
        TorusGeometry, TorusBufferGeometry,
        TorusKnotGeometry, TorusKnotBufferGeometry,
        TubeGeometry, TubeBufferGeometry,
        Vector2,
        Vector3,
        WireframeGeometry, EdgesGeometry,
        WebGLRenderer
    } from "../../../three.js-r115/build/three.module.js";

    import {GUI} from '../../../three.js-r115/examples/jsm/libs/dat.gui.module.js';
    import {OrbitControls} from '../../../three.js-r115/examples/jsm/controls/OrbitControls.js';
    import {ParametricGeometries} from '../../../three.js-r115/examples/jsm/geometries/ParametricGeometries.js';

    const twoPi = Math.PI * 2;
    let isShowGeometry = ''

    class CustomSinCurve extends Curve {

        constructor(scale = 1) {

            super();

            this.scale = scale;

        }

        getPoint(t, optionalTarget = new Vector3()) {

            const tx = t * 3 - 1.5;
            const ty = Math.sin(2 * Math.PI * t);
            const tz = 0;

            return optionalTarget.set(tx, ty, tz).multiplyScalar(this.scale);

        }

    }

    function updateGroupGeometry(mesh, geometry) {

        if (geometry.isGeometry) {

            geometry = new BufferGeometry().fromGeometry(geometry);

            console.warn('THREE.GeometryBrowser: Converted Geometry to BufferGeometry.');
        }

        mesh.children[0].geometry.dispose();
        mesh.children[1].geometry.dispose();

        if (isShowGeometry === 'EdgesGeometry') {
            mesh.children[0].geometry = new EdgesGeometry(geometry);
        } else {
            mesh.children[0].geometry = new WireframeGeometry(geometry);
        }
        mesh.children[1].geometry = geometry;

        if (isShowGeometry === 'EdgesGeometry' || isShowGeometry === 'WireframeGeometry') {
            mesh.children[1].visible = false
        } else {
            mesh.children[1].visible = true
        }
        // these do not update nicely together if shared

        isShowGeometry = ''
    }

    // heart shape

    const x = 0, y = 0;

    const heartShape = new Shape();

    heartShape.moveTo(x + 5, y + 5);
    heartShape.bezierCurveTo(x + 5, y + 5, x + 4, y, x, y);
    heartShape.bezierCurveTo(x - 6, y, x - 6, y + 7, x - 6, y + 7);
    heartShape.bezierCurveTo(x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19);
    heartShape.bezierCurveTo(x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7);
    heartShape.bezierCurveTo(x + 16, y + 7, x + 16, y, x + 10, y);
    heartShape.bezierCurveTo(x + 7, y, x + 5, y + 5, x + 5, y + 5);

    const guis = {

        BoxBufferGeometry: function (mesh) {

            const data = {
                width: 15,
                height: 15,
                depth: 15,
                widthSegments: 1,
                heightSegments: 1,
                depthSegments: 1
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new BoxBufferGeometry(
                        data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
                    )
                );

            }

            const folder = gui.addFolder('THREE.BoxBufferGeometry');

            folder.add(data, 'width', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 30).onChange(generateGeometry);
            folder.add(data, 'depth', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'depthSegments', 1, 10).step(1).onChange(generateGeometry);

            generateGeometry();
            this['BoxBufferGeometry'].generateGeometry = generateGeometry


        },

        BoxGeometry: function (mesh) {

            const data = {
                width: 15,
                height: 15,
                depth: 15,
                widthSegments: 1,
                heightSegments: 1,
                depthSegments: 1
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new BoxGeometry(
                        data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments
                    )
                );

            }

            const folder = gui.addFolder('THREE.BoxGeometry');

            folder.add(data, 'width', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 30).onChange(generateGeometry);
            folder.add(data, 'depth', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'depthSegments', 1, 10).step(1).onChange(generateGeometry);

            generateGeometry();
            this['BoxGeometry'].generateGeometry = generateGeometry


        },

        CylinderBufferGeometry: function (mesh) {

            const data = {
                radiusTop: 5,
                radiusBottom: 5,
                height: 10,
                radialSegments: 8,
                heightSegments: 1,
                openEnded: false,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new CylinderBufferGeometry(
                        data.radiusTop,
                        data.radiusBottom,
                        data.height,
                        data.radialSegments,
                        data.heightSegments,
                        data.openEnded,
                        data.thetaStart,
                        data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.CylinderBufferGeometry');

            folder.add(data, 'radiusTop', 0, 30).onChange(generateGeometry);
            folder.add(data, 'radiusBottom', 0, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 50).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'openEnded').onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);


            generateGeometry();
            this['CylinderBufferGeometry'].generateGeometry = generateGeometry


        },

        CylinderGeometry: function (mesh) {

            const data = {
                radiusTop: 5,
                radiusBottom: 5,
                height: 10,
                radialSegments: 8,
                heightSegments: 1,
                openEnded: false,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new CylinderGeometry(
                        data.radiusTop,
                        data.radiusBottom,
                        data.height,
                        data.radialSegments,
                        data.heightSegments,
                        data.openEnded,
                        data.thetaStart,
                        data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.CylinderGeometry');

            folder.add(data, 'radiusTop', 1, 30).onChange(generateGeometry);
            folder.add(data, 'radiusBottom', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 50).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'openEnded').onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);


            generateGeometry();
            this['CylinderGeometry'].generateGeometry = generateGeometry


        },

        ConeBufferGeometry: function (mesh) {

            const data = {
                radius: 5,
                height: 10,
                radialSegments: 8,
                heightSegments: 1,
                openEnded: false,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new ConeBufferGeometry(
                        data.radius,
                        data.height,
                        data.radialSegments,
                        data.heightSegments,
                        data.openEnded,
                        data.thetaStart,
                        data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.ConeBufferGeometry');

            folder.add(data, 'radius', 0, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 50).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'openEnded').onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);


            generateGeometry();
            this['ConeBufferGeometry'].generateGeometry = generateGeometry


        },

        ConeGeometry: function (mesh) {

            const data = {
                radius: 5,
                height: 10,
                radialSegments: 8,
                heightSegments: 1,
                openEnded: false,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new ConeGeometry(
                        data.radius,
                        data.height,
                        data.radialSegments,
                        data.heightSegments,
                        data.openEnded,
                        data.thetaStart,
                        data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.ConeGeometry');

            folder.add(data, 'radius', 0, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 50).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 64).step(1).onChange(generateGeometry);
            folder.add(data, 'openEnded').onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);


            generateGeometry();
            this['ConeGeometry'].generateGeometry = generateGeometry


        },

        CircleBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                segments: 32,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new CircleBufferGeometry(
                        data.radius, data.segments, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.CircleBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'segments', 0, 128).step(1).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['CircleBufferGeometry'].generateGeometry = generateGeometry


        },

        CircleGeometry: function (mesh) {

            const data = {
                radius: 10,
                segments: 32,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new CircleGeometry(
                        data.radius, data.segments, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.CircleGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'segments', 0, 128).step(1).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['CircleGeometry'].generateGeometry = generateGeometry


        },

        DodecahedronGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new DodecahedronGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.DodecahedronGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['DodecahedronGeometry'].generateGeometry = generateGeometry


        },

        DodecahedronBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new DodecahedronBufferGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.DodecahedronBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['DodecahedronBufferGeometry'].generateGeometry = generateGeometry


        },

        EdgesGeometry: function (mesh) {
            isShowGeometry = 'EdgesGeometry'
            const selects = []
            Object.keys(guis).forEach(value => selects.push(value))

            const data = {
                select: 'BoxBufferGeometry',
            };

            function generateGeometry() {
                const geometry = new BoxGeometry(data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments)
                updateGroupGeometry(mesh, geometry);
            }

            const folder = gui.addFolder('THREE.EdgesGeometry');

            folder.add(data, 'select', selects).onChange((value) => {
                console.log(value)
                isShowGeometry = 'EdgesGeometry'
                this[data.select].generateGeometry()
            });

            this[data.select].generateGeometry()
            this['EdgesGeometry'].generateGeometry = generateGeometry
        },

        IcosahedronGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new IcosahedronGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.IcosahedronGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['IcosahedronGeometry'].generateGeometry = generateGeometry


        },

        IcosahedronBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new IcosahedronBufferGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.IcosahedronBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['IcosahedronBufferGeometry'].generateGeometry = generateGeometry


        },

        LatheBufferGeometry: function (mesh) {

            const points = [];

            for (let i = 0; i < 10; i++) {

                points.push(new Vector2(Math.sin(i * 0.2) * 10 + 5, (i - 5) * 2));

            }

            const data = {
                segments: 12,
                phiStart: 0,
                phiLength: twoPi
            };

            function generateGeometry() {

                const geometry = new LatheBufferGeometry(
                    points, data.segments, data.phiStart, data.phiLength
                );

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.LatheBufferGeometry');

            folder.add(data, 'segments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'phiStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'phiLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['LatheBufferGeometry'].generateGeometry = generateGeometry


        },

        LatheGeometry: function (mesh) {

            const points = [];

            for (let i = 0; i < 10; i++) {

                points.push(new Vector2(Math.sin(i * 0.2) * 10 + 5, (i - 5) * 2));

            }

            const data = {
                segments: 12,
                phiStart: 0,
                phiLength: twoPi
            };

            function generateGeometry() {

                const geometry = new LatheGeometry(
                    points, data.segments, data.phiStart, data.phiLength
                );

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.LatheGeometry');

            folder.add(data, 'segments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'phiStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'phiLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['LatheGeometry'].generateGeometry = generateGeometry


        },

        OctahedronGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new OctahedronGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.OctahedronGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['OctahedronGeometry'].generateGeometry = generateGeometry


        },

        OctahedronBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new OctahedronBufferGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.OctahedronBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['OctahedronBufferGeometry'].generateGeometry = generateGeometry


        },

        PlaneBufferGeometry: function (mesh) {

            const data = {
                width: 10,
                height: 10,
                widthSegments: 1,
                heightSegments: 1
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new PlaneBufferGeometry(
                        data.width, data.height, data.widthSegments, data.heightSegments
                    )
                );

            }

            const folder = gui.addFolder('THREE.PlaneBufferGeometry');

            folder.add(data, 'width', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 30).step(1).onChange(generateGeometry);

            generateGeometry();
            this['PlaneBufferGeometry'].generateGeometry = generateGeometry


        },

        PlaneGeometry: function (mesh) {

            const data = {
                width: 10,
                height: 10,
                widthSegments: 1,
                heightSegments: 1
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new PlaneGeometry(
                        data.width, data.height, data.widthSegments, data.heightSegments
                    )
                );

            }

            const folder = gui.addFolder('THREE.PlaneGeometry');

            folder.add(data, 'width', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 1, 30).step(1).onChange(generateGeometry);

            generateGeometry();
            this['PlaneGeometry'].generateGeometry = generateGeometry


        },

        RingBufferGeometry: function (mesh) {

            const data = {
                innerRadius: 5,
                outerRadius: 10,
                thetaSegments: 8,
                phiSegments: 8,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new RingBufferGeometry(
                        data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.RingBufferGeometry');

            folder.add(data, 'innerRadius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'outerRadius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'thetaSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'phiSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['RingBufferGeometry'].generateGeometry = generateGeometry


        },

        RingGeometry: function (mesh) {

            const data = {
                innerRadius: 5,
                outerRadius: 10,
                thetaSegments: 8,
                phiSegments: 8,
                thetaStart: 0,
                thetaLength: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new RingGeometry(
                        data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.RingGeometry');

            folder.add(data, 'innerRadius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'outerRadius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'thetaSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'phiSegments', 1, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['RingGeometry'].generateGeometry = generateGeometry


        },

        SphereBufferGeometry: function (mesh) {

            const data = {
                radius: 15,
                widthSegments: 8,
                heightSegments: 6,
                phiStart: 0,
                phiLength: twoPi,
                thetaStart: 0,
                thetaLength: Math.PI
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new SphereBufferGeometry(
                        data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.SphereBufferGeometry');

            folder.add(data, 'radius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 3, 32).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 2, 32).step(1).onChange(generateGeometry);
            folder.add(data, 'phiStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'phiLength', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['SphereBufferGeometry'].generateGeometry = generateGeometry


        },

        SphereGeometry: function (mesh) {

            const data = {
                radius: 15,
                widthSegments: 8,
                heightSegments: 6,
                phiStart: 0,
                phiLength: twoPi,
                thetaStart: 0,
                thetaLength: Math.PI
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new SphereGeometry(
                        data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength
                    )
                );

            }

            const folder = gui.addFolder('THREE.SphereGeometry');

            folder.add(data, 'radius', 1, 30).onChange(generateGeometry);
            folder.add(data, 'widthSegments', 3, 32).step(1).onChange(generateGeometry);
            folder.add(data, 'heightSegments', 2, 32).step(1).onChange(generateGeometry);
            folder.add(data, 'phiStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'phiLength', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaStart', 0, twoPi).onChange(generateGeometry);
            folder.add(data, 'thetaLength', 0, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['SphereGeometry'].generateGeometry = generateGeometry


        },

        TetrahedronGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TetrahedronGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.TetrahedronGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TetrahedronGeometry'].generateGeometry = generateGeometry


        },

        TetrahedronBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                detail: 0
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TetrahedronBufferGeometry(
                        data.radius, data.detail
                    )
                );

            }

            const folder = gui.addFolder('THREE.TetrahedronBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'detail', 0, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TetrahedronBufferGeometry'].generateGeometry = generateGeometry


        },

        TextGeometry: function (mesh) {

            const data = {
                text: "TextGeometry",
                size: 5,
                height: 2,
                curveSegments: 12,
                font: "helvetiker",
                weight: "regular",
                bevelEnabled: false,
                bevelThickness: 1,
                bevelSize: 0.5,
                bevelOffset: 0.0,
                bevelSegments: 3
            };

            const fonts = [
                "helvetiker",
                "optimer",
                "gentilis",
                "droid/droid_serif"
            ];

            const weights = [
                "regular", "bold"
            ];

            function generateGeometry() {

                const loader = new FontLoader();
                loader.load('../../../three.js-r115/examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function (font) {

                    const geometry = new TextGeometry(data.text, {
                        font: font,
                        size: data.size,
                        height: data.height,
                        curveSegments: data.curveSegments,
                        bevelEnabled: data.bevelEnabled,
                        bevelThickness: data.bevelThickness,
                        bevelSize: data.bevelSize,
                        bevelOffset: data.bevelOffset,
                        bevelSegments: data.bevelSegments
                    });
                    geometry.center();

                    updateGroupGeometry(mesh, geometry);

                });

            }

            //Hide the wireframe
            mesh.children[0].visible = true;

            const folder = gui.addFolder('THREE.TextGeometry');

            folder.add(data, 'text').onChange(generateGeometry);
            folder.add(data, 'size', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 20).onChange(generateGeometry);
            folder.add(data, 'curveSegments', 1, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'font', fonts).onChange(generateGeometry);
            folder.add(data, 'weight', weights).onChange(generateGeometry);
            folder.add(data, 'bevelEnabled').onChange(generateGeometry);
            folder.add(data, 'bevelThickness', 0.1, 3).onChange(generateGeometry);
            folder.add(data, 'bevelSize', 0, 3).onChange(generateGeometry);
            folder.add(data, 'bevelOffset', -0.5, 1.5).onChange(generateGeometry);
            folder.add(data, 'bevelSegments', 0, 8).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TextGeometry'].generateGeometry = generateGeometry


        },

        TextBufferGeometry: function (mesh) {

            const data = {
                text: "TextBufferGeometry",
                size: 5,
                height: 2,
                curveSegments: 12,
                font: "helvetiker",
                weight: "regular",
                bevelEnabled: false,
                bevelThickness: 1,
                bevelSize: 0.5,
                bevelOffset: 0.0,
                bevelSegments: 3
            };

            const fonts = [
                "helvetiker",
                "optimer",
                "gentilis",
                "droid/droid_serif"
            ];

            const weights = [
                "regular", "bold"
            ];

            function generateGeometry() {

                const loader = new FontLoader();
                loader.load('../../../three.js-r115/examples/fonts/' + data.font + '_' + data.weight + '.typeface.json', function (font) {

                    const geometry = new TextBufferGeometry(data.text, {
                        font: font,
                        size: data.size,
                        height: data.height,
                        curveSegments: data.curveSegments,
                        bevelEnabled: data.bevelEnabled,
                        bevelThickness: data.bevelThickness,
                        bevelSize: data.bevelSize,
                        bevelOffset: data.bevelOffset,
                        bevelSegments: data.bevelSegments
                    });
                    geometry.center();

                    updateGroupGeometry(mesh, geometry);

                });

            }

            //Hide the wireframe
            mesh.children[0].visible = true;

            const folder = gui.addFolder('THREE.TextBufferGeometry');

            folder.add(data, 'text').onChange(generateGeometry);
            folder.add(data, 'size', 1, 30).onChange(generateGeometry);
            folder.add(data, 'height', 1, 20).onChange(generateGeometry);
            folder.add(data, 'curveSegments', 1, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'font', fonts).onChange(generateGeometry);
            folder.add(data, 'weight', weights).onChange(generateGeometry);
            folder.add(data, 'bevelEnabled').onChange(generateGeometry);
            folder.add(data, 'bevelThickness', 0.1, 3).onChange(generateGeometry);
            folder.add(data, 'bevelSize', 0, 3).onChange(generateGeometry);
            folder.add(data, 'bevelOffset', -0.5, 1.5).onChange(generateGeometry);
            folder.add(data, 'bevelSegments', 0, 8).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TextBufferGeometry'].generateGeometry = generateGeometry


        },

        TorusBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                tube: 3,
                radialSegments: 16,
                tubularSegments: 100,
                arc: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TorusBufferGeometry(
                        data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
                    )
                );

            }

            const folder = gui.addFolder('THREE.TorusBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'tube', 0.1, 10).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 2, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'tubularSegments', 3, 200).step(1).onChange(generateGeometry);
            folder.add(data, 'arc', 0.1, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['TorusBufferGeometry'].generateGeometry = generateGeometry


        },

        TorusGeometry: function (mesh) {

            const data = {
                radius: 10,
                tube: 3,
                radialSegments: 16,
                tubularSegments: 100,
                arc: twoPi
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TorusGeometry(
                        data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc
                    )
                );

            }

            const folder = gui.addFolder('THREE.TorusGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'tube', 0.1, 10).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 2, 30).step(1).onChange(generateGeometry);
            folder.add(data, 'tubularSegments', 3, 200).step(1).onChange(generateGeometry);
            folder.add(data, 'arc', 0.1, twoPi).onChange(generateGeometry);

            generateGeometry();
            this['TorusGeometry'].generateGeometry = generateGeometry


        },

        TorusKnotBufferGeometry: function (mesh) {

            const data = {
                radius: 10,
                tube: 3,
                tubularSegments: 64,
                radialSegments: 8,
                p: 2,
                q: 3
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TorusKnotBufferGeometry(
                        data.radius, data.tube, data.tubularSegments, data.radialSegments,
                        data.p, data.q
                    )
                );

            }

            const folder = gui.addFolder('THREE.TorusKnotBufferGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'tube', 0.1, 10).onChange(generateGeometry);
            folder.add(data, 'tubularSegments', 3, 300).step(1).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'p', 1, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'q', 1, 20).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TorusKnotBufferGeometry'].generateGeometry = generateGeometry


        },

        TorusKnotGeometry: function (mesh) {

            const data = {
                radius: 10,
                tube: 3,
                tubularSegments: 64,
                radialSegments: 8,
                p: 2,
                q: 3
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TorusKnotGeometry(
                        data.radius, data.tube, data.tubularSegments, data.radialSegments,
                        data.p, data.q
                    )
                );

            }

            const folder = gui.addFolder('THREE.TorusKnotGeometry');

            folder.add(data, 'radius', 1, 20).onChange(generateGeometry);
            folder.add(data, 'tube', 0.1, 10).onChange(generateGeometry);
            folder.add(data, 'tubularSegments', 3, 300).step(1).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 3, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'p', 1, 20).step(1).onChange(generateGeometry);
            folder.add(data, 'q', 1, 20).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TorusKnotGeometry'].generateGeometry = generateGeometry


        },

        ParametricBufferGeometry: function (mesh) {

            const data = {
                slices: 25,
                stacks: 25
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new ParametricBufferGeometry(ParametricGeometries.klein, data.slices, data.stacks)
                );

            }

            const folder = gui.addFolder('THREE.ParametricBufferGeometry');

            folder.add(data, 'slices', 1, 100).step(1).onChange(generateGeometry);
            folder.add(data, 'stacks', 1, 100).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ParametricBufferGeometry'].generateGeometry = generateGeometry

        },

        ParametricGeometry: function (mesh) {

            const data = {
                slices: 25,
                stacks: 25
            };

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new ParametricGeometry(ParametricGeometries.klein, data.slices, data.stacks)
                );

            }

            const folder = gui.addFolder('THREE.ParametricGeometry');

            folder.add(data, 'slices', 1, 100).step(1).onChange(generateGeometry);
            folder.add(data, 'stacks', 1, 100).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ParametricGeometry'].generateGeometry = generateGeometry

        },

        TubeGeometry: function (mesh) {

            const data = {
                segments: 20,
                radius: 2,
                radialSegments: 8
            };

            const path = new CustomSinCurve(10);

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TubeGeometry(path, data.segments, data.radius, data.radialSegments, false)
                );

            }

            const folder = gui.addFolder('THREE.TubeGeometry');

            folder.add(data, 'segments', 1, 100).step(1).onChange(generateGeometry);
            folder.add(data, 'radius', 1, 10).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 1, 20).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TubeGeometry'].generateGeometry = generateGeometry

        },

        TubeBufferGeometry: function (mesh) {

            const data = {
                segments: 20,
                radius: 2,
                radialSegments: 8
            };

            const path = new CustomSinCurve(10);

            function generateGeometry() {

                updateGroupGeometry(mesh,
                    new TubeBufferGeometry(path, data.segments, data.radius, data.radialSegments, false)
                );

            }

            const folder = gui.addFolder('THREE.TubeBufferGeometry');

            folder.add(data, 'segments', 1, 100).step(1).onChange(generateGeometry);
            folder.add(data, 'radius', 1, 10).onChange(generateGeometry);
            folder.add(data, 'radialSegments', 1, 20).step(1).onChange(generateGeometry);

            generateGeometry();
            this['TubeBufferGeometry'].generateGeometry = generateGeometry

        },

        ShapeGeometry: function (mesh) {

            const data = {
                segments: 12
            };

            function generateGeometry() {

                const geometry = new ShapeGeometry(heartShape, data.segments);
                geometry.center();

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.ShapeGeometry');
            folder.add(data, 'segments', 1, 100).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ShapeGeometry'].generateGeometry = generateGeometry

        },

        ShapeBufferGeometry: function (mesh) {

            const data = {
                segments: 12
            };

            function generateGeometry() {

                const geometry = new ShapeBufferGeometry(heartShape, data.segments);
                geometry.center();

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.ShapeBufferGeometry');
            folder.add(data, 'segments', 1, 100).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ShapeBufferGeometry'].generateGeometry = generateGeometry

        },

        ExtrudeGeometry: function (mesh) {

            const data = {
                steps: 2,
                depth: 16,
                bevelEnabled: true,
                bevelThickness: 1,
                bevelSize: 1,
                bevelOffset: 0,
                bevelSegments: 1
            };

            const length = 12, width = 8;

            const shape = new Shape();
            shape.moveTo(0, 0);
            shape.lineTo(0, width);
            shape.lineTo(length, width);
            shape.lineTo(length, 0);
            shape.lineTo(0, 0);

            function generateGeometry() {

                const geometry = new ExtrudeGeometry(shape, data);
                geometry.center();

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.ExtrudeGeometry');

            folder.add(data, 'steps', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'depth', 1, 20).onChange(generateGeometry);
            folder.add(data, 'bevelThickness', 1, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelSize', 0, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelOffset', -4, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelSegments', 1, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ExtrudeGeometry'].generateGeometry = generateGeometry

        },

        ExtrudeBufferGeometry: function (mesh) {

            const data = {
                steps: 2,
                depth: 16,
                bevelEnabled: true,
                bevelThickness: 1,
                bevelSize: 1,
                bevelOffset: 0,
                bevelSegments: 1
            };

            const length = 12, width = 8;

            const shape = new Shape();
            shape.moveTo(0, 0);
            shape.lineTo(0, width);
            shape.lineTo(length, width);
            shape.lineTo(length, 0);
            shape.lineTo(0, 0);

            function generateGeometry() {

                const geometry = new ExtrudeBufferGeometry(shape, data);
                geometry.center();

                updateGroupGeometry(mesh, geometry);

            }

            const folder = gui.addFolder('THREE.ExtrudeBufferGeometry');

            folder.add(data, 'steps', 1, 10).step(1).onChange(generateGeometry);
            folder.add(data, 'depth', 1, 20).onChange(generateGeometry);
            folder.add(data, 'bevelThickness', 1, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelSize', 0, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelOffset', -4, 5).step(1).onChange(generateGeometry);
            folder.add(data, 'bevelSegments', 1, 5).step(1).onChange(generateGeometry);

            generateGeometry();
            this['ExtrudeBufferGeometry'].generateGeometry = generateGeometry

        },

        WireframeGeometry: function (mesh) {
            isShowGeometry = 'WireframeGeometry'
            const selects = []
            Object.keys(guis).forEach(value => selects.push(value))

            const data = {
                select: 'BoxBufferGeometry',
            };

            function generateGeometry() {
                const geometry = new BoxGeometry(data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments)
                updateGroupGeometry(mesh, geometry);
            }

            const folder = gui.addFolder('THREE.WireframeGeometry');

            folder.add(data, 'select', selects).onChange((value) => {
                console.log(value)
                isShowGeometry = 'WireframeGeometry'
                this[data.select].generateGeometry()
            });

            this[data.select].generateGeometry()
            this['WireframeGeometry'].generateGeometry = generateGeometry
        }

    };

    function chooseFromHash(mesh) {
        let selectedGeometry = "BoxGeometry";
        Object.keys(guis).forEach((value) => {
            if (guis[value] !== undefined) {
                if (selectedGeometry !== value) guis[value](mesh);
            }
        })
        setTimeout(() => guis[selectedGeometry](mesh))
    }

    const gui = new GUI();

    const scene = new Scene();
    scene.background = new Color(0x444444);

    const camera = new PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 50);
    camera.position.z = 30;

    const canvas = document.getElementById('canvas');
    const renderer = new WebGLRenderer({canvas, antialias: true});
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);

    const orbit = new OrbitControls(camera, canvas);
    orbit.enableZoom = false;

    const lights = [];
    lights[0] = new PointLight(0xffffff, 1, 0);
    lights[1] = new PointLight(0xffffff, 1, 0);
    lights[2] = new PointLight(0xffffff, 1, 0);

    lights[0].position.set(0, 200, 0);
    lights[1].position.set(100, 200, 100);
    lights[2].position.set(-100, -200, -100);

    scene.add(lights[0]);
    scene.add(lights[1]);
    scene.add(lights[2]);

    const group = new Group();

    let geometry = new BufferGeometry();
    geometry.setAttribute('position', new Float32BufferAttribute([], 3));

    const lineMaterial = new LineBasicMaterial({color: 0xffffff, transparent: true, opacity: 0.8});
    const meshMaterial = new MeshPhongMaterial({color: 0x156289, emissive: 0x072534, side: DoubleSide, flatShading: true});
    group.add(new LineSegments(geometry, lineMaterial));
    group.add(new Mesh(geometry, meshMaterial));

    chooseFromHash(group);

    scene.add(group);

    function render() {
        requestAnimationFrame(render);
        group.rotation.x += 0.005;
        group.rotation.y += 0.005;
        renderer.render(scene, camera);
    }

    window.addEventListener('resize', function () {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);

    }, false);

    render();

</script>
</body>
</html>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淋雨一直走~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值