threejs教程(一)

2023-11-10

插件安装

npm i three

项目引入

这里我随便找的VUE项目练习的

import * as THREE from "three";

大致介绍一下threejs的逻辑
一般我们用它是来搭建三维模型的,搭建三维模型就需要的三个要素 场景(scene) 渲染器(renderer) 和相机(camera)
场景简单理解就是唱戏的戏台子
渲染器就是把各种元素渲染在戏台子上
相机就简单了 就是你看戏的角度

搭建一个简单的项目

因为用的vue的框架练手的 所以这里用的是vue模板 (直接看完整代码请拉到最下面)
先弄一个空vue文件

<template>
    <div id="canva">
       
    </div>
</template>
<script>
import * as THREE from "three";

</script>

<style>
    
</style>

然后初始化canvas的三要素 场景(scene) 渲染器(renderer) 和相机(camera)
初始化之前 还需要设置一下canvas的宽高

init: function(){
    //设置canvas场景
    this.initCavasRen()
    //初始化场景
    this.initScene()
    //初始化相机
    this.initCamer()
    //初始化渲染器
    this.initRenderer()
},
initCavasRen: function(){
    this.model_container = document.getElementById("canva");
    this.model_container.style.height = window.innerHeight + "px";
    this.model_container.style.width = window.innerWidth + "px";
    this.height = this.model_container.clientHeight;
    this.width = this.model_container.clientWidth;
},
initScene: function(){
    this.scene = new THREE.Scene()
    //下面是设置场景的六个面  没素材的可以不设置
    // this.scene.background = new THREE.CubeTextureLoader()
    // .setPath( '../../static/textures/cube/skyboxsun25deg/' )
    // .load( [
    // 'px.jpg',
    // 'nx.jpg',
    // 'py.jpg',
    // 'ny.jpg',
    // 'pz.jpg',
    // 'nz.jpg'
    // ] );
},
initCamer: function(){
    this.camera = new THREE.PerspectiveCamera( 75, this.width / this.height, 0.1, 20000 );
    this.camera.position.set(100, 100, 200);
},
initRenderer: function(){
    this.renderer = new THREE.WebGLRenderer({
        antialias: true
    });
    this.renderer.setSize( this.width, this.height );
    this.model_container.appendChild( this.renderer.domElement );
    //阴影
    this.renderer.shadowMap.enabled = true;
    this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
    this.renderer.outputEncoding = THREE.sRGBEncoding;
    this.renderer.setSize(this.width, this.height);

    // 兼容高清屏幕

    this.renderer.setPixelRatio(window.devicePixelRatio);
},
render: function() {
    requestAnimationFrame( this.render );
    this.renderer.render( this.scene, this.camera );
},

最后在mounted里面调用init方法及render方法即可

mounted(){
    this.init()
    this.render()
}

如果步骤没问题的话,就可以看到一个黑色的canvas页面

可能有人会疑惑 这个render方法有啥用呢,你可以理解为页面上的canvas需要不断的更新渲染, 要不然许多动态效果你就看不到了
requestAnimationFrame 这个方法类似于定时器,但是比定时器要好用一点,大家可以百度学习一下

添加页面元素

黑色的页面不好看 我们开始先添加一点辅助元素,把three.js里的空间坐标轴加上来 再添加一个网格当作地面

initHelper: function(){
        // 创建坐标轴对象
        var axes = new THREE.AxesHelper(100);
        //将坐标轴添加进场景
        this.scene.add(axes);
        // 网格辅助线
        let gridHelper = new THREE.GridHelper(400, 20, 0x444444, 0xffffff);
        this.scene.add(gridHelper);
    },

在init()方法里调用这个initHelper即可看到页面为下面这样

在这里插入图片描述

下一篇讲解 添加元素及控制视角旋转

最后附上完整代码

<template>
    <div id="canva">
        
    </div>
</template>

