三维模型展示效果实现

528 阅读3分钟

效果

用到的内容
此效果主要使用到了 three.js、tween.js 以及相关三维模型资源。

三维场景的基本介绍 基本入门这里就不做过多介绍了,网上的入门文章很多,这里推荐一篇蛮生动的基本概念介绍文章 zhuanlan.zhihu.com/p/27296011

开始
看到这里,想必你已经知道了三维场景的一些基本概念,那么基于上文展示的案例效果,我们可以分析得出,要实现这样的效果,需要以下几个步骤。

1.创建场景
2.创建相机
3.创建光线,确保场景内的元素可见
4.创建渲染器,将3D内容渲染在页面上

上面四步就把我们需要的展示“舞台”搭建完毕了,接下来,就是演员入场

5.载入狐狸模型,并放置在场景中间,调整摄像机到合适的角度,凹好造型。
6.加入交互按钮,点击每个按钮,摄像机都会移动到对应的位置。
7.演出(开发)完成。

接下来介绍代码实现

html

<!DOCTYPE html>
<html lang="ZH-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link href="https://cdn.bootcss.com/normalize/8.0.1/normalize.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/three@0.95.0/build/three.min.js"></script>
  <script src="./js/OrbitControls.js"></script>
  <script src="./js/tween.min.js"></script>
  <title>Document</title>
  <style>
    .btns {
      position: absolute;
      left: 0;
      top: 0;
      z-index: 100;
    }
  </style>
</head>
<body>
  <div class="btns">
    <button data-pos="front">看正面</button>
    <button data-pos="leftSide">看侧面</button>
    <button data-pos="back">看后面</button>
    <button data-pos="bottom">看下面</button>
  </div>
  <script src="./js/test1.js"></script>
</body>
</html>

js实现

  1. 创建场景、相机、光线、渲染器、辅助坐标系
var camera, scene, renderer;

camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(20, 20, 50);

scene = new THREE.Scene();

var environmentLight = new THREE.HemisphereLight(0xffffff, 0x444444);
environmentLight.position.set(0, 0, 1);
scene.add(environmentLight);

// 增加辅助坐标系
var axesHelper = new THREE.AxesHelper(20);
scene.add(axesHelper);

renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
  1. 增加鼠标轨道控制
var control = new THREE.OrbitControls(camera, renderer.domElement);
  1. 页面自适应
// 自适应
window.addEventListener('resize', onResize, false);

function onResize() {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
}
  1. 载入模型
var loader = new THREE.ObjectLoader();
loader.load('./assets/fox/low-poly-fox-by-pixelmannen.json', function (obj) {
  obj.scale.set(0.2, 0.2, 0.2); //调整模型大小
  obj.rotation.y = Math.PI; //调整模型角度
  scene.add(obj)
})
  1. 渲染
function animate() {
  requestAnimationFrame(animate);
  TWEEN.update();  //这边要增加补间动画,用于实现视角切换功能
  renderer.render(scene, camera);
}

animate();
  1. 缓存不同方位摄像机所处的位置,绑定点击事件,封装摄像机切换位置的方法
// 视角摄像机位置
var pos = {
  front: {
    cameraPos: {
      x: 0,
      y: 20,
      z: 50
    },
    targetPos: {
      x: 0,
      y: 0,
      z: 0
    }
  },
  leftSide: {
    cameraPos: {
      x: 50,
      y: 20,
      z: 0
    },
    targetPos: {
      x: 0,
      y: 0,
      z: 0
    }
  },
  back: {
    cameraPos: {
      x: 0,
      y: 20,
      z: -50
    },
    targetPos: {
      x: 0,
      y: 0,
      z: 0
    }
  },
  bottom: {
    cameraPos: {
      x: 0,
      y: -50,
      z: 20
    },
    targetPos: {
      x: 0,
      y: 0,
      z: 0
    }
  }
}

$('.btns').on('click', 'button', function (e) {
  var targetPos = pos[$(this).data('pos')];
  animateCamera(camera.position, targetPos.cameraPos, control.target, targetPos.targetPos);
});

function animateCamera(current1, target1, current2, target2) {
  var obj = {
    x1: current1.x, // 相机当前位置x
    y1: current1.y, // 相机当前位置y
    z1: current1.z, // 相机当前位置z
    x2: current2.x, // 控制当前的中心点x
    y2: current2.y, // 控制当前的中心点y
    z2: current2.z // 控制当前的中心点z
  }
  var tween = new TWEEN.Tween(obj);
  tween.to({
    x1: target1.x, // 新的相机位置x
    y1: target1.y, // 新的相机位置y
    z1: target1.z, // 新的相机位置z
    x2: target2.x, // 新的控制中心点位置x
    y2: target2.y, // 新的控制中心点位置x
    z2: target2.z // 新的控制中心点位置x
  }, 1000);
  tween.onUpdate(function () {
    camera.position.x = obj.x1;
    camera.position.y = obj.y1;
    camera.position.z = obj.z1;
    control.target.x = obj.x2;
    control.target.y = obj.y2;
    control.target.z = obj.z2;
    control.update();
  })
  tween.onComplete(function () {
    control.enabled = true;
  })
  tween.easing(TWEEN.Easing.Cubic.InOut);
  tween.start();
}

至此,一个简单的三维模型展示页面就开发完毕了,有问题欢迎拍砖交流!

附上源码,比较乱,但是可以跑。。。
链接: pan.baidu.com/s/10xWBoM0R… 密码:eme5