马黑黑 发表于 2025-5-17 09:01

three.js几何体之球缓冲几何体

<style>
        #btnPrev { box-shadow: 2px 2px 6px rgba(0,0,0,.5); }
        #btnPrev:hover { box-shadow: 2px 2px 12px rgba(0,0,0,.5); font-weight: bold; }
</style>

<p>球缓冲几何体 phereGeometry 一个用于生成球体的类。构造器:</p>
<blockquote>SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)</blockquote>
<p> 其中:</p>
<blockquote>
        radius — 球体半径,默认为 1<br>
        widthSegments — 水平分段数(沿着经线分段),最小值为 3,默认值为 32<br>
        heightSegments — 垂直分段数(沿着纬线分段),最小值为 2,默认值为 16<br>
        phiStart — 指定水平(经线)起始角度,默认值为 0<br>
        phiLength — 指定水平(经线)扫描角度的大小,默认值为 Math.PI * 2<br>
        thetaStart — 指定垂直(纬线)起始角度,默认值为 0<br>
        thetaLength — 指定垂直(纬线)扫描角度大小,默认值为 Math.PI<br>
</blockquote>
<p>该几何体是通过扫描并计算围绕着Y轴(水平扫描)和X轴(垂直扫描)的顶点来创建的。 因此,不完整的球体(类似球形切片)可以通过为phiStart,phiLength,thetaStart和thetaLength设置不同的值来创建, 以定义开始(或结束)计算这些顶点的起点(或终点)。</p>
<p>以下代码实现了带线框的球体绘制,实际上是嵌套了两个球体图形,一个是线框球,另一个是纯色球,代码中还加入了 three.js 的 Clock 对象用于间接控制动画的运行与暂停:</p>
<div id="hEdiv"><pre id="hEpre">
&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(45, window.innerWidth / window.innerHeight, 0.1, 1000); // 相机
        camera.position.set(0, 0, 8); // 相机位置
        const clock = new THREE.Clock(); // 时钟(用于动画)
        const renderer = new THREE.WebGLRenderer({ antialias: true }); // 渲染器
        renderer.setSize(window.innerWidth, window.innerHeight); // 渲染器范围
        document.body.appendChild(renderer.domElement); // 渲染器加入到body标签

        const geometry = new THREE.SphereGeometry(); // 二十面体几何体
        const material = new THREE.MeshBasicMaterial({ color: 0x008080, wireframe: true }); // 材质
        const ball = new THREE.Mesh(geometry, material); // 二十面体网格对象
        const frame_ball = ball.clone(); // 克隆网格对象 :用作线框
        frame_ball.material = frame_ball.material.clone(); // 克隆自己的材质以便更改参数不影响母体材质
        frame_ball.material.color.set(0x006570); // 设置颜色
        frame_ball.material.wireframe = false; // 设置线框
        ball.add(frame_ball);
        scene.add(ball); // 网格对象加入到场景
        scene.add(ball);

        // 动画函数
        const animate = () => {
                requestAnimationFrame(animate); // 请求关键帧动画递归调用函数自身
                const delta = clock.getDelta();
                ball.rotation.x += delta / 5;
                ball.rotation.y += delta / 5;
                renderer.render(scene, camera); // 渲染效果
        };

        document.onclick = () => clock.running ? clock.stop() : clock.start();

        // 窗口自适应
        window.onresize = () => {
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize(window.innerWidth, window.innerHeight);
        }

        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-17 09:02

此前发过一个画球体的帖,这里侧重对球缓冲几何体的介绍

樵歌 发表于 2025-5-17 09:55

木看到图图{:4_203:}

马黑黑 发表于 2025-5-17 10:03

樵歌 发表于 2025-5-17 09:55
木看到图图

运行代码才会看到效果。另外,有些浏览器会阻止预览窗口的弹出,这也会看不到效果

樵歌 发表于 2025-5-17 10:06

马黑黑 发表于 2025-5-17 10:03
运行代码才会看到效果。另外,有些浏览器会阻止预览窗口的弹出,这也会看不到效果

能否推荐个功能强大的浏览器吖{:4_203:}

马黑黑 发表于 2025-5-17 10:08

樵歌 发表于 2025-5-17 10:06
能否推荐个功能强大的浏览器吖

兼容性好、轻快的是百分浏览器:

https://www.centbrowser.cn/

红影 发表于 2025-5-17 10:48

有线框更能看出它的创建方式,这个又是一种动画方式呢{:4_187:}

红影 发表于 2025-5-17 10:51

马黑黑 发表于 2025-5-17 09:02
此前发过一个画球体的帖,这里侧重对球缓冲几何体的介绍

上次是简介吧,这个是专项介绍。
弄得我赶紧跑回去看前面的了{:4_173:}

红影 发表于 2025-5-17 10:57

这个是用自设的颜色,不是默认的了,也很漂亮。这个动画的设置应该能控制它的快慢了{:4_187:}

马黑黑 发表于 2025-5-17 11:00

红影 发表于 2025-5-17 10:57
这个是用自设的颜色,不是默认的了,也很漂亮。这个动画的设置应该能控制它的快慢了

快慢一直是可以控制的,运动歩幅的调整而已

马黑黑 发表于 2025-5-17 11:00

红影 发表于 2025-5-17 10:51
上次是简介吧,这个是专项介绍。
弄得我赶紧跑回去看前面的了

之前画过一个圆球的

马黑黑 发表于 2025-5-17 11:01

红影 发表于 2025-5-17 10:48
有线框更能看出它的创建方式,这个又是一种动画方式呢

线框之前用过的

梦江南 发表于 2025-5-17 14:18

黑黑老师,我下载了您给的浏览器,现在能看到运行代码中的蓝色圆球了。太感谢了!

花飞飞 发表于 2025-5-17 17:50

这个颜色和效果都漂亮,线框套纯色,曾在锥形体里出现过~~

花飞飞 发表于 2025-5-17 17:57

刚才跟了一个贴子,改大小和位置都能成功。。
但位置更改后,鼠标手形的响应区还在原地。。没整成。。。{:4_173:}

红影 发表于 2025-5-17 21:23

马黑黑 发表于 2025-5-17 11:00
快慢一直是可以控制的,运动歩幅的调整而已

我是到了这个帖子里才看出来的{:4_173:}

红影 发表于 2025-5-17 21:24

马黑黑 发表于 2025-5-17 11:00
之前画过一个圆球的

是的,这里的讲解更加详细。

红影 发表于 2025-5-17 21:24

马黑黑 发表于 2025-5-17 11:01
线框之前用过的

知道,我是说有线框看着更加清楚呢{:4_187:}

马黑黑 发表于 2025-5-17 22:22

红影 发表于 2025-5-17 21:24
知道,我是说有线框看着更加清楚呢

那是。还有一种几何体就叫做网格线几何体

马黑黑 发表于 2025-5-17 22:22

红影 发表于 2025-5-17 21:23
我是到了这个帖子里才看出来的

一直看着总会有看得懂的
页: [1] 2
查看完整版本: three.js几何体之球缓冲几何体