【Threejs】相机控制器动画

使用场景

官方提供了一个基于目标点、刷新速度,在每次renderer中执行的动画,但实际开发中你可能会需要基于设定时间、目标点添加动画,并且有更多自定义成分的方式

获取当前状态下控制器和相机的姿态

javascript 复制代码
  getVisionCof() {
    let { controls } = this//当前场景的控制器
    console.log(controls);

    const currentCamera = controls.object; // 当前控制器的相机
    const target = controls.target; // 当前控制器的目标点
    // 获取相机的位置
    const position = currentCamera.position.clone();

    // 获取相机的旋转(四元数)
    const rotation = currentCamera.quaternion.clone();

    return { position, rotation, target }
  }

改变当前控制器和相机姿态

javascript 复制代码
 setCameraPose(defaultVision, duration = 5000) {
  //defaultVision就是上面获取姿态的返回值
    const controls = this.controls;//这里涉及到相机切换 不过和动画没关系,用你的control就行
    if (!controls) return;

    const camera = controls.object; // 当前控制器的相机
    let { position, rotation, target } = defaultVision
    camera.position.set(position.x, position.y, position.z)
    if (target) {
      controls.target.set(target.x, target.y, target.z)
    } else {
      camera.rotation.set(rotation.x, rotation.y, rotation.z)
    }

    this.dispatchEvent({ type: "viewChange", message: null })
  }

相机动画方式移动

javascript 复制代码
 lerpCameraPose(defaultVision, duration = 500) {
 //defaultVision就是上面获取姿态的返回值
    const controls = this.controls;
    if (!controls) return;

    const camera = controls.object; // 当前控制器的相机
    let { position, rotation, target } = defaultVision;
    const startPosition = {
      x: camera.position.x,
      y: camera.position.y,
      z: camera.position.z,
    }

    const anim = new Anim(
      startPosition, position,
      {
        duration: duration,
        easingFunction: Anim.easeInOutQuad,
        onUpdate: (updated) => {

          console.log(updated);

          camera.position.set(updated.x, updated.y, updated.z)
          if (target) {
            controls.target.set(target.x, target.y, target.z)
          } else {
            camera.rotation.set(rotation.x, rotation.y, rotation.z)
          }
        },
        onComplete: () => {
          if (target) {
            controls.target.set(target.x, target.y, target.z)
          }

        }
      }
    )
    anim.start()

    this.dispatchEvent({ type: "viewChange", message: null })
  }

Anim插件

这是一个无需配置的类似TWEEN的class,不需要任何参数,开箱即用。
鸢--------js自定义简易动画库.2014.3001.5502

相关推荐
kyriewen6 分钟前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
用户938515635071 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
油丶酸萝卜别吃2 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang2 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方2 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript
汉堡大王95273 小时前
Vue 3 + TS + Element Plus 实战:如何从零搭建企业级违章记录管理 SaaS 前端
前端·javascript·vue.js
海天鹰3 小时前
屏幕颜色检测
javascript·html5
用户7917286761974 小时前
opencode-plugin-peers完全指南:OpenCode如何实现 Claude Code式跨会话消息
javascript
andr_gale6 小时前
02_uniapp自定义上凸效果的底部TabBar
前端·javascript·uni-app·移动端
倾听醉梦语7 小时前
React/Vite/Next.js 前端开发工具 SpotPatch:点击页面元素精准定位 JSX/TSX 源码
javascript·react·ai编程·vite·next.js·前端开发工具