HTML
<div id="Container"></div> <div id="LabelTpl" style="display:none;"> <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 30 30"> <text x="15" y="15" fill="#fff" text-anchor="middle"></text> </svg> </div> <script src="../Scripts/three.145/three.min.js"></script> <script src="../Scripts/three.145/controls/OrbitControls.js"></script> <script src="../Scripts/three.145/loaders/GLTFLoader.js"></script> <script src="main.js"></script>
main.js
/* 初始化渲染器 */ const renderer = new THREE.WebGLRenderer({ antialias: true }); document.getElementById('Container').appendChild(renderer.domElement); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); /* 初始化場景 */ const scene = new THREE.Scene(); scene.background = new THREE.Color('#000'); /* 背景顏色 */ scene.add(new THREE.AmbientLight('#FFF', 0.5)); /* 加入環境光 */ scene.add(new THREE.AxesHelper(50)); /* 3D 軸標示 */ /* 初始化鏡頭 */ const camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 0.1, 300); camera.position.set(0, 4, 12); /* 初始化軌道控制,鏡頭的移動 */ const orbitControls = new THREE.OrbitControls(camera, renderer.domElement); orbitControls.update(); /* 渲染週期 */ function renderCycle() { renderer.render(scene, camera); requestAnimationFrame(renderCycle); } renderCycle(); /*---------------------------------------------------------------*/ function svgBase64(svg) { svg = svg.replace(/\s+</g, '<').replace(/>\s+/g, '>'); return 'data:image/svg+xml,' + encodeURIComponent(svg); } const textureLoader = new THREE.TextureLoader(); const $labelTpl = document.querySelector('#LabelTpl'); const $labelText = document.querySelector('#LabelTpl text'); /* 環線 */ function addCircle(label, z) { $labelText.innerHTML = label; let imageData = svgBase64($labelTpl.innerHTML); const particles = new THREE.Points( new THREE.EdgesGeometry(new THREE.CircleGeometry(10, 6)), new THREE.PointsMaterial({ map: textureLoader.load(imageData), color: '#FFF', size: 4, depthWrite: false, transparent: true, }) ); particles.position.z = z; scene.add(particles); const circle = new THREE.LineSegments( new THREE.EdgesGeometry(new THREE.CircleGeometry(10, 60)), new THREE.LineBasicMaterial({ color: '#FFF' }) ); circle.position.z = z; scene.add(circle); } addCircle('冬至', 4); addCircle('夏至', -4);
0 回應:
張貼留言