Threejs物联网,养殖场3D可视化(一)

1,介绍

该示例使用的是 r95版本Three.js库。

主要实现功能:引用养殖场模型进行展示。效果图如下:

 

2,主要说明 

养殖场3D展示主要使用OBJLoader和MTLLoader加载模型并直接赋予材质进行展示。

 引入模型代码如下:

  3,源码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Threejs物联网,养殖场3D可视化</title>
		<meta charset="utf-8">
		<script type="text/javascript" src="libs/three.js"></script>
		<script type="text/javascript" src="libs/OrbitControls.js"></script>

		<script type="text/javascript" src="libs/OBJLoader.js"></script>
		<script type="text/javascript" src="libs/MTLLoader.js"></script>
		<style>
			body {
				margin: 0;
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<div id="dom"></div>
		<script type="text/javascript">
			var camera;
			var renderer;
			var mesh;

			function init() {
				// 创建一个场景,它将包含我们所有的元素,如物体,相机和灯光。
				var scene = new THREE.Scene();

				var urls = [
					'assets/textures/posx.jpg',
					'assets/textures/negx.jpg',
					'assets/textures/posy.jpg',
					'assets/textures/negy.jpg',
					'assets/textures/posz.jpg',
					'assets/textures/negz.jpg'
				];

				var cubeLoader = new THREE.CubeTextureLoader();
				scene.background = cubeLoader.load(urls);

				// 创建一个摄像机,它定义了我们正在看的地方
				camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 30000);
				// 将摄像机对准场景的中心
				camera.position.x = 5500;
				camera.position.y = 3000;
				camera.position.z = 2000;
				camera.lookAt(scene.position);
				var orbit = new THREE.OrbitControls(camera);

				// 创建一个渲染器并设置大小,WebGLRenderer将会使用电脑显卡来渲染场景
				// initialize basic renderer
				renderer = new THREE.WebGLRenderer({
					antialias: true,
					logarithmicDepthBuffer: true,
				});
				renderer.setSize(window.innerWidth, window.innerHeight);

				// 添加环境光
				scene.add(new THREE.AmbientLight("#ffffff", 1.5));
				// 将呈现器的输出添加到HTML元素
				document.getElementById("dom").appendChild(renderer.domElement);

				// 在屏幕上显示坐标轴
				var axes = new THREE.AxesHelper(10000);
				// scene.add(axes);

				initModel();

				// 启动动画
				renderScene();

				// 添加模型
				function initModel() {
					var mtlLoader = new THREE.MTLLoader();
					mtlLoader.setPath("assets/models/obj_mtl/")
					mtlLoader.load('yangzhichang.mtl', function(materials) {
						materials.preload();

						var objLoader = new THREE.OBJLoader();
						objLoader.setMaterials(materials);
						objLoader.load('assets/models/obj_mtl/yangzhichang.obj', function(object) {
							mesh = object;
							object.traverse(function(node) {
								if (node.material) {
									node.material.side = THREE.DoubleSide;
								}
							});
							scene.add(mesh);
						});
					});
				}
				
				document.addEventListener('click', onDocumentMouseDown, false);
				
				function onDocumentMouseDown(event) {
					// 点击屏幕创建一个向量
					var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window
						.innerHeight) * 2 + 1, 0.5);
					vector = vector.unproject(camera); // 将屏幕的坐标转换成三维场景中的坐标
					var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
					var intersects = raycaster.intersectObjects(mesh, true);
					if (intersects.length > 0) {
						var name = intersects[0].object.name;
						var obj = scene.getObjectByName(name);
						console.log(obj)
						scene.remove(obj);
					}
				}

				function renderScene() {
					orbit.update();
					requestAnimationFrame(renderScene);
					renderer.render(scene, camera);
				}

				// 渲染的场景
				renderer.render(scene, camera);
			}
			window.onload = init;

			function onResize() {
				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();
				renderer.setSize(window.innerWidth, window.innerHeight);
			}
			// 监听调整大小事件
			window.addEventListener('resize', onResize, false);
		</script>
	</body>
</html>

 4,下载

使用threejs渲染养殖场模型源码,养殖场模型obj+mtl格式,threejs模型Threejs渲染obj+mtl模型,Threejs加载3D工厂模型Threejs实现引入工厂模型更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/baidu_29701003/54823032

5,源码和模型

需要完整代码、模型或者其他源码,请进入博客首页查看其他文章或者留言

联系我微信:1171053128

### Three.js 数字孪生实现方法与示例 #### 使用 HTML 和 Three.js 构建基础框架 构建数字孪生三维场景的基础在于设置合适的开发环境。HTML 文件作为入口文件,通过引入 Three.js 库来创建渲染器、场景以及摄像机等基本组件[^1]。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Three.js Digital Twin</title> <style> body { margin: 0; } canvas { display: block; } </style> </head> <body> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> <script type="module"> // JavaScript code here... </script> </body> </html> ``` #### 加载复杂模型并处理异步问题 当涉及到较为复杂的对象加载时,如 `.obj` 或者 `.fbx` 模型,可以利用 `MTLLoader` 及 `FBXLoader` 来完成资源导入工作。考虑到不同类型的资产可能具有不同的加载时间,建议采用计数机制确保所有必要的部件都已成功加载后再执行下步操作[^3]。 ```javascript import * as THREE from 'three'; import { FBXLoader } from './jsm/loaders/FBXLoader.js'; let scene, camera, renderer; const count = {}; // 记录加载状态的对象 init(); animate(); function init() { // 初始化场景、相机和渲染器... const loader = new FBXLoader(); ['model1', 'model2'].forEach(name => { loader.load(`models/${name}.fbx`, (object) => { scene.add(object); count[name] = true; if (Object.keys(count).length === 2) onAllModelsLoaded(); }); }); } function onAllModelsLoaded(){ console.log('所有模型均已加载完毕'); } ``` #### 利用真实世界的数据增强虚拟表示 为了使模拟更加贴近现实情况,在某些情况下会借助公开可用的真实地理信息数据集来进行细节上的补充和完善。例如,使用来自 NASA 的 SLDEM2015 数据可以在 Three.js 中重现逼真的月球表面特征[^2]。 ```javascript fetch('/path/to/sldem2015.json') .then(response => response.json()) .then(data => { // 处理获取到的高度图或其他属性... }); ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左本Web3D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值