mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-04 15:17:36 +00:00
229 lines
4.8 KiB
HTML
229 lines
4.8 KiB
HTML
<!--********************************************************************
|
|
* by jiawanlong
|
|
*********************************************************************-->
|
|
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
overflow: hidden;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div id="container" ></div>
|
|
<script async src="./es-module-shims.js"></script>
|
|
<script type="importmap">
|
|
{
|
|
"imports": {
|
|
"three": "./../../libs/three/build/three.module.js",
|
|
"three/addons/": "./../../libs/three/examples/jsm/"
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<script type="module">
|
|
import * as THREE from 'three';
|
|
|
|
function getPageParams() {
|
|
var pageurl = window.location.href;
|
|
var param = {};
|
|
if (pageurl.indexOf("?") != -1) {
|
|
var paramstr = pageurl.split("?")[1];
|
|
var pArr = paramstr.split("&");
|
|
var tArr = null;
|
|
for (var i = 0; i < pArr.length; i++) {
|
|
tArr = pArr[i].split("=");
|
|
if (tArr.length == 2) {
|
|
param[tArr[0]] = tArr[1];
|
|
} else {
|
|
param[tArr[0]] = "";
|
|
}
|
|
}
|
|
}
|
|
return param;
|
|
}
|
|
|
|
|
|
let camera, scene, renderer;
|
|
|
|
let isUserInteracting = false,
|
|
onPointerDownMouseX = 0, onPointerDownMouseY = 0,
|
|
lon = 0, onPointerDownLon = 0,
|
|
lat = 0, onPointerDownLat = 0,
|
|
phi = 0, theta = 0;
|
|
|
|
init();
|
|
animate();
|
|
|
|
function init() {
|
|
var obj = getPageParams()
|
|
|
|
const container = document.getElementById('container');
|
|
|
|
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);
|
|
|
|
scene = new THREE.Scene();
|
|
|
|
const geometry = new THREE.SphereGeometry(500, 60, 40);
|
|
geometry.scale(- 1, 1, 1);
|
|
let texture
|
|
if (obj.url) {
|
|
texture = new THREE.TextureLoader().load(obj.url);
|
|
} else {
|
|
texture = new THREE.TextureLoader().load('./360.jpg');
|
|
}
|
|
const material = new THREE.MeshBasicMaterial({ map: texture });
|
|
|
|
const mesh = new THREE.Mesh(geometry, material);
|
|
|
|
scene.add(mesh);
|
|
|
|
renderer = new THREE.WebGLRenderer();
|
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
container.appendChild(renderer.domElement);
|
|
|
|
container.style.touchAction = 'none';
|
|
container.addEventListener('pointerdown', onPointerDown);
|
|
|
|
document.addEventListener('wheel', onDocumentMouseWheel);
|
|
|
|
//
|
|
|
|
document.addEventListener('dragover', function (event) {
|
|
|
|
event.preventDefault();
|
|
event.dataTransfer.dropEffect = 'copy';
|
|
|
|
});
|
|
|
|
document.addEventListener('dragenter', function () {
|
|
|
|
document.body.style.opacity = 0.5;
|
|
|
|
});
|
|
|
|
document.addEventListener('dragleave', function () {
|
|
|
|
document.body.style.opacity = 1;
|
|
|
|
});
|
|
|
|
document.addEventListener('drop', function (event) {
|
|
|
|
event.preventDefault();
|
|
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', function (event) {
|
|
|
|
material.map.image.src = event.target.result;
|
|
material.map.needsUpdate = true;
|
|
|
|
});
|
|
reader.readAsDataURL(event.dataTransfer.files[0]);
|
|
|
|
document.body.style.opacity = 1;
|
|
|
|
});
|
|
|
|
//
|
|
|
|
window.addEventListener('resize', onWindowResize);
|
|
|
|
}
|
|
|
|
function onWindowResize() {
|
|
|
|
camera.aspect = window.innerWidth / window.innerHeight;
|
|
camera.updateProjectionMatrix();
|
|
|
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
|
|
}
|
|
|
|
function onPointerDown(event) {
|
|
|
|
if (event.isPrimary === false) return;
|
|
|
|
isUserInteracting = true;
|
|
|
|
onPointerDownMouseX = event.clientX;
|
|
onPointerDownMouseY = event.clientY;
|
|
|
|
onPointerDownLon = lon;
|
|
onPointerDownLat = lat;
|
|
|
|
document.addEventListener('pointermove', onPointerMove);
|
|
document.addEventListener('pointerup', onPointerUp);
|
|
|
|
}
|
|
|
|
function onPointerMove(event) {
|
|
|
|
if (event.isPrimary === false) return;
|
|
|
|
lon = (onPointerDownMouseX - event.clientX) * 0.1 + onPointerDownLon;
|
|
lat = (event.clientY - onPointerDownMouseY) * 0.1 + onPointerDownLat;
|
|
|
|
}
|
|
|
|
function onPointerUp() {
|
|
|
|
if (event.isPrimary === false) return;
|
|
|
|
isUserInteracting = false;
|
|
|
|
document.removeEventListener('pointermove', onPointerMove);
|
|
document.removeEventListener('pointerup', onPointerUp);
|
|
|
|
}
|
|
|
|
function onDocumentMouseWheel(event) {
|
|
|
|
const fov = camera.fov + event.deltaY * 0.05;
|
|
|
|
camera.fov = THREE.MathUtils.clamp(fov, 10, 75);
|
|
|
|
camera.updateProjectionMatrix();
|
|
|
|
}
|
|
|
|
function animate() {
|
|
|
|
requestAnimationFrame(animate);
|
|
update();
|
|
|
|
}
|
|
|
|
function update() {
|
|
|
|
if (isUserInteracting === false) {
|
|
|
|
// lon += 0.1;
|
|
|
|
}
|
|
|
|
lat = Math.max(- 85, Math.min(85, lat));
|
|
phi = THREE.MathUtils.degToRad(90 - lat);
|
|
theta = THREE.MathUtils.degToRad(lon);
|
|
|
|
const x = 500 * Math.sin(phi) * Math.cos(theta);
|
|
const y = 500 * Math.cos(phi);
|
|
const z = 500 * Math.sin(phi) * Math.sin(theta);
|
|
|
|
camera.lookAt(x, y, z);
|
|
|
|
renderer.render(scene, camera);
|
|
|
|
}
|
|
|
|
</script>
|
|
</body>
|
|
|
|
</html> |