| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- import * as THREE from '../../build/three.module.js';
- import {
- GLTFLoader
- } from '../jsm/loaders/GLTFLoader.js';
- import {
- OrbitControls
- } from '../jsm/controls/OrbitControls.js';
- let canvas, renderer;
- const scenes = [];
- //const category = ['1', '2', '3'];
- window.initThreeJS = init;
- function init() {
- canvas = document.getElementById("c");
- const content = document.getElementById('content');
- for (let i = 0; i < id.length; i++) {
- const scene = new THREE.Scene();
- //scene.background = new THREE.Color(0x000000);
- // make a list item
- const isotope = document.createElement('div');
- isotope.className = 'isotope-item ' + revitVersion[i] + ' ' + categoryTable[i] + ' col-sm-6 col-md-4 col-lg-3';
- content.appendChild(isotope);
- const thumbnail = document.createElement('div');
- thumbnail.className = 'thumbnail';
- isotope.appendChild(thumbnail);
- const element = document.createElement('div');
- //element.className = 'thumb-preview list-item';
- element.className = 'thumb-preview';
- //element.className = 'list-item';
- thumbnail.appendChild(element);
- const a = document.createElement('a');
- a.className = "thumb-image";
- a.href = "/Common/assets/images/projects/project-8.png";
- element.appendChild(a);
- /*
- const thumbImage = document.createElement('a');
- thumbImage.className = 'thumb-image';
- preview.appendChild(thumbImage);
- const element = document.createElement( 'div' );
- element.className = 'list-item';
- */
- const sceneElement = document.createElement('div');
- element.appendChild(sceneElement);
- const aImg = document.createElement('a');
- aImg.setAttribute("href", "component-detail.php?object=" + object[i] + "&type=" + typeInEnglish[i] + "&parent=" + parentInEnglish[i]);
- sceneElement.appendChild(aImg);
- const img = document.createElement('img');
- img.src = "/Common/assets/images/projects/project-8.png";
- img.className = 'img-responsive';
- img.alt = 'Project';
- aImg.appendChild(img);
- // the element that represents the area we want to render the scene
- scene.userData.element = sceneElement;
- thumbnail.appendChild(element);
- const h5 = document.createElement('a');
- h5.innerText = object[i];
- h5.setAttribute("href", "component-detail.php?object=" + object[i] + "&type=" + typeInEnglish[i] + "&parent=" + parentInEnglish[i]);
- h5.style = "padding-bottom: 0px;"
- thumbnail.appendChild(h5);
- const smallRvt = document.createElement('small');
- smallRvt.innerText = ".rfa";
- h5.appendChild(smallRvt);
- h5.innerText = ellipsis(h5.innerText);
- const mgdescription = document.createElement('div');
- mgdescription.className = 'mg-description';
- thumbnail.appendChild(mgdescription);
- const checkbox = document.createElement('input');
- checkbox.type = "checkbox";
- checkbox.value = id[i];
- checkbox.name = "delCheck";
- mgdescription.appendChild(checkbox);
- const pullRight = document.createElement('small');
- pullRight.className = 'pull-right text-muted';
- pullRight.innerText = 'Revit ' + revitVersion[i];
- mgdescription.appendChild(pullRight);
- const camera = new THREE.PerspectiveCamera(50, 1, 1, 1000);
- camera.position.set(0, 2.5, 8);
- scene.userData.camera = camera;
- //scene = new THREE.Scene();
- scene.background = new THREE.Color(0x15608c);
- const hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444);
- hemiLight.position.set(0, 20, 0);
- scene.add(hemiLight);
- const spotLight = new THREE.SpotLight(0xffffff);
- spotLight.position.set(15, 40, 35);
- spotLight.castShadow = true;
- spotLight.intensity = 0.5;
- scene.add(spotLight);
- const spotLight2 = new THREE.SpotLight(0xffffff);
- spotLight2.position.set(15, 40, -35);
- spotLight2.castShadow = true;
- spotLight2.intensity = 0.5;
- scene.add(spotLight2);
- const dirLight = new THREE.DirectionalLight(0xffffff);
- dirLight.position.set(5, 5, 0);
- dirLight.castShadow = true;
- dirLight.shadow.camera.top = 1;
- dirLight.shadow.camera.bottom = -1;
- dirLight.shadow.camera.left = -1;
- dirLight.shadow.camera.right = 1;
- dirLight.shadow.camera.near = 0.1;
- dirLight.shadow.camera.far = 20;
- scene.add(dirLight);
- const mesh = new THREE.Mesh(new THREE.PlaneGeometry(50, 50), new THREE.MeshPhongMaterial({
- color: 0x999999,
- depthWrite: false
- }));
- mesh.rotation.x = -Math.PI / 2;
- mesh.receiveShadow = true;
- scene.add(mesh);
- const grid = new THREE.GridHelper(50, 50, 0x888888, 0x888888);
- scene.add(grid);
- const controls = new OrbitControls(scene.userData.camera, scene.userData.element);
- controls.target.set(0, 2, 0);
- controls.minDistance = 0.5;
- controls.maxDistance = 10;
- controls.maxPolarAngle = 0.5 * Math.PI;
- controls.autoRotate = true;
- controls.mouseButtons = {
- LEFT: '',
- TOP: '',
- RIGHT: ''
- }
- scene.userData.controls = controls;
- var loader = new GLTFLoader();
- loader.setPath("./assets/glb/Revit元件/Components/" + parent[i] + "/" + type[i] + "/");
-
- var name = object[i] + ".glb";
- loader.load(name, function (gltf) {
- var mroot = gltf.scene;
- var bbox = new THREE.Box3().setFromObject(mroot);
- var cent = bbox.getCenter(new THREE.Vector3());
- var size = bbox.getSize(new THREE.Vector3());
- //Rescale the object to normalized space
- var maxAxis = Math.max(size.x, size.y, size.z);
- mroot.scale.multiplyScalar(5.0 / maxAxis);
- bbox.setFromObject(mroot);
- bbox.getCenter(cent);
- bbox.getSize(size);
- //Reposition to 0,halfY,0
- mroot.position.copy(cent).multiplyScalar(-1);
- mroot.position.y += (size.y * 0.5);
- mroot.traverse(function (object) {
- if (object.isMesh) {
- object.castShadow = true;
- if (object.material.name == '玻璃') {
- object.material.transparent = true;
- object.material.opacity = 0;
- }
- }
- });
- scene.add(mroot);
- });
- scenes.push(scene);
- }
- renderer = new THREE.WebGLRenderer({
- canvas: canvas,
- antialias: true
- });
- renderer.setClearColor(0xffffff, 1);
- renderer.setPixelRatio(window.devicePixelRatio);
- renderer.outputEncoding = THREE.sRGBEncoding;
- renderer.shadowMap.enabled = true;
- animate();
- }
- function ellipsis(str) {
- return (str.length > 32) ? str.substr(0, 31) + '...' : str;
- }
- function updateSize() {
- const width = canvas.clientWidth;
- const height = canvas.clientHeight;
- if (canvas.width !== width || canvas.height !== height) {
- renderer.setSize(width, height, false);
- }
- }
- function animate() {
- render();
- requestAnimationFrame(animate);
- }
- function render() {
- updateSize();
- canvas.style.transform = `translateY(${window.scrollY}px)`;
- renderer.setClearColor(0xffffff);
- renderer.setScissorTest(false);
- renderer.clear();
- renderer.setClearColor(0xe0e0e0);
- renderer.setScissorTest(true);
- scenes.forEach(function (scene) {
- // get the element that is a place holder for where we want to
- // draw the scene
- const element = scene.userData.element;
- // get its position relative to the page's viewport
- const rect = element.getBoundingClientRect();
- // check if it's offscreen. If so skip it
- if (rect.bottom < 0 || rect.top > renderer.domElement.clientHeight ||
- rect.right < 0 || rect.left > renderer.domElement.clientWidth) {
- return; // it's off screen
- }
- // set the viewport
- const width = rect.right - rect.left;
- const height = rect.bottom - rect.top;
- const left = rect.left;
- const bottom = renderer.domElement.clientHeight - rect.bottom;
- renderer.setViewport(left, bottom, width, height);
- renderer.setScissor(left, bottom, width, height);
- const camera = scene.userData.camera;
- //camera.aspect = width / height; // not changing in this example
- //camera.updateProjectionMatrix();
- scene.userData.controls.update();
- renderer.render(scene, camera);
- });
- }
- $('input[name="delCheck"]').change(function () {
- delFavoriteList = [];
- $('input[name="delCheck"]:checked').each(function () {
- delFavoriteList.push($(this).val());
- });
- });
|