<script>
import * as THREE from 'three'
export default{
    methods:{
        init: function(){
            //设置canvas场景
            this.initCavasRen()
            //初始化场景
            this.initScene()
            //初始化相机
            this.initCamer()
            //初始化渲染器
            this.initRenderer()
            //辅助线
            this.initHelper()
        },
        initCavasRen: function(){
            this.model_container = document.getElementById("canva");
            this.model_container.style.height = window.innerHeight + "px";
            this.model_container.style.width = window.innerWidth + "px";
            this.height = this.model_container.clientHeight;
            this.width = this.model_container.clientWidth;
        },
        initScene: function(){
            this.scene = new THREE.Scene()
            //下面是设置场景的六个面  没素材的可以不设置
            // this.scene.background = new THREE.CubeTextureLoader()
            // .setPath( '../../static/textures/cube/skyboxsun25deg/' )
            // .load( [
            // 'px.jpg',
            // 'nx.jpg',
            // 'py.jpg',
            // 'ny.jpg',
            // 'pz.jpg',
            // 'nz.jpg'
            // ] );
        },
        initCamer: function(){
            this.camera = new THREE.PerspectiveCamera( 75, this.width / this.height, 0.1, 20000 );
            this.camera.position.set(100, 100, 200);
        },
        initRenderer: function(){
            this.renderer = new THREE.WebGLRenderer({
                antialias: true
            });
            this.renderer.setSize( this.width, this.height );
            this.model_container.appendChild( this.renderer.domElement );
            //阴影
            this.renderer.shadowMap.enabled = true;
            this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
            this.renderer.outputEncoding = THREE.sRGBEncoding;
            this.renderer.setSize(this.width, this.height);

            // 兼容高清屏幕

            this.renderer.setPixelRatio(window.devicePixelRatio);
        },
        initHelper: function(){
            // 创建坐标轴对象
            var axes = new THREE.AxesHelper(100);
            //将坐标轴添加进场景
            this.scene.add(axes);
            // 网格辅助线
            let gridHelper = new THREE.GridHelper(400, 20, 0x444444, 0xffffff);
            this.scene.add(gridHelper);
        },
        render: function() {
            requestAnimationFrame( this.render );
            this.renderer.render( this.scene, this.camera );
        },
    },
    mounted(){
        this.init()
        this.render()
    }
}
</script>

<style lang="less">
    
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

