马黑PHP整站系统

ThreeJS点材质形状问题

位置: 首页 > 前端三套件[ 发布时间: 2025.6.30  作者: 马黑  阅读: 30 ]

和 SpriteMaterial 精灵材质一样,点材质THREE.PointsMaterial的形状默认也是矩形。改变点材质的形状就是给它贴个背景透明的纹理贴图,但对ThreeJS内置的几何体而言,依附其上的 map 并不能完美改变点材质的形状,试看:

<img style="position:absolute;width:200px;height:200px;z-index:10;" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" alt="" title="纹理原图" />
<script type="module">
	import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
	basic3();

	new THREE.TextureLoader().load(
		'https://638183.freep.cn/638183/web/svg/sunfl-2.svg',
		(texture) => {
			texture.colorSpace = THREE.SRGBColorSpace;
			const geometry = new THREE.SphereGeometry(); // 球体几何体
			const material = new THREE.PointsMaterial({ size: 0.15, map: texture, transparent: true }); // 点材质
			const points = new THREE.Points(geometry, material);
			scene.add(points);
			renderer.render(scene, camera);
		}, undefined, (err) => console('error:', err)
	);
</script>
	

运行代码可以看到球体不完美,球体图像中的点材质保留着矩形的形状,texture 纹理贴图以一个整体分摊给各个点,所有的点并不能完美以贴图构图。要让纹理成为每一个点的图像形状,需要对几何体进行重构,一个简单的实现思路是:创建一个缓冲几何体 BufferGeometry,它从球体几何体 SphereGeometry 那里获取所有顶点的位置(position)信息,然后,使用该缓冲几何体+点材质构建图像。具体代码如下:

<img style="position:absolute;width:200px;height:200px;z-index:10;" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" alt="" title="纹理原图" />
<script type="module">
	import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
	basic3();

	const positions = new THREE.SphereGeometry().attributes.position;

	new THREE.TextureLoader().load(
		'https://638183.freep.cn/638183/web/svg/sunfl-2.svg',
		(texture) => {
			texture.colorSpace = THREE.SRGBColorSpace;
			const geometry = new THREE.BufferGeometry(); // 球体几何体
			geometry.setAttribute('position', positions);
			const material = new THREE.PointsMaterial({ size: 0.15, map: texture, transparent: true }); // 点材质
			const points = new THREE.Points(geometry, material);
			scene.add(points);
			renderer.render(scene, camera);
		}, undefined, (err) => console('error:', err)
	);
</script>
	

这回球体图像是完整的,而且,重要的是,“绘制”球体的点材质完美贴上了纹理,纹理图片的形状就是每一个点的形状。

前一篇: ThreeJS点材质着色问题
下一篇: 理解CSS 3d transform转换

发表评论:

       

评论列表 [1条]

#1 | 飞飞 于 2025-6-30 20:04 发布: 矮油,这个是纹理图片密排成球体。。怪好看的

Copyright © 2023 All Right Reserved 马黑PHP文章管理整站系统v1.8
联系我们: gxblk@163.com