threejs学习随笔(入门篇)

news2024/11/25 12:53:44

前言:three.js和webgl

Three.js经常会和WebGL混淆, 但也并不总是,three.js其实是使用WebGL来绘制三维效果的。 WebGL是一个只能画点、线和三角形的非常底层的系统. 想要用WebGL来做一些实用的东西通常需要大量的代码, 这就是Three.js的用武之地。它封装了诸如场景、灯光、阴影、材质、贴图、空间运算等一系列功能,让你不必要再从底层WebGL开始写起。

场景、相机和渲染器

接下来是渲染器。这里是施展魔法的地方。除了我们在这里用到的WebGLRenderer渲染器之外,Three.js同时提供了其他几种渲染器,当用户所使用的浏览器过于老旧,或者由于其他原因不支持WebGL时,可以使用这几种渲染器进行降级

类似于<<JavaScript编程艺术>>中对网站规范中JavaScript脚本的兼容应该是上面这样的

起步_正方体

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>My first three.js app</title>
        <style>
            body {
                margin: 0;
            }
        </style>
    </head>
    <body>
        <script src="../build/three.js"></script>
        <script>
            // Our Javascript will go here.
            // 初始化
            const scene = new THREE.Scene();
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
​
            const renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);
​
            // 建立正方体,基础上色, 画布等准备工作
            const geometry = new THREE.BoxGeometry(1, 1, 1);
            const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
            const cube = new THREE.Mesh(geometry, material);
            scene.add(cube);
​
            camera.position.z = 5;
            // 动画/渲染循环方法
            // 节省cpu,保护电脑
      // 这个函数每帧都会调用(一般60次/s),其他方法都要经过这个,
      // 因为多次调用,要写在前面防止上百次重复代码
            function animate() {
                requestAnimationFrame(animate);
                cube.rotation.x += 0.01;
                cube.rotation.y += 0.01;
                renderer.render(scene, camera);
            }
            animate();
        </script>
    </body>
</html>
​

在实现了这一步后,我发现它和jq之家里的css正方体旋转的类似,大概是底层原理都是webgl封装的方法吧(瞎说的🤣),

整理css的类似代码

从CDN或静态主机安装

下面代码大致说的是three.js的模块化引入;或者上传到你自己的服务器,在线调用

<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
​
<script type="importmap">
    {
    "imports": {
        "three": "https://unpkg.com/three@<version>/build/three.module.js"
    }
    }
</script>
​
<script type="module">
​
    import * as THREE from 'three';
​
    const scene = new THREE.Scene();
​
</script>

在网页上画线

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>My first three.js app</title>
        <style>
            body {
                margin: 0;
            }
        </style>
    </head>
    <body>
        <script src="../build/three.js"></script>
        <script>
            // Our Javascript will go here.
            // 一般是初始化场景,相机,渲染器
            const renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);
​
            const camera = new THREE.PerspectiveCamera(
                45,
                window.innerWidth / window.innerHeight,
                1,
                500
            );
            camera.position.set(0, 0, 100);
            camera.lookAt(0, 0, 0);
​
            const scene = new THREE.Scene();
            //create a blue LineBasicMaterial
            // 选定线条材质
            const material = new THREE.LineBasicMaterial({ color: 0x0000ff });
​
            // 貌似是通过这些线,创建带有顶点的几何体
            const points = [];
            points.push(new THREE.Vector3(-10, 0, 0));
            points.push(new THREE.Vector3(0, 10, 0));
            points.push(new THREE.Vector3(10, 0, 0));
​
            const geometry = new THREE.BufferGeometry().setFromPoints(points);
      // 组合在一起,形成线
      const line = new THREE.Line( geometry, material );
      // 添加到渲染场景中,并调用
      scene.add( line );
renderer.render( scene, camera );
        </script>
    </body>
</html>

创建文字

文字一般用3D模型导出到three.js,当然你也可以用代码,,素材请自行到官网取Three.js – JavaScript 3D Library

由于可能服务器在海外的情况,偶尔会,如果长期工作和学习threejs,可以下载官网文档