threejs教程(一) 的相关文章

  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 为什么 setTimeout 在 Chrome 中触发两次,而在 IE 或 Firefox 中则不然?

    有人能告诉我为什么 javascript 函数 生成新号码 在 Chrome 中触发两次 但在 IE 或 Firefox 中则不会 使用 Chrome 20 0 1132 57 IE9 和 Firefox 13
  • JavaScript 继承;调用和原型

    要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • $resource.query 返回分割字符串(字符数组)而不是字符串

    我正在使用像下面这样的 Angular resource angular module app factory data function resource var Con resource api data update method P
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 使用 Enzyme 测试 `React.createRef` api

    我想测试下面的类 它使用React createRef api 不过 快速搜索并没有发现任何这样做的例子 有人成功过吗 我该如何嘲笑裁判 理想情况下我想使用shallow class Main extends React Component
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 权限设计=功能权限+数据权限

    权限管理 Authority Management 目前主要是通过用户 角色 资源三方面来进行权限的分配 具体来说 就是赋予用户某个角色 角色能访问及操作不同范围的资源 通过建立角色系统 将用户和资源进行分离 来保证权限分配的实施 一般指根
  • 逆向爬虫01 requests模块

    python requests模块 requests是一个python模拟浏览器发送http请求的模块 1 使用requests模块发送get请求 获取网页源代码 import requests url http www baidu com
  • strictfp有什么作用

    关键字 strictfp 是 sitict float point 的缩写 指的是精确浮点 它用来确保浮点数运算的准确性 JVM 在执行浮点数运算时 如果没有指定 strictip 关键字 此时计算结果可能会不精确 而且计算结果在不同平台或
  • 一不小心就弄懂了 冒泡,选择,插入,希尔,归并和快速排序

    今天我们主要看一些简单的排序 常见的时间复杂度 常数阶 1 对数阶 log2n 线性阶 n 线性对数阶 nlog2n 平方阶 n 立方阶 n K次方阶 n k 指数阶 2 n 常见的时间复杂度对应图 1 log2n n nlog2n n n
  • PKU2019暑期学堂 游记

    诈尸写博客QaQ 一塔湖图 Day 0 18 00 从学校出发 with另外三个同学 前往南站 20 20上动车 感觉人好少的样子 房间灯是坏的 还换了一间 在火车上刷知乎 提前体验一下夏令营 而其他人都在弯道QwQ 好多人水群啊QwQ D
  • 新手入门 哪个视频剪辑软件好用

    当下 视频剪辑已成为一种全新记录生活的方式 许多人剪辑视频都是从零基础开始学习 那么从入门开始选择的软件就显得比较重要了 今天在这里给大家推荐一款适合新手入门的视频剪辑软件 会声会影 图1 会声会影软件 会声会影是一款很亲民的视频剪辑软件
  • C语言

    include
  • vue实现页面停留时间统计

    前言 在实际业务中 埋点需求是前端开发中非常重要的数据指标获取的方式之一 今天 主要聊一下页面停留时间的统计 简略版 每个页面独自实现相关统计 并上报数据 export default data return startTime 0 cre
  • SQL注入-联合注入

    页面有显示位时 可用联合注入 本次以 SQLi 第一关为案例 第一步 判断注入类型 参数中添加 单引号 如果报错 说明后端没有过滤参数 即 存在注入 id 1 从数据库的报错中我们可得知 最外边的一对单引号是错误提示自带的 我们不用管 我们
  • pip install -r requirements.txt报错ERROR解决办法

    这个问题困扰了我很长时间 因为做的时候没有保存错误的截图 所以只能写一些思路 1 首先是vscode的环境 然后在里面安装Build Tools 这个很重要 否则会一直报错 安装包图片是上面这两个 下载的话Visual Studio Cod
  • 脚本收集服务器信息,shell脚本批量收集linux服务器的硬件信息快速实现

    获取默认IP default ip ifconfig head n 2 tail n 1 cut d f 2 cut d f 1 获取产品的名称 如果是简化版的linux系统 需要先安装dmidecode工具包 product name d
  • java高并发的处理--锁机制

    对于我们开发的网站 如果网站的访问量非常大的话 那么我们就需要考虑相关的并发访问问题了 而并发问题是绝大部分的程序员头疼的问题 但话又说回来了 既然逃避不掉 那我们就坦然面对吧 今天就让我们一起来研究一下常见的并发和同步吧 为了更好的理解并
  • phpstudy小皮 sqli-libs 靶场搭建

    sqli libs靶场搭建 1 下载靶场 sqli labs mster https github com Audi 1 sqli labs archive refs heads master zip 解压 2 下载 安装 phpstudy
  • Python(解非线性方程和线性方程)求水力学法向深度-浪涌高度速度及互连反应器中的浓度和流体分布

    非线性方程 在水力学领域遇到的非线性方程的一个例子是通过长梯形通道寻找流动的法向深度 y n y n yn 这样的流动深度出现在均匀流动区域 远离任何不均匀原因的影响 例如堰的上游 法向深度 y
  • 《GPT-4技术报告》【中文版、英文版下载】

    大预言模型时代已经到来 但是真正的智能之路还很长 一 以下是连接 大家请自取 英文原版 https arxiv org pdf 2303 08774 pdfhttps arxiv org pdf 2303 08774 pdf 中文翻译版本
  • 最大信息系数mic python_生物信息学

    论文剖析 热门论文 AgeGuess 一种预测人类年龄的甲基化模型 1 介绍 衰老是一个生物过程 受到遗传因子和细胞内各种分子修饰的影响 多项研究表明 使用甲基组数据可以准确预测实际年龄 本篇文章针对年龄回归问题 提出了一种三步特征选择算法
  • 【SpringBoot】pom中的变量

    在Maven项目的pom xml文件中 可以使用多个预定义变量 以下是一些常用的变量 project basedir 项目根目录的绝对路径 project build directory 构建目录的绝对路径 通常为target projec
  • mybatis_plus

    目录 一 简介 二 特性 三 快速入门 一 创建并初始化数据库 1 创建数据库 2 创建 User 表 二 初始化工程 三 添加依赖 1 引入依赖 2 idea中安装lombok插件 四 配置 五 编写代码 1 主类 2 实体 3 mapp
  • [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.(入职小灰)

    mariadb剧本安装后自动重启不了 飞要一次手动重启 这对于重要业务来说是致命的 今天遇到的错误 ERROR Can t open the mysql plugin table Please run mysql upgrade to cr
  • threejs教程(一)

    插件安装 npm i three 项目引入 这里我随便找的VUE项目练习的 import as THREE from three 大致介绍一下threejs的逻辑 一般我们用它是来搭建三维模型的 搭建三维模型就需要的三个要素 场景 scen