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 回應:
張貼留言