如果Typeface已经关闭,或者没有你所想使用的字体,这有一个教程:jaanga: Blender to Three.js >> Create 3D Text With Any Font 这是一个在blender上运行的python脚本,能够让你将文字导出为Three.js的JSON格式。

关于载入3D模型问题

用代码完成大量工作显然费时费力,善于其它方向现有的解决方案,大大提高产品推向时长

这部分后面完善,因为前期工作量小

加载

加载

已经内置了一些加载器,部分需要按需引入

在three.js中只会内置一部分加载器(例如:ObjectLoader) —— 其它的需要在你的应用中单独引入。

import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

一旦你引入了一个加载器,你就已经准备好为场景添加模型了。不同加载器之间可能具有不同的语法 —— 当使用其它格式的时候请参阅该格式加载器的示例以及文档。对于glTF,使用全局script的用法类似:


                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言函数大全-- p 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- p 开头的函数 1. perror 1.1 函数说明 函数声明函数功能void perror(const char *s);用于将当前错误码对应的错误信息打印到标准输出设备&#xff08;通常是终端&#xff09;。 参数&#xff1a; s &#xff1a; 用于描述错误类型或…

班级页面设计——【3-相关活动页面】内容使用HTML以及css和Javascripts技术

系列文章目录 班级页面设计——【1-登陆注册页面】_网页制作实现登录注册 班级页面设计——【2-主界面部分】_班级首页展示 文章目录 系列文章目录 前言 一、页面效果介绍 1.1、页面展示 1.2、简单介绍 二、代码展示部分 2.1、html代码部分 2.2、css代码部分 前言 …

C++(继承中)

目录&#xff1a; 1.基类和派生类对象赋值转换 2.派生类当中的6个默认成员函数 --------------------------------------------------------------------------------------------------------------------------- 派生类对象可以赋值给 基类的对象/基类的指针/基类的引用&am…

“量子计算+个性化医疗”!富士通和BSC利用张量网络推进新研究

​ &#xff08;图片来源&#xff1a;网络&#xff09; 富士通和巴塞罗那超级计算中心(BSC)正在签署一项合作协议&#xff0c;通过利用临床数据促进个性化医疗&#xff0c;并使用张量网络推进量子模拟技术。 双方将于2023年5月开始联合研究&#xff0c;第一个合作项目旨在利用不…

CSGO搬砖,每天1-2小时,23年最强副业非它莫属(内附操作流程)

自从我学会了CSGO搬运&#xff0c;我发现生活也有了不小的改变&#xff0c;多了一份收入&#xff0c;生活质量也就提高了一份。 其实刚接触CSGO&#xff0c;我压根就不相信这么能挣钱&#xff0c;因为在印象中&#xff0c;游戏供玩家娱乐竞技的&#xff0c;作为我这种技术渣渣…

VUE3如何定义less全局变量

默认已经安装好了less&#xff0c;这里不过多讲。 &#xff08;1&#xff09;首先我们需要下载一个插件依赖&#xff1a; npm i style-resources-loader --save-dev &#xff08;2&#xff09;VUE3里配置vue.config.js文件内容 代码&#xff1a; const path require("p…

U盘安装Windows11和ubuntu20.04双系统

准备&#xff1a; 一台PC电脑&#xff08;我的是两个固态硬盘&#xff09; 一个U盘&#xff08;最好不小于32G&#xff09; 下载安装工具&#xff1a; 老白菜u盘启动盘制作工具_u盘启动_u盘装系统下载尽在老白菜官网 最新UltraISO官方免费下载 - UltraISO软碟通中文官方网…

数据结构与算法(九) 树

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲树 树是一种常见的数据结构&#xff0c;其定义为&#xff1a;由有限个节点组成的具有层次关系的集合 解决树问题的关键是递归&#xff0c;递归的关键是分解子问题 对于树来说&#xff0c;递归函数只要考虑对单个节点如何处…

波奇学Linux:Linux的认识和云服务器使用

在讲Linux前&#xff0c;我们先来理解计算机&#xff1a; 计算机&#xff1a;输入->算法->输出 举个栗子&#xff1a; pritnf :输出到屏幕&#xff08;硬件&#xff09;上 我们在计算机所有的行为都会转为硬件行为。 再进一步理解,我们打开visual studio后&#xff0c;敲…

