Three.js 开发机房(一)

说两句题外话,这两天之前的项目终于有阶段性的胜利了,终于能有点时间总结与下这个项目中用到的东西了,之前四月就准备将Three.js开发机房的案例记录一下,怎奈天不随人愿,刚准备开始写这块东西项目据开始了,然后就开始了昏天黑地的开发,一天天累的狗一样,废话少说,开工

----------------------------------------------------------------------------------------------------------------

在用Three.js之前,我们需要知道啥东西是Three.js

  Three.js是一套基于WebGL的库,封装了一些3D渲染需求中重要的工具方法与渲染循环。WebGL门槛相对较高,Three.js对WebGL提供的接

口进行了非常好的封装,简化了很多细节,大大降低了学习成本;

  先从官网下载Three.js及一些工具js,然后通过script引入,我市将Three.js集成到Vue中进行开发,以下代码都以Vue开发环境为基础进行介绍。

1、安装Vue脚手架,不清楚的可以去看看我的Vue中的几篇博文;此处不做过多的介绍

2、安装Three.js,打开终端输入

npm install three.js --save-dev

  等待安装完成就可以开搞了。

首先我们需要熟悉一下几个知识点:

  a: Three.js所渲染的场景、相机、灯光都需要我们自己配置;

  b: 我们在Three.js中看到我们创建的模型旋转其实并不是模型在旋转,而是我们的视角在旋转,就像我们围着看一盆花,当我们围着一盆花转时,当我们把自己的位置看作相对静止,看到的其实就是花盆在转;

  c: 三角函数(手动狗头)

那就开搞吧,我们在Vue的脚手架内进行开发,所以可以美美哒使用ES6的一些特性,比如Class,

import * as THREE from 'three';   // 加载 Three.js 库文件
import * as TWEEN from 'tween';   // 加载Three.js 轨迹插件
import Detector from "/static/js/libs/Detector.js";   //  加载 WebGl 探测器
import { OrbitControls } from "/static/js/control/OrbitControls";   // 加载Three.jskognzhiq

import THREEBSP from "/static/js/libs/ThreeBSP";  // 加载模型裁切函数

class DrawHouse{
      /**
    * 构造方法初始化
    * @param { 绘制对象 } el 
    * @param { 绘制对象距离屏幕左边的距离 } canvas_left 
    * @param { 绘制对象距离屏幕顶部的距离 } canvas_top
    * @param { 展现平台 } platform 
    * @param { 返回函数 } callback 
    */

    constructor(el, canvas_left, canvas_top, platform, callback){
    this.el = el    
    this.camear__x = 0 ; 
    this.camear__y = 1500; 
    this.camear__z = 0;
    this.initLen = 1500;
} }

  

  3、首先我们初始化场景:

/**
  * 初始化场景
  */
cerateScene() {   this.scene = new THREE.Scene(); }

  4、然后初始化相机(也就是我们的眼睛)

 /**
   * 初始化相机
   */
createCamear() {
  this.camera = new THREE.PerspectiveCamera(45, this.el.offsetWidth / this.el.offsetHeight, 1, 10000);
  this.camera.position.set(this.camear__x, this.camear__y, this.camear__z);
  var target = new THREE.Vector3();
  this.camera.lookAt(target);
  this.camera.fov = 50;
}

  这里相机使用的是透视相机:PerspectiveCamera,该类型的相机使用透视矩阵;这个投影模式模拟人类视角。三维空间渲染中最常见的投影模式。

PerspectiveCamera有几个重要参数:fov, aspect, near, far;

Fov – 相机的视锥体的垂直视野角

Aspect – 相机视锥体的长宽比

Near – 相机视锥体的近平面

Far – 相机视锥体的远平面

 其他参数后面 的专题中在介绍;

5、初始化光源,这里我们用的平行光源(点光源不适合这种场景)

/**
  * 初始化光源
  */
createLight() {
    // 设置环境光
    var ambientLight = new THREE.AmbientLight(0x606060);
    this.scene.add(ambientLight);
    // 设置平行光
    var directionalLight = new THREE.DirectionalLight(0xffffff);
    directionalLight.position.set(1, 0.75, 0.5).normalize();
    this.scene.add(directionalLight);
}

  6、初始化渲染器

createRenderer() {
    /**
       * WebGLRenderer
       * antialias 抗锯齿,平滑,默认false
       * alpha 画布是否包含透明缓冲区,默认false
       * gammaInput: Boolean 所有的纹理和颜色预乘伽马,默认false
       * gammaOutput: Boolean 需要以预乘的伽马输出,默认false
       * shadowMap: 属性有enabled(默认false)/autoUpdate(默认true)/needsUpdate(默认false)/type(默认 THREE.PCFShadowMap)
       * setPixelRatio(value) 设置设备像素比
       * setSize(width, height) 设置渲染器的范围
       * setClearColor(color,alpha) 设置渲染的环境的颜色
       */
    this.renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
    });
    this.renderer.setPixelRatio(window.devicePixelRatio);
    this.renderer.setSize(this.el.offsetWidth, this.el.offsetHeight);

    this.renderer.setClearColor(0XFFFFFF, 0);

    this.el.innerHTML = "";
    this.el.appendChild(this.renderer.domElement);
    this.container__W = this.el.offsetWidth;
    this.container__H = this.el.offsetHeight;

    this.renderer.gammaInput = true;
    this.renderer.gammaOutput = true;

    this.renderer.shadowMap.enabled = true;
}         

  7、初始化FPS函数

