1. 程式人生 > >51 使用ThreeBSP庫進行Three.js網格組合

51 使用ThreeBSP庫進行Three.js網格組合

var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias: true}); //renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); //設定背景顏色 renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); } var
camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(0, 200, 500); } var scene; function initScene() { scene = new THREE.Scene(); } var light; function initLight
() {
scene.add(new THREE.AmbientLight(0x404040)); light = new THREE.DirectionalLight(0xffffff); light.position.set(1, 1, 1); scene.add(light); } function initModel() { //軸輔助 (每一個軸的長度) var object = new THREE.AxesHelper(500); scene.add(object); //建立球形幾何體
var sphereGeometry = new THREE.SphereGeometry(50, 20, 20); var sphere = createMesh(sphereGeometry); //建立立方體幾何體 var cubeGeometry = new THREE.BoxGeometry(30, 30, 30); var cube = createMesh(cubeGeometry); cube.position.x = -50; //生成ThreeBSP物件 var sphereBSP = new ThreeBSP(sphere); var cubeBSP = new ThreeBSP(cube); //進行並集計算 var resultBSP = sphereBSP.subtract(cubeBSP); //從BSP物件內獲取到處理完後的mesh模型資料 var result = resultBSP.toMesh(); //更新模型的面和頂點的資料 result.geometry.computeFaceNormals(); result.geometry.computeVertexNormals(); //重新賦值一個紋理 var material = new THREE.MeshPhongMaterial({color: 0x00ffff}); result.material = material; //將計算出來模型新增到場景當中 scene.add(sphere); scene.add(cube); scene.add(result); } //生成模型 function createMesh(geom) { //設定當前的模型矩陣沿xy軸偏移,讓圖片處於顯示中心 //geom.applyMatrix(new THREE.Matrix4().makeTranslation(-250, -100, 0)); // 建立法向量紋理 var meshMaterial = new THREE.MeshNormalMaterial({ flatShading: THREE.FlatShading, transparent: true, opacity: 0.9 }); // 建立一個線框紋理 var wireFrameMat = new THREE.MeshBasicMaterial({opacity: 0.5, wireframeLinewidth: 0.5}); wireFrameMat.wireframe = true; // 建立模型 var mesh = new THREE.Mesh(geom, wireFrameMat); return mesh; } //初始化效能外掛 var stats; function initStats() { stats = new Stats(); document.body.appendChild(stats.dom); } //使用者互動外掛 滑鼠左鍵按住旋轉,右鍵按住平移,滾輪縮放 var controls; function initControls() { controls = new THREE.OrbitControls(camera, renderer.domElement); // 如果使用animate方法時,將此函式刪除 //controls.addEventListener( 'change', render ); // 使動畫迴圈使用時阻尼或自轉 意思是否有慣性 controls.enableDamping = true; //動態阻尼係數 就是滑鼠拖拽旋轉靈敏度 //controls.dampingFactor = 0.25; //是否可以縮放 controls.enableZoom = true; //是否自動旋轉 controls.autoRotate = false; //設定相機距離原點的最遠距離 controls.minDistance = 20; //設定相機距離原點的最遠距離 controls.maxDistance = 10000; //是否開啟右鍵拖拽 controls.enablePan = true; } //生成gui設定配置項 var gui; function initGui() { //宣告一個儲存需求修改的相關資料的物件 gui = { }; var datGui = new dat.GUI(); //將設定屬性新增到gui當中,gui.add(物件,屬性,最小值,最大值) } function render() { renderer.render(scene, camera); } //視窗變動觸發的函式 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); render(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { //更新控制器 controls.update(); render(); //更新效能外掛 stats.update(); requestAnimationFrame(animate); } function draw() { initRender(); initScene(); initCamera(); initLight(); initModel(); initControls(); initStats(); initGui(); animate(); window.onresize = onWindowResize; }