【微信小程序】小程序加载外部模型后对模型进行平移旋转操作

405 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

一、效果展示

需要实现的功能,对已经加载进小程序里的模型进行沿着xyz轴方向去旋转和平移。

如下图的效果: 点击底部的按钮,对模型进行平移和旋转操作。

20210706221731820.gif

二、方法描述

关于平移和旋转的方法 比如沿着 Y 轴平移,就是 translateY, 沿着 Z 轴平移,就是 translateZ, 沿着 X 轴平移,就是 translateX

绕着 Y 轴旋转,就是 rotateY, 绕着 Z 轴旋转,就是 rotateZ, 绕着 X 轴旋转,就是 rotateX,

而我们要做到整个视觉上整个模型都在平移和旋转,就需要对摄像机进行平移和旋转操作。

三、步骤概述

(1)在加载完模型的基础上,将摄像机放入一个三维物体里,对此三维物体进行平移和旋转。不直接操作摄像机的原因是,我们最终要将视角复位到没有旋转前的操作。(点击查看上一篇如何加载外部 3d加载模型

//设置相机
let camera = new THREE.PerspectiveCamera(45, canvas.width / canvas.height, 0.25, 100);
camera.position.set(0, 4, 15);
camera.lookAt(new THREE.Vector3(0, 0, 0));
scene = new THREE.Scene();

//将相机放一个三维物体里
let camera_parent = new THREE.Object3D(); 
camera_parent.position.set(0, 0, 0);
camera_parent.add(camera);
scene.add(camera_parent);

(2)平移和旋转的操作 用一变量存平移了多少,此变量用于最后复位。使用 translateY 方法,将放摄像机的三维物体进行上下平移。 再用一变量存旋转了多少,此变量用于最后复位时。使用 rotateX 方法,将放摄像机的三维物体进行上下旋转。 注意:得保证模型的 z 轴是垂直于屏幕, x 和 y 轴是位于屏幕且垂直于 z 轴的,,才能做到,上下左右移动和上下左右旋转,否则就会偏斜。

① 查看 xyz 轴的标线

//  查看 xyz 轴的标线
var axes = new THREE.AxisHelper(30);
scene.add(axes);

② 单击 上下平移

 // 单击 上下平移
  translateUpDown: function (event) {
    var type = event.currentTarget.dataset.index;
    if (type == "0") {
      camera_parent.translateY(-1);//沿着y轴正方向平移
      tranAngleUpDown = tranAngleUpDown + 1;
    } else {
      camera_parent.translateY(1);//沿着y轴反方向平移
      tranAngleUpDown = tranAngleUpDown - 1;
    }
  },

③ 单击 上下旋转

//单击 上下旋转
 rotateUpDown: function (event) {
    var type = event.currentTarget.dataset.index;
    if (type == "0") {
      camera_parent.rotateY((5 / 180) * Math.PI); //向上旋转
      angleUpDown = angleUpDown - (5 / 180) * Math.PI;
    } else {
      camera_parent.rotateX(-(5 / 180) * Math.PI); //向下旋转
      angleUpDown = angleUpDown + (5 / 180) * Math.PI;
    }
  },

④ 长按进行连续旋转以及连续平移


 // 长按连续旋转
  rotateAnimate: function (event) {
    this.setData({
      iconShow: 1
    })
    let that = this;
    var type = event.currentTarget.dataset.index;
    if (type == "0") {
      camera_parent.rotateY((5 / 180) * Math.PI); //向左旋转
      angle = angle - (5 / 180) * Math.PI;
    } else {
      camera_parent.rotateY(-(5 / 180) * Math.PI); //向右旋转
      angle = angle + (5 / 180) * Math.PI;
    }

    let timerAnimate = setTimeout(function () {
      that.rotateAnimate(event);
    }, 100)

    //触摸停止,清除
    if (that.data.touchEnd == 0) {
      clearTimeout(timerAnimate);
    }

  },

完毕~