最近在做一个在网页端展示3D模型的项目,现在简单介绍一下怎么实现功能。首先,下载three.js文件,在threejs官网能下,这里附上地址链接一条https://threejs.org/然后,下载解压,会得到three.js-master文件,在build目录找到three.js,这个是three.js的核心功能库。在example/js/loaders目录,你会看到各种模型格式加载的js文件。
作者:林智超__
链接:https://www.jianshu.com/p/0798a76121af
來源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
本次以加载obj模型为例,准备好obj和mtl文件的模型素材。创建场景的js文件用到基本的three.js,加载模型的js文件用到DDSLoader.js,MTLLoader.js,OBJLoader.js,镜头的转动用OrbitControls.js文件。当然也有其他功能实现替代的js文件,用到的js文件不唯一,文件路径自行设置。本次实例导入如图js文件
实现的Javascript代码如下,注释会解释各块代码是干嘛用
var camera, controls, scene, renderer;
init();
animate();
// 加载进度
var onProgress = function(xhr) {
if (xhr.lengthComputable) {
var percentComplete = xhr.loaded / xhr.total * 100;
var percent = document.getElementById("info");
percent.innerText = Math.round(percentComplete, 2) + '% 已经加载';
}
};
var onError = function(xhr) {};
//当mtl中引用了dds类型的图片时,还需导入DDSLoader文件
THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
//mtl文件加载器
var mtlLoader = new THREE.MTLLoader();
//你的模型材质文件的目录地方路径
mtlLoader.setPath('model/yjq/');
//导入材质文件
mtlLoader.load('yjq.mtl', function(materials) {
materials.preload();
//ob文件加载器
var objLoader = new THREE.OBJLoader();
objLoader.setMaterials(materials);
//你的模型文件的目录地方路径
objLoader.setPath('model/yjq');
objLoader.load('yjq.obj', function(object) {
//这里的object参数就是模型加载方法的回调函数,object就是你的模型,下面的属性自行设置
// object.position.y = 0;
// object.rotation.x = -90;
// object.rotation.y = 90;
// object.rotation.z = 90;
//自行调整模型比例
object.scale.set(10, 10, 10);
//加入到场景中
scene.add(object);
}, onProgress, onError);
});
function init() {
//创建一个透视相机,设置相机视角60度,最远能看1000,最近能看1
camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.set( 0, 200, 400 ); //设置相机位置
//控制相机
controls = new THREE.OrbitControls( camera );
//设置相机移动距离
controls.minDistance = 100;
controls.maxDistance = 900;
//创建场景
scene = new THREE.Scene();
//设置场景背景色,灰色
scene.background = new THREE.Color( 0xeeeeee );
//场景中添加网格辅助
scene.add( new THREE.GridHelper( 400, 10 ) );
// 灯光
// 给场景添加一个环境光
var ambientLight = new THREE.AmbientLight( 0xfff );
scene.add( ambientLight );
// 给场景添加一个半球光出来
hemiLight = new THREE.HemisphereLight( 0xffffff, 0xffffff, 0.8 );
hemiLight.color.setHSL( 0.6, 1, 0.6 );
hemiLight.groundColor.setHSL( 0.095, 1, 0.75 );
hemiLight.position.set( 0, 50, 0 );
scene.add( hemiLight );
// 给场景添加一个平行光出来
dirLight = new THREE.DirectionalLight( 0xffffff, 0.8 );
dirLight.color.setHSL( 0.1, 1, 0.95 );
dirLight.position.set( -1, 1.75, 1 );
dirLight.position.multiplyScalar( 30 );
scene.add( dirLight );
dirLight.castShadow = true;
//实例化一个渲染器s
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
window.addEventListener( 'resize', onWindowResize, false );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function animate() {
//每一帧渲染一次画面,不然画面是静止的
requestAnimationFrame( animate );
renderer.render( scene, camera );
}
代码直接粘贴复制就能用,但原理和细节这里的篇幅解释不了的那么多谷歌浏览器展示效果如下,720度旋转和放大缩小都可以。最后,如果想继续了解更多的功能,可以参考threejs官方的案例
作者:林智超__
链接:https://www.jianshu.com/p/0798a76121af
來源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。