three.js几何体之管道缓冲几何体
<p>管道缓冲几何体(TubeGeometry)用于创建一个沿着三维曲线延伸的管道。构造器:</p><blockquote>TubeGeometry(path : Curve, tubularSegments : Integer, radius : Float, radialSegments : Integer, closed : Boolean)</blockquote>
<p> 其中:</p>
<blockquote>
path — Curve - 一个由基类Curve继承而来的3D路径。缺省时默认为二次贝塞尔路径<br>
tubularSegments — 整数值,组成这一管道的分段数,默认值为 64<br>
radius — 浮点数值,管道的半径,默认值为 1<br>
radialSegments — 整数值,管道横截面的分段数目,默认值为 8<br>
closed — 布尔值,管道的两端是否闭合,默认值为false
</blockquote>
<p>如下代码,演示了如何定义二次贝塞尔曲线路径并用于创建管道几何体 TubeGeometry,所构建的曲线路径是参数缺省时 three.js 使用的默认值,管道分段数、管道半径、管道横截面分段数等均使用默认值,TubeGeometry() 参数实际上可以留空。运行代码将看到一个线框立体管道:</p>
<div id="hEdiv"><pre id="hEpre">
<div style="position: absolute; color: #eee; margin: 10px;">点击页面可暂停/继续动画</div>
<script type="module">
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);
camera.position.set(0, 0, 5);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 创建二次贝塞尔路径(路径其实是默认的,这里只是为了演示)
const path = new THREE.QuadraticBezierCurve3(
new THREE.Vector3(-1, -1, 0),
new THREE.Vector3(-1, 1, 0),
new THREE.Vector3(1, 1, 0)
);
const geometry = new THREE.TubeGeometry(path, 64, 1, 8, false); // 参数都是默认值,可以空
const material = new THREE.MeshBasicMaterial({ wireframe: true, color: 'tan' }); // 线框化基础材质
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 / 5;
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();
animate();
</script>
</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> 黑黑老师早上好!
这是平面一点点旋转成管道,这个旋转过程太漂亮了!金黄色的细线组成的旋转管道太不可思议了!{:4_187:} 这个管道好形象,3D模拟真实模型 ,无限接近生活实际。。。
{:4_173:} 任意点击页面一处动态可暂停,把按纽优化了。。 如果把管道横截面的分段数目取更多点,就更接近于圆形管道了{:4_204:} 还好黑黑把默认的path写出来了,否则都不知道默认是这样的数值。
在纸上画了一下这三个点,控制点在起始点和结束点当中,是个标准圆弧,控制点移动一下就不一样了,会更复杂。还好这三个点的Z都是0,在同一平面上,否则更不可想象。 radius — 浮点数值,管道的半径,默认值为 1
这个没看懂,如果公式内置了,不是有三个点就能决定这条曲线了,为什么还有个半径? 这些线框也有意思,暂停后忽然就感觉它是逆向旋转了,可怕的视觉误差。 红影 发表于 2025-5-20 09:50
这些线框也有意思,暂停后忽然就感觉它是逆向旋转了,可怕的视觉误差。
视觉错误 马黑黑 发表于 2025-5-20 12:41
视觉错误
是的,这样的视觉错误会经常发生。 红影 发表于 2025-5-20 22:20
是的,这样的视觉错误会经常发生。
嗯嗯,再正常不过 马黑黑 发表于 2025-5-23 18:24
嗯嗯,再正常不过
那转向变来变去的,也有趣呢{:4_173:} 红影 发表于 2025-5-23 23:27
那转向变来变去的,也有趣呢
还行 马黑黑 发表于 2025-5-23 23:53
还行
视觉错觉的妙用{:4_173:} 红影 发表于 2025-5-24 10:49
视觉错觉的妙用
大概吧我也不清楚 马黑黑 发表于 2025-5-24 13:15
大概吧我也不清楚
反正看着挺奇妙的。 红影 发表于 2025-5-24 22:57
反正看着挺奇妙的。
也许吧 马黑黑 发表于 2025-5-25 18:25
也许吧
three.js几何体都很强大。 红影 发表于 2025-5-25 22:32
three.js几何体都很强大。
它就是有个问题:更新太快,新版本不太稳定。比如光源,聚光灯还是哪个的,强度小了没作用,要设置为很大才行 马黑黑 发表于 2025-5-26 12:46
它就是有个问题:更新太快,新版本不太稳定。比如光源,聚光灯还是哪个的,强度小了没作用,要设置为很大 ...
更新也是为了更好使用呢,虽然会带来问题,相信很快会解决。