Three.js

是什么

三维引擎

WebGL(Web图形库)是一个JavaScript API,可在任何兼容的Web浏览器中渲染高性能的交互式3D和2D图形,而无需使用插件。WebGL通过引入一个与OpenGL ES 2.0非常一致的API来做到这一点,该API可以在HTML5 <canvas>元素中使用。 这种一致性使API可以利用用户设备提供的硬件图形加速。

目前支持 WebGL 的浏览器有:Firefox 4+, Google Chrome 9+, Opera 12+, Safari 5.1+, Internet Explorer 11+和Microsoft Edge build 10240+;然而, WebGL一些特性也需要用户的硬件设备支持。

Three.js是 WebGL的第三方库(Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。)

JavaScript 3D library
The aim of the project is to create an easy to use, lightweight, cross-browser, general purpose 3D library. The current builds only include a WebGL renderer but WebGPU (experimental), SVG and CSS3D renderers are also available in the examples.

做什么

Web3D应用

  1. 物联网3D可视化
    http://www.yanhuangxueyuan.com/3D/liangcang/index.html

    image.png

  2. 产品720在线预览


    image.png
  3. 数据可视化


    image.png

4.H5/微信小游戏
跳一跳


image.png
  1. 科教领域
    http://www.yanhuangxueyuan.com/3D/solarSystem/index.html

6.机械
http://www.yanhuangxueyuan.com/3D/jixiezhuangpei/index.html

  1. WebVR
    如果你想预览一些VR内容,完全可以不下载一个VR相关的APP,通过threejs引擎实现VR内容发布,然后用户直接通过微信等社交方式推广,直接打开VR内容链接就可以观看。
    VR与Web3D技术结合自然就衍生出来一个新的概念WebVR,也就是基于Web实现的VR内容。

  2. 家装室内设计
    http://www.yanhuangxueyuan.com/3D/houseDesign/index.html

怎么做

  1. 坐标系
    three.js中我们要打交道的是三维坐标系
    他的坐标原点就是(0, 0, 0), 绘制一条起点为中心点的长度为1的线段可以是 (0, 0, 0) (1, 0, 0)
    这里要记住, three.js里面设置的默认坐标系就是这种形式x向右, y向上, z向前
    image.png

    上图中, 观看这个三维坐标系的目光其实是在斜上方, 正常情况下在我们开发的时候z轴是正对着我们的眼睛的, 所以你只能看到z轴是一个点。

2.相机camera
假设现在我们的正前方有一个三维坐标系的全息投影, 那么此时你的眼睛就相当于一架相机, 你看到的 坐标系景象取决于你站的位置。
three.js中就有这样一个对象, 他就是负责从哪个角度观察我们绘制的3d世界, 也就是相机这个概念的由来。
相机分为两种, 正投影相机和透视投影相机, 正投影相机就是你站的多远你看到的物体的大小都不变, 透视投影相机就是物体会近大远小。

Hello world
第一步:创建场景, 也就是虚拟的空间
第二步:创建相机(视角,近平面,远平面-无法看见)
第三步:生成渲染实例
第四步:插入坐标系实例(辅助线)
第五步:渲染出来


QQ20210414-142507-HD(1).gif
image.png
image.png
        // 创建一个场景
        const scene = new THREE.Scene();
        // 创建一个具有透视效果的相机
        const camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 1000);
        // 设置视点位置
        camera.position.z = 10;
        // camera.position.set(2, 2, 10)

        // 创建一个 WebGL 渲染器,Three.js 还提供 <canvas>, <svg>, CSS3D 渲染器
        const renderer = new THREE.WebGLRenderer();
        // 设置渲染器的尺寸,颜色
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0x00FFFF, .5)
        // 将渲染器的输出(此处是 canvas 元素)插入到 body 中
        document.getElementById("three").appendChild(renderer.domElement);

        //增加辅助线
        const axisHelper = new THREE.AxisHelper(2);
        scene.add(axisHelper);

        //光源
        const ambientLight = new THREE.AmbientLight(0xffffff);
        scene.add(ambientLight);

        //创建一个几何体
        const geometry = new THREE.BoxGeometry(1, 2, 3);
        //创建一个材质
        const material = new THREE.MeshBasicMaterial({ color: 'grey' });
        // 创建一个网格:将材质包裹在几何体上
        const cube = new THREE.Mesh(geometry, material);
        //将mesh添加到场景中
        scene.add(cube);

        //动画
        const tween = new TWEEN.Tween(camera.position).to({
            x: 10,
            y: 10
        }, 4000).repeat(Infinity).start()
        const animate = function () {
            TWEEN.update()
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
        }
        animate();

地球


image.png
        // 创建一个场景
        const scene = new THREE.Scene();
        // 创建一个具有透视效果的摄像机
        const camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 1000);
        camera.position.z = 10;
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0x00FFFF, .5)
        document.getElementById("three").appendChild(renderer.domElement);
        const AxesHelper = new THREE.AxesHelper(2);
        scene.add(AxesHelper)

        //光源
        const ambientLight = new THREE.AmbientLight(0xffffff);
        scene.add(ambientLight);

        //轨道控制
        const os = new OrbitControls(camera, renderer.domElement);
        os.target = new THREE.Vector3(0, 0, 0); //控制焦点
        os.autoRotate = false; //将自动旋转关闭
        os.enablePan = false; // 不禁止鼠标平移, 可以用键盘来平移
        os.maxDistance = 1000; // 最大外移动
        os.minDistance = 100; // 向内最小外移动
        this.orbitControls = os;


        // 为物体增加材质
        const loader = new THREE.TextureLoader();
        loader.load(
            require("../../source/images/地图.png"),
            (texture) => {
                const geometry = new THREE.SphereGeometry(10, 32, 32);
                const material = new THREE.MeshLambertMaterial({
                    map: texture
                })
                // 加入纹理
                const mesh = new THREE.Mesh(geometry, material)
                // 放入几何
                scene.add(mesh);
            },
            (xhr) => {
                // 进度(已废弃)
                console.log(`${xhr.loaded / xhr.total * 100}%`)
            },
            (err) => {
                // 错误
                console.log(err)
            }
        )

        const animate = function () {
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
        };
        animate();
QQ20210414-142507-HD(1).gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 1、简介 WebGL 是在浏览器中实现三维效果的一套规范,而 Three.js 可以看成是浏览器对 WebGL 规...
    风之化身呀阅读 3,505评论 0 4
  • 简介 Three.js是基于原生WebGL封装运行的三维引擎。可与各种前端技术结合使用。 github链接:Git...
    田苗苗_7785阅读 2,049评论 0 0
  • 学习目标 熟悉并掌握Three.js中的基本概念,主要包括场景,摄像机,灯光,渲染器,物体对象,几何体,材质,动画...
    田苗苗_7785阅读 1,805评论 2 8
  • Three.js是一款开源的主流3D绘图JS引擎(名字Three就是3D的含义),原作者为Mr.Doob,项目地址...
    宋小菜_菜菜阅读 1,952评论 0 1
  • three之前的准备 three.js是webGL的一个高级工具集,webGL则是从openGL ES 发展而来的...
    琙灵阅读 1,658评论 0 2