glTF格式的3D格式文件是官方推荐的使用的格式,这种格式的文件我们可以在sketchfab官网下载,这是一个国外比较知名的模型网站。
loader地址:
https://github.com/mrdoob/three.js/blob/master/examples/js/loaders/GLTFLoader.js
下载地址:
https://sketchfab.com/3d-models?date=week&features=downloadable&sort_by=-likeCount
首先,将GLTFLoader加载器插件引入到页面,插件在官方包的地址/examples/js/loaders/,一些文件的导入插件都在这一个文件夹内,大家有兴趣可以研究一下:
<script src="../js/loaders/GLTFLoader.js"></script>
- 然后创建一个加载器:
var loader = new THREE.GLTFLoader();
- 使用加载器去加载模型,并调节一下模型大小在场景内展示:
loader.load('../js/models/gltf/scene.gltf', function (gltf) {
gltf.scene.scale.set(.1,.1,.1);
scene.add(gltf.scene);
});
只要碰到loader,一定要使用dev server
3D模型使用步骤
实例文件夹
1、下载GLTFLoader.js文件,并在index.html文件中进行引入
https://github.com/mrdoob/three.js/blob/master/examples/js/loaders/GLTFLoader.js
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>我的第一个Three.js案例</title>
<style>
body {
margin: 0;
}
canvas {
width: 100%;
height: 100%;
display: block;
}
</style>
</head>
<body onload="draw()">
<script src="https://cdn.bootcss.com/three.js/92/three.js"></script>
<script src="./gltfloader.js"></script>
<!-- control.js 控制视角旋转的插件 -->
<script src="./control.js"></script>
<script src="http://www.wjceo.com/lib/js/libs/stats.min.js"></script>
<script src="https://cdn.bootcss.com/dat-gui/0.7.1/dat.gui.min.js"></script>
<script src="./index.js"></script>
</body>
</html>
2、打开模型地址,进行选择模型
https://sketchfab.com/3d-models?date=week&features=downloadable&sort_by=-likeCount
3、选中一个进入,进行下载
下载的3D模型文件
vs code之Live Server插件的使用方法
1、安装
2、找到scene.gltf模型文件后,右击并点击列表的【Preview 3D Model】
3、在创建模型initModel中,加载外部的gltf文件:
使用加载器去加载模型,并调节一下模型大小在场景内展示:
loader.load('../js/models/gltf/scene.gltf', function (gltf) {
gltf.scene.scale.set(.1,.1,.1);
scene.add(gltf.scene);
});
只要碰到loader,一定要使用dev server
index.js
var renderer, camera, scene, gui, stats, ambientLight, directionalLight, control;
function initRender() {
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
//告诉渲染器需要阴影效果
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMap
document.body.appendChild(renderer.domElement);
}
function initCamera() {
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 100, 200);
camera.lookAt(new THREE.Vector3(0, 0, 0));
}
function initScene() {
scene = new THREE.Scene();
}
function initGui() {
//声明一个保存需求修改的相关数据的对象
gui = {};
var datGui = new dat.GUI();
//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)
}
function initLight() {
ambientLight = new THREE.AmbientLight("#111111", 20); // 环境光
scene.add(ambientLight);
directionalLight = new THREE.DirectionalLight("#ffffff", 100); // 太阳
directionalLight.position.set(40, 60, 10);
directionalLight.shadow.camera.near = 1; //产生阴影的最近距离
directionalLight.shadow.camera.far = 400; //产生阴影的最远距离
directionalLight.shadow.camera.left = -50; //产生阴影距离位置的最左边位置
directionalLight.shadow.camera.right = 50; //最右边
directionalLight.shadow.camera.top = 50; //最上边
directionalLight.shadow.camera.bottom = -50; //最下面
//这两个值决定生成阴影密度 默认512
directionalLight.shadow.mapSize.height = 1024;
directionalLight.shadow.mapSize.width = 1024;
//告诉平行光需要开启阴影投射
directionalLight.castShadow = true;
scene.add(directionalLight);
}
function initModel() {
//底部平面
var planeGeometry = new THREE.PlaneGeometry(100, 100);
var planeMaterial = new THREE.MeshLambertMaterial({
color: '#fff',
side: THREE.DoubleSide
});
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.rotation.x = -0.5 * Math.PI;
plane.position.y = -.1;
plane.receiveShadow = true; //可以接收阴影
scene.add(plane);
// 创建gltf加载器
var loader = new THREE.GLTFLoader();
loader.load('./3d/scene.gltf', function (gltf) {
gltf.scene.scale.set(50, 50, 50);
scene.add(gltf.scene);
});
}
function initStats() {
stats = new Stats();
document.body.appendChild(stats.dom);
}
function initControl() {
control = new THREE.OrbitControls(camera, renderer.domElement);
}
function render() {
control.update();
renderer.render(scene, camera);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
//更新控制器
render();
//更新性能插件
stats.update();
requestAnimationFrame(animate);
}
function draw() {
initGui();
initRender();
initScene();
initCamera();
initLight();
initModel();
initStats();
initControl();
animate();
renderer.setClearColor('rgb(135,206,250)', 1.0);
window.onresize = onWindowResize;
}
4、直接本地打开index.html文件,会存在跨域问题
5、通过dev server进行打开
附
因为是感光材料,可以修改属性,改变效果
index.js
function initLight() {
ambientLight = new THREE.AmbientLight("#111111", 20); // 环境光
scene.add(ambientLight);
directionalLight = new THREE.DirectionalLight("#ffffff", 100); // 太阳
}