598 字
3 分钟
Threejs 导入模型

效果展示
关于Threejs
Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。
Iframe
<iframe id="modelFrame" src="https://ts.undf.top/3d/bysj.html" width="100%" height="75%" style = "border-radius: 10px;" frameborder="0"></iframe>
为了方便引入,采用iframe框架,可以有效减少引入处的代码长度。
源码仓库
仓库内3d文件夹下面即是所有源代码。如果不需要自定义修改,建议复制整个文件夹到你的目录内,如果需要自定义模型和样式,请参照下面的关键代码解释
关键代码
如果需要更改js文件的位置需要修改 html 文件里面的位置和 stl.js 文件内的位置。
// 如果需要修改文件位置,记得修改这里的路径import * as THREE from './build/three.module.js';
import Stats from './build/stats.js';
import { STLLoader } from './build/stl.js';
let container, stats;
let camera, cameraTarget, scene, renderer;
init(); animate();
function init() {
container = document.createElement( 'div' ); document.body.appendChild( container );
camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 30 ); camera.position.set( 0, 0.85, 0 ); //相机位置 cameraTarget = new THREE.Vector3( 0, - 0.25, 0 );
scene = new THREE.Scene(); scene.background = new THREE.Color( 0x72645b ); scene.fog = new THREE.Fog( 0x72645b, 2, 15 );
// Ground // const plane = new THREE.Mesh( new THREE.PlaneGeometry( 40, 40 ), new THREE.MeshPhongMaterial( { color: 0x999999, specular: 0x101010 } ) ); plane.rotation.x = - Math.PI / 2; plane.position.y = - 0.5; scene.add( plane );
plane.receiveShadow = true;
const loader = new STLLoader();
// Binary files。即 二进制 stl 文件
const material = new THREE.MeshPhongMaterial( { color: 0xAAAAAA, specular: 0x111111, shininess: 200 } );
loader.load( './model/bysj.stl', function ( geometry ) {
const mesh = new THREE.Mesh( geometry, material ); //模型参数 mesh.position.set( 0, - 0.18, - 0.1 ); mesh.rotation.set( - Math.PI / 2, 0, 0 ); mesh.scale.set( 0.008, 0.008, 0.008 );
mesh.castShadow = true; mesh.receiveShadow = true;
scene.add( mesh );
} );
scene.add( new THREE.HemisphereLight( 0x443333, 0x111122 ) );
addShadowedLight( 1, 1, 1, 0xffffff, 1.35 ); addShadowedLight( 0.5, 1, - 1, 0xffaa00, 1 ); // renderer
renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.outputEncoding = THREE.sRGBEncoding;
renderer.shadowMap.enabled = true;
container.appendChild( renderer.domElement );
// stats
stats = new Stats(); container.appendChild( stats.dom );
//
window.addEventListener( 'resize', onWindowResize );
}
function addShadowedLight( x, y, z, color, intensity ) {
const directionalLight = new THREE.DirectionalLight( color, intensity ); directionalLight.position.set( x, y, z ); scene.add( directionalLight );
directionalLight.castShadow = true;
const d = 1; directionalLight.shadow.camera.left = - d; directionalLight.shadow.camera.right = d; directionalLight.shadow.camera.top = d; directionalLight.shadow.camera.bottom = - d;
directionalLight.shadow.camera.near = 1; directionalLight.shadow.camera.far = 4;
directionalLight.shadow.bias = - 0.002;
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function animate() {
requestAnimationFrame( animate );
render(); stats.update();
}
function render() {
const timer = Date.now() * 0.0005;
camera.position.x = Math.cos( timer ) * 3; camera.position.z = Math.sin( timer ) * 3;
camera.lookAt( cameraTarget );
renderer.render( scene, camera );
}