three.js入门 ---- 相机控件OrbitControls

前言:

自用!!!

文档中描述:OrbitControls本质上就是改变相机的参数,比如相机的位置属性,改变相机位置可以改变相机拍照场景中模型的角度,实现模型的360度旋转预览效果,改变透视投影相机距离模型的距离,就可以改变相机能看到的视野范围。

javascript 复制代码
controls.addEventListener("change",function(){
    //浏览器控制台查看相机位置变化
    console.log(camera.position)
})

代码:

function create3D()函数:

javascript 复制代码
function create3D() {
      //创建3D场景
      const scene = new THREE.Scene();
      //创建一个长方体几何对象Geometry
      const geometry = new THREE.BoxGeometry(100, 100, 100);
      //创建一个网络基础材质的材质对象Material (基础网络材质不会收到光照影响)
      const material = new THREE.MeshBasicMaterial({
        color: 0xff0000, //设置材质颜色
        transparent: true, //开启通明
        opacity: 0.5,
      });
      //创建网络模型 ---- 两个参数分别为"几何体","材质"
      const mesh = new THREE.Mesh(geometry, material);
      //定义网络模型在三维场景中的位置
      mesh.position.set(0, 0, 0);
      //将网络模型添加至三维场景中
      scene.add(mesh);
      //定义相机渲染输出的画布尺寸
      const width = 800;
      const height = 500;
      //创建一个透视摄影相机
      const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
      //定义相机的位置
      camera.position.set(300, 300, 300);
      //相机观察的目标位置 ---- 可以是坐标点,也可以是指定物体的位置
      camera.lookAt(mesh.position);
      //创建渲染器对象
      const renderer = new THREE.WebGLRenderer();
      //设置画布尺寸
      renderer.setSize(width, height);
      //渲染器渲染方法 生成一个画布并把三维场景呈现在画布上
      renderer.render(scene, camera);
      //renderer.domElement获取到方法render()生成的画布
      dom.appendChild(renderer.domElement);
      // 设置相机控件轨道控制器OrbitControls
      const controls = new OrbitControls(camera, renderer.domElement);
      // 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景
      controls.addEventListener("change", function () {
        // console.log(camera.position)
        renderer.render(scene, camera); //执行渲染操作
      }); //监听鼠标、键盘事件

three.js ---- 动画渲染循环:

threejs可以借助HTML5的API请求动画帧 window.requestAnimationFrame 实现动画渲染

动画本质:就是一张张照片,连起来依次展示,这样就形成一个动画效果,只要帧率高,人的眼睛就感觉不到卡顿,是连续的视频效果

设置了渲染循环,相机控件OrbitControls就不用再通过事件change执行renderer.render(scene,camera),因为渲染循环一直在执行renderer.render(scene,camera)

javascript 复制代码
    function create3D() {
      //创建3D场景
      const scene = new THREE.Scene();
      //创建一个长方体几何对象Geometry
      const geometry = new THREE.BoxGeometry(100, 100, 100);
      //创建一个网络基础材质的材质对象Material (基础网络材质不会收到光照影响)
      const material = new THREE.MeshBasicMaterial({
        color: 0xff0000, //设置材质颜色
        transparent: true, //开启通明
        opacity: 0.5,
      });
      //创建网络模型 ---- 两个参数分别为"几何体","材质"
      const mesh = new THREE.Mesh(geometry, material);
      //定义网络模型在三维场景中的位置
      mesh.position.set(0, 0, 0);
      //将网络模型添加至三维场景中
      scene.add(mesh);
      //定义相机渲染输出的画布尺寸
      const width = 800;
      const height = 500;
      //创建一个透视摄影相机
      const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
      //定义相机的位置
      camera.position.set(300, 300, 300);
      //相机观察的目标位置 ---- 可以是坐标点,也可以是指定物体的位置
      camera.lookAt(mesh.position);
      //创建渲染器对象
      const renderer = new THREE.WebGLRenderer();
      //设置画布尺寸
      renderer.setSize(width, height);
      //renderer.domElement获取到方法render()生成的画布
      dom.appendChild(renderer.domElement);
      // 设置相机控件轨道控制器OrbitControls
      const controls = new OrbitControls(camera, renderer.domElement);
      function render() {
         //渲染器渲染方法 生成一个画布并把三维场景呈现在画布上
        renderer.render(scene, camera);
        mesh.rotateY(0.01); //每次绕y轴旋转0.01
        requestAnimationFrame(render);
      }
      render();
    }
相关推荐
lialaka13 分钟前
「未来星途(Future_Odyssey)」——全语音_3D_AI_具身交互智能数字教官与全双工星际科普沉浸舱[1]
人工智能·3d·交互
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC10 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn10 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜11 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿11 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen13 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
科技大视界16 小时前
非接触3D形貌测量:按样品类型选设备指南
3d
柒木森17 小时前
AAAI 2026 | Arbi-3DGSR:任意倍率 3D 高斯超分辨率
3d
gis开发之家17 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码