Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Three.js快速入门

  • 2.几何体BufferGeometry

  • 3.模型对象、材质

  • 4.层级模型

  • 5.顶点UV坐标、纹理贴图

  • 6.加载外部三维模型(gltf)

  • 7.PBR材质与纹理贴图

  • 8.渲染器和前端UI界面

  • 9.生成曲线、几何体

  • 10.相机基础

    • 1. 正投影相机
    • 2. 正投影相机-Canvas尺寸变化
    • 3. 包围盒Box3
    • 4. 地图案例(包围盒、正投影)
      • 5. 相机动画(.position和.lookAt())
      • 6. 不同方向的投影视图
      • 7. 旋转渲染结果(.up相机上方向)
      • 8. 管道漫游案例
      • 9. OrbitControls旋转缩放限制
      • 10. 相机控件MapControls
    • 11.光源和阴影

    • 12.精灵模型Sprite

    • 13.后处理EffectComposer

    • 14.射线拾取模型

    • 15.场景标注标签信息

    • 16.关键帧动画

    • 17.动画库tween.js

    • Three.js教程
    • 10.相机基础
    郭隆邦
    2023-02-11
    目录

    4. 地图案例(包围盒、正投影)

    # 地图案例(包围盒、正投影)

    地图案例会涉及到几何体、包围盒、正投影相机三方面知识点。

    • 平面填充几何体ShapeGeometry
    • 包围盒Box3
    • 正投影相机OrthographicCamera

    # ShapeGeometry渲染河南省地图轮廓

    const data = [// 河南边界轮廓边界经纬度坐标
      [110.3906, 34.585],
      [110.8301, 34.6289],
      ...
      ...
      [111.7969, 35.0684]
    ]
    const pointsArr = [];// 一组二维向量表示一个多边形轮廓坐标
    data.forEach(function(e){
        // data坐标数据转化为Vector2构成的顶点数组
        const v2 = new THREE.Vector2(e[0],e[1])
        pointsArr.push(v2);
    })
    // Shape表示一个平面多边形轮廓,参数是二维向量构成的数组pointsArr
    const shape = new THREE.Shape(pointsArr);
    // 多边形shape轮廓作为ShapeGeometry参数,生成一个多边形平面几何体
    const geometry = new THREE.ShapeGeometry(shape);
    

    # 选择相机

    地图案例可以不使用透视投影相机模拟人眼的透视观察效果,选择正投影相机即可。

    // 正投影相机
    const width = window.innerWidth; //canvas画布宽度
    const height = window.innerHeight; //canvas画布高度
    const k = width / height; //canvas画布宽高比
    const s = 50; //控制left, right, top, bottom范围大小
    const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 8000);
    camera.position.set(300, 300, 300); 
    camera.lookAt(0, 0, 0); //指向坐标原点
    

    使用上面相机参数,默认情况下,你运行案例源码,可以看到河南地图并没有居中显示,在canvas画布上显示的效果也比较小。

    如果你想地图全屏最大化居中显示,可以通过包围盒来辅助设置计算参数。

    # 包围盒Box3计算模型的中心位置和尺寸

    包围盒Box3计算模型的中心位置和尺寸。

    // 包围盒计算模型对象的大小和位置
    const box3 = new THREE.Box3();
    box3.expandByObject(mesh); // 计算模型包围盒
    const size = new THREE.Vector3();
    box3.getSize(size); // 计算包围盒尺寸
    // console.log('模型包围盒尺寸',size);
    const center = new THREE.Vector3();
    box3.getCenter(center); // 计算包围盒中心坐标
    // console.log('模型中心坐标',center);
    

    # 地图居中显示

    设置相机.lookAt()参数指向包围盒几何中心即可。

    const x = 113.51,y = 33.88;
    camera.lookAt(x, y, 0);
    

    注意如果使用了OrbitControls,需要设置.target和.lookAt()参数是相同坐标。

    const controls = new OrbitControls(camera, renderer.domElement);
    controls.target.set(x, y, 0); //与lookAt参数保持一致
    controls.update();//update()函数内会执行camera.lookAt(controls.target)
    

    # 地图基本填充cnavas画布

    地图显示效果更大,尽量使地图基本填充整个canvas画布。

    把正投影相机控制上下左右的变量s,设置为地图模型整体尺寸的一半左右即可。

    // const s = 50; //控制left, right, top, bottom范围大小
    const s = 2.5;//根据包围盒大小调整s,包围盒y方向尺寸的一半左右
    const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 8000);
    

    # 地图平行于canvas画布

    把相机的位置和观察目标的xy坐标设置为一样,这样相机的视线方向就垂直地图平面,这样地图就平行于canvas画布,或者说平行于显示器屏幕。

    const x = 113.51,y = 33.88;
    //与观察点x、y一样,地图平行与canvas画布
    camera.position.set(x, y, 300);
    camera.lookAt(x, y, 0);
    
    3. 包围盒Box3
    5. 相机动画(.position和.lookAt())

    ← 3. 包围盒Box3 5. 相机动画(.position和.lookAt())→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式