threejs--02threejs手册起步+进阶

快速过一下基本用法

01 场景

//场景、相机和渲染器
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;//设置位置function animate() {//使渲染器能够在每次屏幕刷新时对场景进行绘制的循环,当用户切换到其它的标签页时,它会暂停(跟setInterval差不多)。不然以上代码画面是空的requestAnimationFrame( animate );cube.rotation.x += 0.01;//动画cube.rotation.y += 0.01;//动画renderer.render( scene, camera );//渲染
}
animate();

02 兼容性检查

引入WebGL.js

if (WebGL.isWebGLAvailable()) {// Initiate function or other initializations hereanimate();
} else {const error = WebGL.getWebGLErrorMessage();console.error(error)
}

03 画线

const scene = new THREE.Scene();//场景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 material = new THREE.LineBasicMaterial( { color: 0x0000ff } );//材质
//构建三维几何体
const points = [];
points.push( new THREE.Vector3( - 10, 0, 0 ) );//Vector3--三维空间中的向量
points.push( new THREE.Vector3( 0, 10, 0 ) );//Vector3--三维空间中的向量
points.push( new THREE.Vector3( 10, 0, 0 ) );//Vector3--三维空间中的向量
//线是画在每一对连续的顶点之间的,不闭合
const geometry = new THREE.BufferGeometry().setFromPoints( points );//BufferGeometry--定义3D几何体
const line = new THREE.Line( geometry, material );//物体=几何体+材质scene.add( line );//加到场景中
renderer.render( scene, camera );//渲染

04 字体

  1. CSS2DRenderer 或CSS3DRenderer

2.TextureLoader

const texture = new THREE.TextureLoader().load( "textures/water.jpg" );
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 4, 4 );

3.TextGeometry

new THREE.TextGeometry( text, parameters );
import * as THREE from 'three';
import { FontLoader } from 'three/addons/loaders/FontLoader.js';
import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';THREE.Cache.enabled = true;let container;
let camera, cameraTarget, scene, renderer;
let group, textMesh1, textMesh2, textGeo, materials;
let firstLetter = true;
let text = 'three.js',bevelEnabled = true,font = undefined,fontName = 'optimer', // helvetiker, optimer, gentilis, droid sans, droid seriffontWeight = 'bold'; // normal boldconst depth = 20,size = 70,hover = 30,curveSegments = 4,bevelThickness = 2,bevelSize = 1.5;const mirror = true;const fontMap = {helvetiker: 0,optimer: 1,gentilis: 2,'droid/droid_sans': 3,'droid/droid_serif': 4,
};const weightMap = {regular: 0,bold: 1,
};const reverseFontMap = [];
const reverseWeightMap = [];for (const i in fontMap) reverseFontMap[fontMap[i]] = i;
for (const i in weightMap) reverseWeightMap[weightMap[i]] = i;let targetRotation = 0;
let targetRotationOnPointerDown = 0;let pointerX = 0;
let pointerXOnPointerDown = 0;let windowHalfX = window.innerWidth / 2;let fontIndex = 1;init();
animate();function init() {container = document.createElement('div');document.body.appendChild(container);//相机camera = new THREE.PerspectiveCamera(30,window.innerWidth / window.innerHeight,1,1500,);camera.position.set(0, 400, 700);cameraTarget = new THREE.Vector3(0, 150, 0);//场景scene = new THREE.Scene();scene.background = new THREE.Color(0x000000);scene.fog = new THREE.Fog(0x000000, 250, 1400);//雾//光const dirLight = new THREE.DirectionalLight(0xffffff, 0.4);dirLight.position.set(0, 0, 1).normalize();scene.add(dirLight);const pointLight = new THREE.PointLight(0xffffff, 4.5, 0, 0);pointLight.color.setHSL(Math.random(), 1, 0.5);pointLight.position.set(0, 100, 90);scene.add(pointLight);materials = [new THREE.MeshPhongMaterial({ color: 0xffffff, flatShading: true }), // frontnew THREE.MeshPhongMaterial({ color: 0xffffff }), // side];//字体组group = new THREE.Group();group.position.y = 100;scene.add(group);loadFont();//平面const plane = new THREE.Mesh(new THREE.PlaneGeometry(10000, 10000),new THREE.MeshBasicMaterial({color: 0xffffff,opacity: 0.5,transparent: true,}),);plane.position.y = 100;plane.rotation.x = -Math.PI / 2;scene.add(plane);//渲染器renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth, window.innerHeight);container.appendChild(renderer.domElement);
}function createText() {textGeo = new TextGeometry(text, {font: font,size: size,depth: depth,curveSegments: curveSegments,bevelThickness: bevelThickness,bevelSize: bevelSize,bevelEnabled: bevelEnabled,});textGeo.computeBoundingBox();const centerOffset =-0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);textMesh1 = new THREE.Mesh(textGeo, materials);textMesh1.position.x = centerOffset;textMesh1.position.y = hover;textMesh1.position.z = 0;textMesh1.rotation.x = 0;textMesh1.rotation.y = Math.PI * 2;group.add(textMesh1);//倒影if (mirror) {textMesh2 = new THREE.Mesh(textGeo, materials);textMesh2.position.x = centerOffset;textMesh2.position.y = -hover;textMesh2.position.z = depth;textMesh2.rotation.x = Math.PI;textMesh2.rotation.y = Math.PI * 2;group.add(textMesh2);}
}function refreshText() {group.remove(textMesh1);if (mirror) group.remove(textMesh2);if (!text) return;createText();
}
//载入字体模型
function loadFont() {const loader = new FontLoader();loader.load('fonts/' + fontName + '_' + fontWeight + '.typeface.json',function (response) {font = response;refreshText();},);
}
function animate() {requestAnimationFrame(animate);//动起来render();//渲染
}function render() {group.rotation.y += (targetRotation - group.rotation.y) * 0.05;camera.lookAt(cameraTarget);//相机朝向renderer.clear();//清除renderer.render(scene, camera);//渲染
}

