马黑黑 发表于 2025-5-20 12:28

three.js几何体之形状缓冲几何体

<p>形状缓冲几何体 ShapeGeometry 用来从一个或多个路径形状中创建一个单面多边形几何体。构造器:</p>
<blockquote>ShapeGeometry(shapes : Array, curveSegments : Integer)</blockquote>
<p> 其中:</p>
<blockquote>
        shapes — 一个单独的 shape 形状,或者一个包含形状的 Array 数组。缺省时默认是一个三角形<br>
        curveSegments - Integer - 每一个形状的分段数,默认值为12
</blockquote>
<p>在如下代码中,先使用 moveTo 和 lineTo 绘制一个三角形形状,接着将形状作为形状缓冲几何体的参数创建几何体,再使用基础材质和几何体构建三角形图像。示例还加入了辅助线,以方便观察最终效果:</p>
<div id="hEdiv"><pre id="hEpre">
&lt;div style="position: absolute; color: #eee; margin: 10px;"&gt;点击页面可暂停/继续动画&lt;/div&gt;
&lt;script type="module"&gt;
        import * as THREE from 'https://638183.freep.cn/638183/web/ku/three.module.min.js';

        const scene = new THREE.Scene;
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        const renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        camera.position.set(0.1, 0.1, 5); // 相机位置(xy方向的设置是为了能看清所有辅助线)

        // 辅助线(右手坐标系)
        const axesHelper = new THREE.AxesHelper(10);
        scene.add(axesHelper);

        // 按上、左、右角顺序画个三角形
        const x = 0, y = 0; // 以圆心 (0, 0) 为起点
        const shape = new THREE.Shape(); // 实例化 THREE 形状
        shape.moveTo(x, y + 1); // 画笔移至三角形的顶点
        shape.lineTo(x - 1, y - 1); // 从顶点画直线到左下
        shape.lineTo(x + 1, y - 1); // 从左下画直线到右下(剩下一条线会自闭合)

        const geometry = new THREE.ShapeGeometry(shape); // 实例化形状缓冲几何体 :参数缺省时默认是一个三角形
        // 使用基础材质
        const material = new THREE.MeshBasicMaterial({
                side: THREE.DoubleSide, // 双面渲染
                transparent: true, // 开启透明
                opacity: 0.5, // 透明度
        });
        const mesh = new THREE.Mesh(geometry, material); // 构建三角形
        scene.add(mesh); // 三角形图像加入场景

        const clock = new THREE.Clock();

        const animate = () => {
                requestAnimationFrame(animate);
                const delta = clock.getDelta();
                mesh.rotation.y -= delta / 2;
                renderer.render(scene, camera);
        };

        window.onresize = () => {
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize(window.innerWidth, window.innerHeight); // 动画运行时变个颜色
        }

        document.onclick = () => {
                clock.running ? clock.stop() : clock.start();
                if (clock.running) mesh.material.color.set(Math.random() * 0xFFFFFF);
        }

        animate();
&lt;/script&gt;
</pre></div>
<blockquote><button id="btnPrev" name="btnPrev" type="button" value="prev">运行代码</button></blockquote>

<script type="module">
        import hlight from 'https://638183.freep.cn/638183/web/helight/helight1.js';
        hlight.hl(hEdiv, hEpre);

        btnPrev.onclick = () => {
                const value = hEpre.textContent + '<style>body {margin: 0; }</style>';
                const previewWindow = window.open('', 'preview1', 'width=1200,height=768,top=100,left=100');
                previewWindow.document.open();
                previewWindow.document.write(value);
                setTimeout(function() { previewWindow.document.title = "预览" }, 100);
                previewWindow.document.close();
        };
</script>

红影 发表于 2025-5-20 20:11

这个有意思,点击暂停后,继续运行会变色{:4_187:}

红影 发表于 2025-5-20 20:18

这个无论怎么画,最后一条线都会自动闭合的吧。

马黑黑 发表于 2025-5-20 21:50

红影 发表于 2025-5-20 20:18
这个无论怎么画,最后一条线都会自动闭合的吧。

原理和之前学到的一样

马黑黑 发表于 2025-5-20 21:51

红影 发表于 2025-5-20 20:11
这个有意思,点击暂停后,继续运行会变色

变色是简单的

花飞飞 发表于 2025-5-20 21:58

这个扯不动了,之前的圆片片是可以扯动的。。{:4_173:}

花飞飞 发表于 2025-5-20 22:00

点击变色有意思,只是这三条线在这里的作用是什么,因为太平了,所以用来辅助观察效果的吧

马黑黑 发表于 2025-5-20 22:19

花飞飞 发表于 2025-5-20 22:00
点击变色有意思,只是这三条线在这里的作用是什么,因为太平了,所以用来辅助观察效果的吧

辅助线的作用不仅酱紫,这里也是有助于了解一下 three.js 右手坐标系

红影 发表于 2025-5-20 22:45

马黑黑 发表于 2025-5-20 21:50
原理和之前学到的一样

嗯,封装的时候就已经设置好了的吧。

花飞飞 发表于 2025-5-20 22:49

马黑黑 发表于 2025-5-20 22:19
辅助线的作用不仅酱紫,这里也是有助于了解一下 three.js 右手坐标系

右手坐标系,又是新词儿。。
记下了{:4_173:}

红影 发表于 2025-5-20 22:54

马黑黑 发表于 2025-5-20 21:51
变色是简单的

还挺好看的{:4_173:}

马黑黑 发表于 2025-5-21 19:38

花飞飞 发表于 2025-5-20 22:49
右手坐标系,又是新词儿。。
记下了

就是常规坐标系

马黑黑 发表于 2025-5-21 19:39

红影 发表于 2025-5-20 22:45
嗯,封装的时候就已经设置好了的吧。

这个你得自己研究研究

花飞飞 发表于 2025-5-21 21:24

马黑黑 发表于 2025-5-21 19:38
就是常规坐标系

常规的比较好记

马黑黑 发表于 2025-5-21 21:44

花飞飞 发表于 2025-5-21 21:24
常规的比较好记

坐标系用啥,都是根据环境、需要等因素

红影 发表于 2025-5-22 00:17

马黑黑 发表于 2025-5-21 19:39
这个你得自己研究研究

那我没本事研究{:4_173:}

马黑黑 发表于 2025-5-22 13:32

红影 发表于 2025-5-22 00:17
那我没本事研究

学习学习也行

红影 发表于 2025-5-22 14:24

马黑黑 发表于 2025-5-22 13:32
学习学习也行

嗯嗯,学习一下是可以的{:4_187:}

马黑黑 发表于 2025-5-22 19:28

红影 发表于 2025-5-22 14:24
嗯嗯,学习一下是可以的

必须的

花飞飞 发表于 2025-5-22 21:03

马黑黑 发表于 2025-5-21 21:44
坐标系用啥,都是根据环境、需要等因素

环境正常,温度正常,适合种菜{:4_173:}
页: [1] 2 3 4 5
查看完整版本: three.js几何体之形状缓冲几何体