BPF技术学习与整理

目录 eBPF是什么&#xff1f; eBPF是做什么的&#xff1f;可以解决什么问题&#xff1f; eBPF可以带来的解决方案是什么&#xff1f; eBPF的技术点 eBPF hookeBPF MapeBPF Helper FunctioneBPF有什么限制吗&#xff1f; 前言 21年因为项目需求而要开发一个工具&#xff0c;可以…

如何通过docker启动一个本地springboot的jar包

一、构建本地jar包 进入到项目目录下执行如下命令 mvn -e clean package -Dmaven.test.skiptrue或者直接在idea中打包 得到target文件夹 进入到target文件夹得到jar包 二、创建Dockerfile文件 新建Dockerfile文件&#xff0c;内容如下 FROM openjdk:8-jre MAINTAINER ja…

硬盘坏掉之后

文章目录 背景解决方案数据丢失软件安装 总结 背景 前一段时间&#xff0c;我的电脑突然就开不了机了&#xff0c;进入安全模式之后&#xff0c;发现硬盘无法读取&#xff0c;大概率是硬盘坏掉了。电脑是 MacBook&#xff0c;自己不太好换。于是跑到华强北&#xff0c;找了一家…

电脑无论是连接热点,还是公共网络,qq、微信都能用,就是不能上网,现分享解决办法如下。

这里写自定义目录标题 问题引入&#xff1a;解决办法1、打开电脑的控制面板2、点击 “网络和internet”3、点击 “internet 选项”4、点击 “连接”5、点击 “局域网设置”6、按照下面操作 问题引入&#xff1a; 在魔法使用网站之后&#xff0c;忘记关闭 clash 按钮就关闭电脑&…

Spring-学习修改尚硅谷最新教程笔记

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

数据湖Iceberg-SparkSQL集成(4)

文章目录 数据湖Iceberg-SparkSQL集成一、环境准备安装Spark 二、Spark配置Catalog2.1在配置文件中添加HiveCatalog与HadoopCatalog配置&#xff08;一劳永逸&#xff09;2.2使用spark-sql连接Hive Catalog2.3使用spark-sql连接Hadoop Catalog 三、SQL操作3.1 创建表创建分区表…

一个 24 通道 100Msps 逻辑分析仪

这是一个创建非常便宜的逻辑分析仪的项目&#xff0c;但其功能可与昂贵的商业分析仪相媲美。该分析仪可以以每秒 1 亿个样本的最高速度对多达 24 个通道进行采样&#xff0c;并且可以通过单个通道中的极性变化或多达 16 个通道形成的模式来触发。 该项目不仅包含硬件&#xff0…

去银行还是干嵌入式?

晚上要睡觉的时候&#xff0c;一个读者给我发消息 说是最近拿到了4个offer&#xff0c;现在犹豫不决 听说&#xff0c;最近嵌入式突然就火起来了。 不过&#xff0c;嵌入式很多人的薪资还是低了&#xff0c;而且&#xff0c;工作很多年后&#xff0c;嵌入式的工作&#xff0c;那…

蛋白冠™蛋白质组学技术实现快速深入精确地解析血浆蛋白质图谱

文章标题&#xff1a;Rapid, deep and precise profiling of the plasma proteome with multi-nanoparticle protein corona 发表期刊&#xff1a;Nature Communications 影响因子&#xff1a;17.694 作者单位&#xff1a;哈佛医学院&#xff1b;Seer&#xff0c;美国&#…

opencv (六十四)监督学习聚类(k近邻原理、支持向量机原理、k近邻(KNN)手写字识别、支持向量机数据分类)

文章目录 1 k近邻原理介绍2 支持向量机原理3 K近邻(KNN)手写字识别训练模型4 手写字识别5 支持向量机 进行数据分类6 源代码及数据文件下载1 k近邻原理介绍 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想…

算法刷题知识点总结

因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。 二分法&#xff1a;采用两个指针&#xff0c;注意他们的区间划分&#xff1b; 双指针法&#xff0c;用于查找排序&#xff1a;双指针将一个两层循…