Unity imports bim model

Recently, I was researching how to import the bim model. At the beginning, I was really confused and had no clue, but the hard work paid off, and finally found a solution. I found a total of three plug-ins, two of which were produced by unity, explaining this direction. There is still a market, so let me compare these three plug-ins:

name Unity Reflect Pixyz Tridify
import method Export from Revit with plugin and import in Unity with Revit plugin Import directly with plugins in Unity After uploading the model to the official website of Tridify, import it with a plug-in in Unity
model format IFC IFC IFC
official website https://unity.com/products/unity-reflect https://unity.com/products/pixyz https://www.tridify.com
advantage 1) The display can be modified in real time; 2) The bim basic data is detailed; 3) The data name has been translated into Chinese after importing into Unity Import model directly Convenient
shortcoming Need a cloud server, the server is unstable 1) Model color export error; 2) Unable to bake 1) After importing into Unity, the data is split into multiple scripts; 2) After importing into Unity, the data name is in English
Model fineness Mesh is merged All meshes can be operated individually Mesh is merged
model material Not editable editable editable
quotation Unity pro+reflect: 17250 yuan/year Unity pro+pixyz: 24400 yuan/year; pixyz: 7266.735 yuan/year Unity pro: 13831.2 yuan/year; 200M capacity, 50 IFC/month files: 1515 yuan/year; 1G capacity, 50 IFC/month files: 6816 yuan/year; 10G capacity, 250 IFC/month files: 30294 yuan /Year

Model link: https://download.csdn.net/download/qq_39353597/84991982
Final summary: Still Threejs fragrance:

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - IFCLoader</title>
		<meta charset="utf-8" />
		<meta
			name="viewport"
			content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"
		/>
		<link type="text/css" rel="stylesheet" href="main.css" />
	</head>

	<body>
		<div id="info">
			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a>
			-
			<a href="https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/" target="_blank" rel="noopener">IFCLoader</a>
		</div>

		<!-- Import maps polyfill -->
		<!-- Remove this when import maps will be widely supported -->
		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>

		<script type="importmap">
			{
    
    
				"imports": {
    
    
					"three": "../build/three.module.js"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three';
			import {
    
     OrbitControls } from './jsm/controls/OrbitControls.js';

			import {
    
     IFCLoader } from './jsm/loaders/IFCLoader.js';

			let scene, camera, renderer;

			init();

			function init() {
    
    

				//Scene
				scene = new THREE.Scene();
				scene.background = new THREE.Color( 0x8cc7de );

				//Camera
				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 1000 );
				camera.position.z = - 70;
				camera.position.y = 25;
				camera.position.x = 90;

				//Initial cube
				const geometry = new THREE.BoxGeometry();
				const material = new THREE.MeshPhongMaterial( {
    
     color: 0xffffff } );
				const cube = new THREE.Mesh( geometry, material );
				scene.add( cube );

				//Lights
				const directionalLight1 = new THREE.DirectionalLight( 0xffeeff, 0.8 );
				directionalLight1.position.set( 1, 1, 1 );
				scene.add( directionalLight1 );

				const directionalLight2 = new THREE.DirectionalLight( 0xffffff, 0.8 );
				directionalLight2.position.set( - 1, 0.5, - 1 );
				scene.add( directionalLight2 );

				const ambientLight = new THREE.AmbientLight( 0xffffee, 0.25 );
				scene.add( ambientLight );

				//Setup IFC Loader
				const ifcLoader = new IFCLoader();
				ifcLoader.ifcManager.setWasmPath( 'jsm/loaders/ifc/' );
				ifcLoader.load( 'models/ifc/rac_advanced_sample_project.ifc', function ( model ) {
    
    

					scene.add( model.mesh );
					render();

				} );

				const highlightMaterial = new THREE.MeshPhongMaterial( {
    
     color: 0xff00ff, depthTest: false, transparent: true, opacity: 0.3 } );

				function selectObject( event ) {
    
    

					if ( event.button != 0 ) return;

					const mouse = new THREE.Vector2();
					mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
					mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

					const raycaster = new THREE.Raycaster();
					raycaster.setFromCamera( mouse, camera );

					const intersected = raycaster.intersectObjects( scene.children, false );
					if ( intersected.length ) {
    
    

						const found = intersected[ 0 ];
						const faceIndex = found.faceIndex;
						const geometry = found.object.geometry;
						const id = ifcLoader.ifcManager.getExpressId( geometry, faceIndex );

						const modelID = found.object.modelID;
						ifcLoader.ifcManager.createSubset( {
    
     modelID, ids: [ id ], scene, removePrevious: true, material: highlightMaterial } );
						const props = ifcLoader.ifcManager.getItemProperties( modelID, id, true );
						console.log( props );
						renderer.render( scene, camera );

		}

	}

				window.onpointerdown = selectObject;

				//Renderer
				renderer = new THREE.WebGLRenderer( {
    
     antialias: true	} );
				renderer.setSize( window.innerWidth, window.innerHeight );
				renderer.setPixelRatio( window.devicePixelRatio );
				document.body.appendChild( renderer.domElement );

				//Controls
				const controls = new OrbitControls( camera, renderer.domElement );
				controls.addEventListener( 'change', render );

				window.addEventListener( 'resize', onWindowResize );

				render();

			}

			function onWindowResize() {
    
    

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();
				renderer.setSize( window.innerWidth, window.innerHeight );

				render();

			}

			function render() {
    
    

				renderer.render( scene, camera );

			}

		</script>
	</body>
</html>

Guess you like

Origin blog.csdn.net/qq_39353597/article/details/123519993