代码如下
<html lang="en">
<head>
<title>3D模型实时观看</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
font-family: Monospace;
background-color: black;
color: white;
margin: 0px;
overflow: hidden;
}
#modelBorderContainer {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
width: 100%;
height: 100%;
}
#modelBorder {
max-width: 512px;
width: 100%;
height: 50%;
}
canvas {
position: absolute;
top: 0%;
left: 0%;
}
</style>
</head>
<body>
<div id="modelBorderContainer">
<div id="modelBorder"></div>
</div>
<script type="application/javascript">
var modelUrl = '//repo.bfw.wiki/bfwrepo/threemodel/table.gltf'; //定义所使用模型路径
</script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.122.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/OrbitControls.min.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/GLTFLoader.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/WebGL.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/Stats-16.js"></script>
<script>
if (WEBGL.isWebGLAvailable() === false) {
document.body.appendChild(WEBGL.getWebGLErrorMessage());
}
var container, stats, controls;
var camera, scene, renderer, light, bbox;
var rotating = true;
init();
animate();
pauseRotation();
function init() {
if (!modelUrl) {
return false;
}
container = document.createElement('div');
document.body.appendChild(container); //创建div,并加载到html里,这里的document.body可以换成你想让模型加载的地方。
scene = new THREE.Scene();
bbox = new THREE.Box3();
scene.background = new THREE.Color(0xeeeeee);
light = new THREE.HemisphereLight(0xbbbbff, 0x444422, 1.5);
light.position.set(0, 1, 0);
scene.add(light);
var loader = new THREE.GLTFLoader();
loader.load(modelUrl, function (gltf) {
gltf.scene.name = '3dmodel';
this.setContent(gltf.scene);
scene.add(gltf.scene);
}, undefined, function (e) {
console.error(e);
});
renderer = new THREE.WebGLRenderer( {
antialias: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.gammaOutput = true;
container.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 1000);
controls = new THREE.OrbitControls(camera);
// to disable pan
controls.enablePan = false;
// to disable zoom
controls.enableZoom = false;
controls.target.set(0, 0, 0);
controls.update();
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
//
function animate() {
requestAnimationFrame(animate);
if (rotating) {
scene.rotation.y += -0.005;
} else {
scene.rotation.y = scene.rotation.y;
}
renderer.render(scene, camera);
}
function pauseRotation() {
var modelBorder = document.getElementById("modelBorder");
modelBorder.addEventListener("mouseenter", function(event) {
rotating = false;
});
modelBorder.addEventListener("mouseleave", function(event) {
rotating = true;
});
modelBorder.addEventListener('touchmove', function(e) {
rotating = false;
}, false);
modelBorder.addEventListener('touchstart', function(e) {
rotating = false;
}, false);
modelBorder.addEventListener('touchend', function(e) {
rotating = true;
}, false);
}
function setContent(object) {
object.updateMatrixWorld();
const box = new THREE.Box3().setFromObject(object);
const size = box.getSize(new THREE.Vector3()).length();
const boxSize = box.getSize();
const center = box.getCenter(new THREE.Vector3());
object.position.x += object.position.x - center.x;
object.position.y += object.position.y - center.y;
object.position.z += object.position.z - center.z;
this.camera.position.copy(center);
if (boxSize.x > boxSize.y) {
this.camera.position.z = boxSize.x * -2.85
} else {
this.camera.position.z = boxSize.y * -2.85
}
this.camera.lookAt(0, 0, 0);
}
</script>
</body>
</html>
网友回复