基于threejs,完成一个简单的全景图播放器

直接上代码

CameraControls.js相机控制器

import * as THREE from 'three';

function CameraControls(object, domElement, cb, update) {
  this.object = object;

  this.domElement = domElement !== undefined ? domElement : document;

  this.enabled = true;

  this.lookSpeed = 0.1;

  this.activeLook = true;

  this.cameraFov = object.fov;

  this.minPolarAngle = 0; // radians

  this.maxPolarAngle = Math.PI; // radians

  this.minAzimuthAngle = -Infinity; // radians

  this.maxAzimuthAngle = Infinity; // radians

  const lookDirection = new THREE.Vector3();

  const target = new THREE.Vector3();

  const near = 40; //最小范围

  const far = object.fov; //最大范围

  // 只要无状态和旋转的两个状态。

  const STATE = {
    NONE: -1,

    ROTATE: 0,
  };

  let state = STATE.NONE;

  const rotateStart = new THREE.Vector2();

  const rotateEnd = new THREE.Vector2();

  const rotateDelta = new THREE.Vector2();

  const spherical = new THREE.Spherical();

  const sphericalDelta = new THREE.Spherical(); // 球面

  function rotateLeft(angle) {
    sphericalDelta.theta -= angle;
  }

  function rotateUp(angle) {
    sphericalDelta.phi += angle;
  }

  this.handleMouseDownRotate = function (event) {
    rotateStart.set(event.clientX, event.clientY);
  };

  this.handleMouseMoveRotate = function (event) {
    rotateEnd.set(event.clientX, event.clientY);

    rotateDelta

      .subVectors(rotateEnd, rotateStart)

      .multiplyScalar(this.lookSpeed);

    const element = this.domElement === document ? this.domElement.body : this.domElement;

    rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height

    rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight);

    rotateStart.copy(rotateEnd);

    if (cb) cb();

    this.update();
  };

  //鼠标按下执行的事件

  this.onMouseDown = function (event) {
    if (this.enabled === false) return;

    event.preventDefault();

    event.stopPropagation();

    if (this.domElement !== d
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值