THREEJS实现标签,自定义样式显示标签,在场景图上动态标识一些文字方法一(css2d_label)

方法:css2d_label
特点:显示的标签大小固定,不会随窗口的大小而变化。
注意:

1.引入CSS2DRenderer.js
2.添加渲染器CSS2DRenderer
3.进行渲染CSS2DRenderer

在这里插入图片描述

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
	<title>three.js css2d - label</title>
	<style>
		body {
			background-color: #000;
			margin: 0;
			overflow: hidden;
		}

		#info {
			position: absolute;
			top: 0px;
			width: 100%;
			color: #FFF;
			padding: 5px;
			font-family: Monospace;
			font-size: 13px;
			text-align: center;
			z-index: 1;
		}

		.label {
			color: #FFF;
			font-family: sans-serif;
			padding: 2px;
			background: rgba(0, 0, 0, .6);
		}

		a {
			color: #000000;
		}
	</style>
</head>

<body>
	<div id="info"><a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - three.js css2d - label</div>

	<script src="../js/three.js"></script>

	<script src="../js/OrbitControls.js"></script>

	<script src="../js/CSS2DRenderer.js"></script>

	<script src="../js/stats.js"></script>

	<script>

		var camera, scene, renderer, labelRenderer;

		var clock = new THREE.Clock();
		var textureLoader = new THREE.TextureLoader();

		var earth, moon;
		var diqiu = 12
		var yueliang = 11

		// init();
		// animate();

		start()


		// 渲染器
		function initThree() {
			renderer = new THREE.WebGLRenderer({
				antialias: true
			});
			renderer.setPixelRatio(window.devicePixelRatio);
			renderer.setSize(window.innerWidth, window.innerHeight);
			renderer.setClearColor(0x000000, 1.0);
			document.body.appendChild(renderer.domElement);

			labelRenderer = new THREE.CSS2DRenderer();
			labelRenderer.setSize(window.innerWidth, window.innerHeight);
			labelRenderer.domElement.style.position = 'absolute';
			labelRenderer.domElement.style.top = 0;
			document.body.appendChild(labelRenderer.domElement);
		}

		// 场景
		function initScene() {
			scene = new THREE.Scene();
			var axesHelper = new THREE.AxesHelper(5);
			scene.add(axesHelper);
		}

		// 相机
		function initCamera() {
			camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
			camera.position.set(10, 5, 20);
		}

		// 物体
		var EARTH_RADIUS;
		var MOON_RADIUS;
		function initObject() {
			EARTH_RADIUS = 1;
			MOON_RADIUS = 0.27;

			var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 16, 16);
			var earthMaterial = new THREE.MeshPhongMaterial({
				specular: 0x333333,
				shininess: 5,
				map: textureLoader.load('../planets/earth_atmos_2048.jpg'),
				specularMap: textureLoader.load('../planets/earth_specular_2048.jpg'),
				normalMap: textureLoader.load('../planets/earth_normal_2048.jpg'),
				// map: textureLoader.load('../js/1.png'),
				// specularMap: textureLoader.load('../js/1.png'),
				// normalMap: textureLoader.load('../js/1.png'),
				normalScale: new THREE.Vector2(0.85, 0.85)
			});
			earth = new THREE.Mesh(earthGeometry, earthMaterial);
			scene.add(earth);

			var moonGeometry = new THREE.SphereBufferGeometry(MOON_RADIUS, 16, 16);
			var moonMaterial = new THREE.MeshPhongMaterial({
				shininess: 5,
				map: textureLoader.load('../planets/moon_1024.jpg')
				// map: textureLoader.load('../js/1.png')
			});
			moon = new THREE.Mesh(moonGeometry, moonMaterial);
			scene.add(moon);

			//调用标签函数
			label()
		}

		// 标签
		var earthLabel
		function label() {
			// 添加标签<div class='label'>diqiu</div>
			var earthDiv = document.createElement('div');
			earthDiv.className = 'label';
			earthDiv.textContent = diqiu;
			earthDiv.style.marginTop = '-1em';
			// var earthLabel = new THREE.CSS2DObject(earthDiv);
			earthLabel = new THREE.CSS2DObject(earthDiv);
			earthLabel.position.set(0, EARTH_RADIUS, 0);
			earth.add(earthLabel);

			var moonDiv = document.createElement('div');
			moonDiv.className = 'label';
			moonDiv.textContent = 'Moon';
			moonDiv.style.marginTop = '-1em';
			var moonLabel = new THREE.CSS2DObject(moonDiv);
			moonLabel.position.set(0, MOON_RADIUS, 0);
			moon.add(moonLabel);

		}

		// 灯光
		function initLight() {
			var dirLight = new THREE.DirectionalLight(0xffffff);
			dirLight.position.set(0, 0, 1);
			scene.add(dirLight);
		}

		// 开始渲染
		function initRender() {
			requestAnimationFrame(initRender);

			var elapsed = clock.getElapsedTime();

			moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed)*5);

			renderer.render(scene, camera);
			labelRenderer.render(scene, camera);
		}

		// 控制器
		function initControls() {
			var controls = new THREE.OrbitControls(camera);
		}

		// 性能监测
		function initStats() {
			var stats = new Stats();
			stats.domElement.style.position = 'absolute';
			stats.domElement.style.left = '0px';
			stats.domElement.style.top = '0px';
			document.body.appendChild(stats.domElement);
		}

		// 网格
		function initGrid() {
			var helper = new THREE.GridHelper(20, 14);
			// helper.setColors(0x0000ff, 0x808080);
			scene.add(helper);
		}

		// 开始
		function start() {
			initThree();
			initScene();
			initCamera();
			initObject();
			initLight();
			initControls();
			initStats();
			initGrid();
			initRender();

			// setInterval(() => {
			// 	diqiu = diqiu + 1;
			// 	earth.remove(earthLabel);
			// 	label()
			// }, 10)
		}


		function init() {
			// var EARTH_RADIUS = 1;
			// var MOON_RADIUS = 0.27;

			// camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
			// camera.position.set(10, 5, 20);

			// var controls = new THREE.OrbitControls(camera);

			// scene = new THREE.Scene();

			// var dirLight = new THREE.DirectionalLight(0xffffff);
			// dirLight.position.set(0, 0, 1);
			// scene.add(dirLight);

			// var axesHelper = new THREE.AxesHelper(5);
			// scene.add(axesHelper);

			// var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 16, 16);
			// var earthMaterial = new THREE.MeshPhongMaterial({
			// 	specular: 0x333333,
			// 	shininess: 5,
			// 	// map: textureLoader.load( 'textures/planets/earth_atmos_2048.jpg' ),
			// 	// specularMap: textureLoader.load( 'textures/planets/earth_specular_2048.jpg' ),
			// 	// normalMap: textureLoader.load( 'textures/planets/earth_normal_2048.jpg' ),
			// 	map: textureLoader.load('../js/1.png'),
			// 	specularMap: textureLoader.load('../js/1.png'),
			// 	normalMap: textureLoader.load('../js/1.png'),
			// 	normalScale: new THREE.Vector2(0.85, 0.85)
			// });
			// earth = new THREE.Mesh(earthGeometry, earthMaterial);
			// scene.add(earth);

			// var moonGeometry = new THREE.SphereBufferGeometry(MOON_RADIUS, 16, 16);
			// var moonMaterial = new THREE.MeshPhongMaterial({
			// 	shininess: 5,
			// 	// map: textureLoader.load( 'textures/planets/moon_1024.jpg' )
			// 	map: textureLoader.load('../js/1.png')
			// });
			// moon = new THREE.Mesh(moonGeometry, moonMaterial);
			// scene.add(moon);

			// var earthDiv = document.createElement('div');
			// earthDiv.className = 'label';
			// earthDiv.textContent = diqiu;
			// earthDiv.style.marginTop = '-1em';
			// var earthLabel = new THREE.CSS2DObject(earthDiv);
			// earthLabel.position.set(0, EARTH_RADIUS, 0);
			// earth.add(earthLabel);

			// var moonDiv = document.createElement('div');
			// moonDiv.className = 'label';
			// moonDiv.textContent = 'Moon';
			// moonDiv.style.marginTop = '-1em';
			// var moonLabel = new THREE.CSS2DObject(moonDiv);
			// moonLabel.position.set(0, MOON_RADIUS, 0);
			// moon.add(moonLabel);

			// //

			// renderer = new THREE.WebGLRenderer();
			// renderer.setPixelRatio(window.devicePixelRatio);
			// renderer.setSize(window.innerWidth, window.innerHeight);
			// document.body.appendChild(renderer.domElement);

			// labelRenderer = new THREE.CSS2DRenderer();
			// labelRenderer.setSize(window.innerWidth, window.innerHeight);
			// labelRenderer.domElement.style.position = 'absolute';
			// labelRenderer.domElement.style.top = 0;
			// document.body.appendChild(labelRenderer.domElement);
		}


		function animate() {
			// requestAnimationFrame(animate);
			// var elapsed = clock.getElapsedTime();
			// moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5);
			// renderer.render(scene, camera);
			// labelRenderer.render(scene, camera);
		}
	</script>