03 载入载入3D模型

const loader = new GLTFLoader();loader.load( 'path/to/model.glb', function ( gltf ) {scene.add( gltf.scene );
}, undefined, function ( error ) {console.error( error );
} );

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

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

相关文章

哈希函数算法

概述 为了实现哈希集合这一数据结构,有以下几个关键问题需要解决: 哈希函数:能够将集合中任意可能的元素映射到一个固定范围的整数值,并将该元素存储到整数值对应的地址上。冲突处理:由于不同元素可能映射到相同的整…

【vue】Pinia-1 入门

简介 Pinia是Vue.js的一个状态管理库,由Vue.js官方维护。它提供了一种简单而强大的方式来管理Vue.js应用程序中的状态。 应用场景:用户登录 解决问题 Pinia是全局的状态管理,所有组件都可看到 避免了组件间的大量数据交换简化了组件间的通…

C语言中局部变量和全局变量是否可以重名?为什么?

可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…

【C++类和对象】构造函数与析构函数

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络 这是一篇关于人体姿态估计的研究论文,标题为“Stacked Hourglass Networks for Human Pose Estimation”,作者是 Alejandro Newell, Kaiyu Yang, 和 Jia Deng&a…

多模态 ——LLaVA 集成先进图像理解与自然语言交互GPT-4的大模型

概述 提出了一种大型模型 LLaVA,它使用 GPT-4 生成多模态语言图像指令跟随数据,并利用该数据将视觉和语言理解融为一体。初步实验表明,LLaVA 展示了出色的多模态聊天能力,在合成多模态指令上的表现优于 GPT-4。 在科学质量保证中…

如何减少延迟队列的压力

1、增加消费者数量: 通过增加消费者(即处理消息的工作进程)的数量,可以提高消息的处理速度,从而减轻队列的压力。这可以 通过水平扩展来实现,即部署更多的消费者实例来并行处理消息。 2、优化消费者性能&…

第1章、react基础知识;

一、react学习前期准备; 1、基本概念; 前期的知识准备: 1.javascript、html、css; 2.构建工具:Webpack:https://yunp.top/init/p/v/1 3.安装node:npm:https://yunp.top/init/p/v/1 …

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之三 简单动态聚光灯效果 一、简单介绍 二、简单动态聚光灯效果实现原理 三、简单动态聚光灯效果…

Mysql视图与事物与字符集实验

一 视图 1.视图的定义 视图是一个虚拟表,其内容由查询定义。 2.视图的优点 1)视点集中 2)简化操作 3)定制数据 4)分隔合并数据 5)安全性好 3.语法格式及限定条件 1)语法格式&#xff1…

详细讲解 C 语言标准库中的 strncmp 函数

strncmp 是 C 语言标准库提供的一个函数,用于比较两个字符串的前若干个字符是否相等。以下是关于 strncmp 函数的详细说明: 函数原型 int strncmp(const char *str1, const char *str2, size_t num); 参数说明 const char *str1: 指向第一个要比较的字…

轻量化模块整理,即插即用

轻量化模块整理,即插即用(持续更新) 整理一些轻量化的结构,作为知识储备,可以用到后续的项目和研究中 Mobilenetv3 深度可分离卷积 MobileNetV3 是一个轻量级的深度学习模型,专为移动和边缘设备上的高效…

微信小程序二维码

目录 前言小程序二维码不限制数量的小程序码微信小程序官方文档:获取不限制数量的小程序码小程序里面中接收不限制数量的小程序码传递的参数 普通链接二维码微信小程序官方文档:扫普通链接二维码打开小程序小程序里面中接收普通链接二维码传递的参数 前言…

C#面:泛型的主要约束和次要约束是什么

在 C# 中,泛型的约束是用来限制泛型类型参数的行为和能力的。 主要约束和次要约束是两种不同的约束方式。 主要约束(Primary Constraint): 主要约束指定了泛型类型参数必须满足的最基本的条件,它可以是一个类、一个接…

力扣HOT100 - 56. 合并区间

解题思路: class Solution {public int[][] merge(int[][] intervals) {// 先按照区间起始位置排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int[][] res new int[intervals.length][2];int idx -1;for (int[] interval : intervals) {//直接加入的…

《高等数学》笔记

文章目录 第一章 函数与极限第四节 无穷小与无穷大定义1 无穷小 第七节 无穷小的比较 第三章 微分中值定理与导数的应用第三节 泰勒公式 第九章 多元函数微分法及其应用第二节 偏导数第三节 全微分第四节 多元复合函数的求导法则 第一章 函数与极限 第四节 无穷小与无穷大 定…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言:学习CSS就必须要学习选择器,在之前我们已经学习了基本选择器和复合选择器,但是还有几个选择器没有学习,这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

基于springboot实现视频网站管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现视频网站管理系统演示 摘要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-回铃音补偿

文章目录 前言联系我们解决问题操作步骤 前言 回铃音: 当别人打电话给你时,你的电话响铃了,而他听到的声音叫做回铃音。回铃音是被叫方向主叫方传送,也是彩铃功能的基础。我们平时打电话听到的“嘟 嘟 嘟 嘟”的声音,就…

[Linux] haproxy地址映射实现性能测试

背景 需要虚拟1万个网元做性能测试,前提是已经有网元模拟器,可以在服务器上批量起虚拟IP, 每个虚拟IP对应一个网元进程,但是一台服务器的CPU数量有限,不可能起1万个模拟器进程。于是结合haproxy,将frontend的1万个IP映…