/**
  * 初始化FPS函数
  */

animate() {
    let _self = this;
    requestAnimationFrame(_self.animate.bind(this));
    this.render();
    TWEEN.update();
}
/**
  * 定义FPS函数执行的内容
  */
render() {
   // 此处使用requestAnimationFrame 函数进行即时刷新,由于这个项目无需每秒60帧的刷新频率,所以我将刷新频率调整到20帧每秒 if (this.renderer && this.controlRender % 3 == 0) { this.renderer.render(this.scene, this.camera); if (this.angleCallback != "") { var dir = new THREE.Vector3(-this.camera.position.x, 0, -this.camera.position.z).normalize(); this.roteteAngle = (180 / Math.PI) * Math.atan2(-dir.x, -dir.z); this.angleCallback(this.roteteAngle); } this.controlRender = 0; this.controls.update(); } this.controlRender++; }

  这篇文章没有什么技术点,全部都是底层配置,跟着步骤走就好了。

-------------------------------------------------------------------------------------------------------------

有什么优化意见还请各位大佬提出,小弟也是今年才接触Three.js,经验不足,望指正

 

转载于:https://www.cnblogs.com/teersky/p/11468169.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: three.js是一种用于创建和呈现3D图形的JavaScript库。它使用WebGL技术来实现硬件加速渲染,并且非常适合创建交互式的3D场景。对于创建3D机房场景,我们可以使用three.js来展示机房的各个部分和设备。 首先,我们可以使用three.js创建一个场景,并在其内部添加各种元素,例如机柜、服务器、网络设备等。通过three.js的3D坐标系,我们可以精确放置和定位每个元素,以便它们在场景中正确地呈现。 接下来,我们可以使用three.js的光照和材质系统来给机房场景添加逼真的光影效果。通过在适当的位置放置光源,我们可以模拟机房内不同灯光的亮度和颜色。同时,我们可以使用各种材质来给每个元素赋予适当的外观和质感,使其看起来更加真实。 此外,我们可以借助three.js的动画功能来创建机房环境中的动态效果。例如,我们可以让风扇旋转、数据线闪烁或者服务器指示灯闪烁等。利用three.js的动画功能,我们可以为机房场景添加更多的生动感和交互性。 最后,我们可以结合three.js的控制器和交互功能来实现用户与机房场景的互动。通过添加旋转、缩放和平移等交互式控制器,用户可以自由地浏览和探索机房的各个角落。此外,我们还可以添加鼠标点击和触摸事件,以便用户可以与元素进行交互,例如点击服务器获取详细信息或者切换设备状态等。 总之,使用three.js可以轻松地创建一个3D机房场景,以展示机房设备和环境。通过其丰富的功能和易于使用的接口,我们可以打造一个逼真、交互性强的3D机房展示应用。 ### 回答2: three.js是一款开源的JavaScript 3D图形库,可用于创建Web上的交互式3D场景。通过使用three.js,我们可以很容易地在网页上创建一个虚拟的3D机房。 首先,我们需要使用three.js创建一个3D场景。我们可以设置一个适应页面大小的渲染器,并创建一个相机和光源,以便在场景中投射阴影和照明。然后,我们可以通过加载3D模型文件或手动创建物体来创建机房中的各种设备和家具。 在机房的设计中,我们可以添加机柜、服务器、交换机、路由器、电视屏幕等设备。我们可以使用three.js提供的几何体对象或者加载外部的3D模型文件,将它们添加到场景中,并设置各种材质和纹理以使它们更加逼真。 除了设备和家具外,我们还可以添加交互元素,例如按钮、滑块和下拉菜单,以控制机房内的设备或演示不同的场景。我们可以使用three.js提供的鼠标和键盘事件来监听用户的交互动作,并通过相应的代码控制场景中的元素。 最后,我们可以为机房中的设备和家具创建动画效果。在three.js中,我们可以通过改变物体的位置、旋转和缩放来实现动画效果。我们可以为设备的运行状态创建动画,并使用three.js的渐变和缓动函数来实现平滑过渡效果。 通过使用three.js创建一个3D机房,我们可以在网页上以全新的方式展示和交互机房设计。用户可以通过鼠标和键盘控制设备、改变场景,并观察设备的运行状态。three.js提供了丰富的功能和易用的API,使得创建和展示3D机房设计变得简单而有趣。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值