</body>

</html>
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Three.js中,我们可以使用Css2DRenderer来实现在选中模型时显示对应的文字标签Css2DRenderer允许我们在3D场景中渲染2D元素,比如文字或者标签。 以下是实现的步骤: 1. 首先,创建一个新的Css2DRenderer对象,并将其与渲染器关联起来: ```javascript const css2dRenderer = new THREE.CSS2DRenderer(); css2dRenderer.setSize(window.innerWidth, window.innerHeight); css2dRenderer.domElement.style.position = 'absolute'; css2dRenderer.domElement.style.top = 0; document.body.appendChild(css2dRenderer.domElement); ``` 2. 创建一个CSS2DObject对象来表示文字标签。可以使用HTML元素来创建这个对象。例如,使用一个div元素来创建一个包含文字标签: ```javascript const label = document.createElement('div'); label.className = 'label'; label.textContent = 'Hello, World!'; ``` 3. 创建一个CSS2DObject对象,并将其位置设置为所选模型的位置: ```javascript const cssObject = new THREE.CSS2DObject(label); cssObject.position.set(model.position.x, model.position.y, model.position.z); ``` 4. 将CSS2DObject添加到场景中,并将其渲染到屏幕上: ```javascript scene.add(cssObject); css2dRenderer.render(scene, camera); ``` 5. 最后,为选中模型添加交互事件,以便在选中模型时显示标签。可以使用Raycaster来检测鼠标与模型的交互: ```javascript const raycaster = new THREE.Raycaster(); const mouse = new THREE.Vector2(); function onMouseMove(event) { // 计算鼠标的归一化设备坐标 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; // 更新射线的位置和方向 raycaster.setFromCamera(mouse, camera); // 计算射线与模型的交互 const intersects = raycaster.intersectObjects(scene.children); if (intersects.length > 0) { // 选中模型时显示标签 const selectedModel = intersects[0].object; const cssObject = selectedModel.userData.label; cssObject.visible = true; } else { // 没有选中模型时隐藏所有标签 scene.traverse((child) => { if (child.userData.label) { child.userData.label.visible = false; } }); } // 渲染场景标签 css2dRenderer.render(scene, camera); } window.addEventListener('mousemove', onMouseMove, false); ``` 记得在CSS文件中定义.label类的样式,以控制标签的外观: ```css .label { position: absolute; background-color: rgba(0, 0, 0, 0.8); color: white; padding: 4px; } ``` 这样就可以在选中模型时显示对应的文字标签了。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值