最近公司需要用tree.js实现一个3D图的显示,就看了官方文档,正好有时间,就记录下来。

由于我们公司的前端框架用的是angular,所以我就把我的treejs封装在一个directives里面。后面放源码

首先我们要知道three.js的下载地址它的地址是: https://github.com/mrdoob/three.js

其次,什么是three.js?

three.js的几个步骤:

1:引入three.js文件(打开调试窗口,并在Console下输入 THREE.REVISION命令,得到版本号,成功)

2:设置一个场景//var scene = new THREE.Scene();

3:var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);设置一个透视相机
4:var renderer = new THREE.WebGLRenderer();   renderer.setSize(window.innerWidth, window.innerHeight); 设置一个渲染器

5:把一个物体添加到场景中

modelUrl是所添加文件例如:

$scope.DView = cy3DView.newCanvas; $scope.DView.config('canvas')

  1. $scope.process3DUrl = data.result.data.engineering_stl_mcube; $scope.DView.plan($scope.process3DUrl)
  1. function plan(modelUrl) {
    stlLoader = new THREE.STLLoader();
    group = new THREE.Object3D();
    stlLoader.load(modelUrl, function (geometry) {
    //console.log(geometry);
    var mat = new THREE.MeshLambertMaterial({color: 0x7777ff});
    group = new THREE.Mesh(geometry, mat);
    group.rotation.x = -0.5 * Math.PI;
    group.scale.set(0.6, 0.6, 0.6);
    scene.add(group); animation();
    }); }

6:渲染

renderer.render(scene, camera);

ok 是不是很简单,个人认为是这样,没有看懂的小伙伴可以私信我哦

源码如下:

  1. (function (window, document) {
    'use strict';
    var three = window.THREE;
    var angular = window.angular;
    angular.module('cy-3D-view', []).factory('cy3DView', cy3DView);
    cy3DView.$inject = ['$rootScope'];
    function cy3DView($rootScope) {
    return {
    newCanvas: new Object(newCanvas($rootScope))
    }; }
    function newCanvas() {
    var scene, camera, renderer,controls,group,ambient,fov,near,far,stlLoader;
    var width, height,keyLight,fillLight,backLight,spotLight,lighting;
    function config() { //设置3D图的宽和高
    width = document.getElementById('canvas').clientWidth;
    height = document.getElementById('canvas').clientHeight;
    renderer = new THREE.WebGLRenderer({
    antialias: true
    });
    renderer.setSize(width, height);
    renderer.shadowMapEnabled = true;
         document.getElementById('canvas').appendChild(renderer.domElement);
    renderer.setClearColor(0xFFFFFF, 1.0);
    scene = new THREE.Scene();
    lighting = false; //设置3D图的颜色
    ambient = new THREE.AmbientLight(0xffffff, 1.0);
    scene.add(ambient);
    keyLight = new THREE.DirectionalLight(new THREE.Color('hsl(30, 100%, 75%)'), 1.0);
    keyLight.position.set(-100, 0, 100);
    fillLight = new THREE.DirectionalLight(new THREE.Color('hsl(240, 100%, 75%)'), 0.75);
    fillLight.position.set(100, 0, 100);
    backLight = new THREE.DirectionalLight(0xffffff, 1.0);
    backLight.position.set(100, 0, -100).normalize();
    spotLight = new THREE.SpotLight(0xffffff);
    spotLight.position.set(150, 150, 150);
    scene.add(spotLight); //照相机配置
    fov = 40;
    near = 1;
    far = 1000;
    camera = new THREE.PerspectiveCamera(fov, width / height, near, far);
    camera.position.x = 150
    camera.position.y = 150;
    camera.position.z = 150;
    camera.lookAt({
    x : 0,
    y : 0,
    z : 0
    });
    camera.lookAt(new THREE.Vector3(0, 40, 0));
    controls = new THREE.OrbitControls(camera, renderer.domElement);
    controls.enableDamping = true;
    controls.dampingFactor = 0.25;
    controls.enableZoom = false;
    window.addEventListener('resize', onWindowResize, false);
    window.addEventListener('keydown', onKeyboardEvent, false);
    window.addEventListener('mousewheel', mousewheel, false); }
    function mousewheel(e) {
    e.preventDefault();
    if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
    if (e.wheelDelta > 0) { //当滑轮向上滚动时
    fov -= (near < fov ? 1 : 0); }
    if (e.wheelDelta < 0) { //当滑轮向下滚动时
    fov += (fov < far ? 1 : 0); }
    } else if (e.detail) { //Firefox滑轮事件
    if (e.detail > 0) { //当滑轮向上滚动时
    fov -= 1; }
    if (e.detail < 0) { //当滑轮向下滚动时 fov += 1; } }
    camera.fov = fov;
    camera.updateProjectionMatrix();
    renderer.render(scene, camera); }
    function onWindowResize() {
    camera.aspect = width / height;
    camera.updateProjectionMatrix();
    renderer.setSize(width,height); }
    function onKeyboardEvent(e) {
    if (e.code === 'KeyL') {
    lighting = !lighting;
    if (lighting) {
    ambient.intensity = 0.25;
    scene.add(keyLight);
    scene.add(fillLight);
    scene.add(backLight);
    } else {
    ambient.intensity = 1.0;
    scene.remove(keyLight);
    scene.remove(fillLight);
    scene.remove(backLight);
    }
    }
    }
    function plan(modelUrl) {
    stlLoader = new THREE.STLLoader();
    group = new THREE.Object3D();
    stlLoader.load(modelUrl, function (geometry) {
    //console.log(geometry);
    var mat = new THREE.MeshLambertMaterial({color: 0x7777ff});
    group = new THREE.Mesh(geometry, mat);
    group.rotation.x = -0.5 * Math.PI;
    group.scale.set(0.6, 0.6, 0.6);
    scene.add(group);
    animation();
    }); }
    function animation(){
    renderer.render(scene, camera);
    requestAnimationFrame(animation); }
    return {
    config: config,
    plan: plan,
  2.  
  3. };
    } })(window, document);

three.js 入门案例的更多相关文章

  1. C3.js入门案例

    C3.js是基于D3.js开发的JavaScript库,它可以让开发者构建出可复用的图表,并且还提供了一系列图表上的交互行为.通过C3,只需要往generate函数中传入数据对象就可以轻松的绘制出图表 ...

  2. React.js入门小案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  3. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  4. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  5. Node.js 入门手册:那些最流行的 Web 开发框架

    这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...

  6. 【特别推荐】Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  7. node.js(小案例)_实现学生信息增删改

    一.前言 本节内容主要对小案例做一个总结: 1.如何开始搭建小项目 2.路由设计 3.模块应用 4.项目源码以及实现过程github地址: 项目演示如下: 二.主要内容 1.项目的关键性js源码: 项 ...

  8. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

  9. 项目一:项目第二天 Jquery ztree使用展示菜单数据 2、 基础设置需求分析 3、 搭建项目框架环境--ssh(复习) 4、 SpringData-JPA持久层入门案例(重点) 5、 Easyui menubutton菜单按钮使用 6、 Easyui messager消息框使用

    1. Jquery ztree使用展示菜单数据 2. 基础设置需求分析 3. 搭建项目框架环境--ssh(复习) 4. SpringData-JPA持久层入门案例(重点) 5. Easyui menu ...

随机推荐

  1. Hibernate缓存和状态

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.   缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘 ...

  2. Java 银行家算法

    实验存档,代码特别烂.. 测试.java package operating.test; import operating.entity.bank.Bank; import operating.ent ...

  3. 防盗链与token运用

    为什么要防盗链? 例如手机/PC应用,如果有人知道你的api地址,和应用格式,那么他人就可以利用这个接口进行盗链:盗取/盗用里面的数据. 防盗链特性: 1.因为是非开放性的,所以所有的接口都是封闭的, ...

  4. Django2文档-入门概览

    Django 概览 Django 是设计是为了使通用的Web开发任务变得快速而又简单, 一下是如何使用Django编写数据库驱动的Web应用程序的非正式概述. 这个文档的目标是给你足够的技术细节来理解 ...

  5. JMeter常见错误解决方法

    1.Windows 平台,双击 jmeter/bin 目录下 jmeter.bat 文件,jmeter 无法启动且报错如下: 此问题是没有配置 jdk 环境变量所致,配置好 jdk 环境变量即可. 2 ...

  6. badboy 录制脚本并并发脚本

    很久没有研究过接口相关的工具了,一个偶然的机会听说了 badboy,可以录制jemter脚本, 查了资料 还可以并发,于是乎,实践才知道. http://www.badboy.com.au/ 官网,我 ...

  7. 手动编译protobuf3的C++源码

    Windows下编译 官方文档 第三方文档 准备工具 Visual Studio 2013 CMake https://cmake.org/ Git https://git-scm.com/ 需要注意 ...

  8. thinkinginjava学习笔记01_导论

    初学java,希望旅途愉快  :) 类型决定对象的接口,(有人认为类是类型的特定实现),接口确定对象所能发出的请求(消息),满足请求的代码和隐藏的数据一起构成实现: 对象设计时,应该很好地完成一项任务 ...

  9. XUL透明异形旋转窗体

    200行不到的代码,实现透明异形旋转窗体. 下载(25MB): http://oltag.com:8080/yaolixing/18/11/00/OHUIv52.0.1_3_webTrans20180 ...

  10. Fiddler工具的界面说明

    1.Fiddler界面说明 2.session的模块说明 包含部分如下: 注:标蓝色区域的内容为平时较常用的部分 3.session不同图标和不同颜色的含义 默认颜色的含义如下: 部分图标的含义如下: ...