Three.js基础内容(二)

news2024/11/25 4:45:14

目录

一、模型

1.1、组对象Group和层级模型(树结构)

1.2、递归遍历模型树结构、查询具体模型节点(楼房案例)

1.3、本地(局部)坐标和世界坐标

1.4、改变模型相对局部坐标原点位置

1.5、移除对象.remove()

1.6、模型隐藏与显示

二、纹理

2.1、创建纹理贴图(TextureLoader)

2.2、自定义顶点UV坐标(geometry.attributes.uv)

2.3、圆形平面(CircleGeometry)设置纹理贴图

2.4、纹理对象texture的阵列(铺瓷砖)

2.5、矩形Mesh+背景透明png贴图(场景标注)

2.6、偏移属性.offset(UV动画--跑步机)

一、模型

1.1、组对象Group和层级模型(树结构)

const mesh1 = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.position.x = 100;

// 创建一个组对象,将mesh1和mesh2作为它的子对象
const group=new THREE.Group()
group.add(mesh1)
group.add(mesh2)
// 等价于 group.add(mesh1,mesh2)

// 以上等价于 const obj=new THREE.Object3D();
//           obj.add(mesh1,mesh2);
console.log(group.children,'group.children');//查看所有子对象

mesh1.translateY(50)
mesh2.translateY(50)
// 等价于 group.translateY(50)
export default group;

有时候:Object3D(模型节点)可以和Group画等号。

1.2、递归遍历模型树结构、查询具体模型节点(楼房案例)

模型命名:.name

递归遍历:traverse()函数

查询具体模型节点:xx.getObjectByName()

import * as THREE from "three";
const group1 = new THREE.Group();
group1.name = "高层";
for (let i = 0; i < 5; i++) {
	const geometry = new THREE.BoxGeometry(20, 60, 10);
	const material = new THREE.MeshBasicMaterial({
		color: 0x00ffff,
	});
	const mesh = new THREE.Mesh(geometry, material);
	mesh.name = i + 1 + "号楼";
	mesh.position.x = i * 30;
	group1.add(mesh);
}
group1.position.y = 30;//默认中心是原点,所以整体在平面上要平移原点的一半

const group2 = new THREE.Group();
group2.name = "低层";
for (let i = 0; i < 5; i++) {
	const geometry = new THREE.BoxGeometry(20, 30, 10);
	const material = new THREE.MeshBasicMaterial({
		color: 0xffff00,
	});
	const mesh = new THREE.Mesh(geometry, material);
	mesh.name = i + 6 + "号楼";
	mesh.position.x = i * 30;
	group2.add(mesh);
}
group2.position.z = 50;
group2.position.y = 15;

const model = new THREE.Group();
model.name = "小区所有楼";
model.add(group1, group2);
model.position.set(-50, 0, -25); //整体偏移

// 递归遍历所有的模型节点
model.traverse(function (obj) {
	if (obj.isMesh) {
		// obj.material.color.set(0xffff00);//批量修改颜色
		// obj是所有被命名的集合,isMesh是所有的mesh
		console.log("obj==>", obj.name);
	}
});
const nodeName = model.getObjectByName("4号楼"); //查找某个具体模型
nodeName.material.color.set(0xff0000);
export default model;

1.3、本地(局部)坐标和世界坐标

本地坐标:任何一个模型的.position属性就是本地坐标

世界坐标模型自身.position和所有父对象.position累加的坐标,其中getWorldPosition()获取并存储世界坐标。

import * as THREE from "three";
const geometry = new THREE.BoxGeometry(20, 20, 20);
const material = new THREE.MeshBasicMaterial({
  color: 0x00ffff,
});
const mesh = new THREE.Mesh(geometry, material);
mesh.position.x=50
const group = new THREE.Group();
group.add(mesh);
group.position.x = 50;

// 创建一个三维向量表示坐标
const v3=new THREE.Vector3()
mesh.getWorldPosition(v3);//getWorldPosition()获取世界坐标
console.log(v3,'世界坐标',mesh.position,'本地坐标');

const meshAx=new THREE.AxesHelper(50)
mesh.add(meshAx);//给子对象添加一个局部坐标系,跟随位置移动
mesh.position.y=50
export default group;

1.4、改变模型相对局部坐标原点位置

// 几何中心默认与本地坐标原点重合
const geometry = new THREE.BoxGeometry(50, 50, 50);
//平移几何体的顶点坐标,改变几何体自身相对局部坐标原点的位置
geometry.translate(50 / 2, 0, 0);

1.5、移除对象.remove()

举个例子:scene.remove(model);

一次移除多个子对象:group.remove(mesh1,mesh2);

1.6、模型隐藏与显示

举个例子:group.visible=false

材质隐藏:mesh.material.visible=false,这里当多个模型共享材质时发生同时消失问题,可以考虑mesh.material=material.clone()克隆后就不会互相影响。

二、纹理

2.1、创建纹理贴图(TextureLoader)

就是把外部图片渲染在相应的几何体上,比如将地图平面.png渲染在球体上,形成了地球仪。

import * as THREE from "three";
const geometry = new THREE.SphereGeometry(50);
// 纹理贴图加载器TextureLoader
const texLoader=new THREE.TextureLoader()
// .load()加载图像,返回一个纹理对象
const texture=texLoader.load('./ditu.jpg')
const material = new THREE.MeshBasicMaterial({
	map:texture//map表示材质的颜色贴图属性
});
// material.map=texture;//这样也可以设置
const mesh = new THREE.Mesh(geometry, material);
export default mesh;

2.2、自定义顶点UV坐标(geometry.attributes.uv)

顶点UV坐标作用:

从纹理贴图上提取像素映射到网络模型Mesh的几何体表面上。

import * as THREE from "three";
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([0, 0, 0, 100, 0, 0, 100, 60, 0, 0, 60, 0]);
const attribute = new THREE.BufferAttribute(vertices, 3);
geometry.attributes.position = attribute;

const indexes = new Uint16Array([0, 1, 2, 0, 2, 3]);
geometry.index = new THREE.BufferAttribute(indexes, 1);

// const uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);//全图映射
const uvs = new Float32Array([0, 0, 0.5, 0, 0.5, 0.5, 0, 0.5]);//映射左下角的1/4
geometry.attributes.uv = new THREE.BufferAttribute(uvs, 2);

const texLoader = new THREE.TextureLoader();
const texture = texLoader.load("./ditu.jpg");
const material = new THREE.MeshBasicMaterial({
	map: texture,
});
const mesh = new THREE.Mesh(geometry, material);
export default mesh;

2.3、圆形平面(CircleGeometry)设置纹理贴图

原理:CircleGeometry的uv坐标会对颜色纹理贴图.map进行提取,默认是一个圆形轮廓,可以将任何形状的图片转为圆形。

// CircleGeometry的顶点uv坐标是按照圆形来采样纹理贴图
const geometry = new THREE.CircleGeometry(60,100);

2.4、纹理对象texture的阵列(铺瓷砖)

通过PlaneGeometry和texture的相关属性实现瓷砖铺满地面效果(一张图多方向重复排列)

const texture = texLoader.load("./zhuan.png");
// 允许阵列模式
texture.wrapS=THREE.RepeatWrapping
texture.wrapT=THREE.RepeatWrapping
// uv两个方向纹理重复数量,越大越密集
texture.repeat.set(12,12)
const mesh = new THREE.Mesh(geometry, material);
mesh.rotateX(-Math.PI/2)//沿X轴平铺 

2.5、矩形Mesh+背景透明png贴图(场景标注)

(1)、ps自制透明背景PNG:

选择“魔术棒工具”或“套索工具”,用于选取保留区域。点击背景区域,然后按下“删除”键,将背景色删除,再存储为.png格式即可!

(2)、标注思路:

将背景透明的.png图像作为矩形平面的颜色贴图,同时材质设置为transparent:true,这样png图片背景完全透明的部分不显示。

//==========================index.js==================
// 创建一个辅助网格地图【参数:尺寸、细分次数、中线色、网格线色】
const gridHelper=new THREE.GridHelper(600,50,0x00ffff,0x004444);
scene.add(gridHelper)
//=========================touming.js===================
import * as THREE from "three";
const geometry = new THREE.PlaneGeometry(100,100);
const texLoader = new THREE.TextureLoader();
const material = new THREE.MeshBasicMaterial({
  map: texLoader.load("./jiantou.png"),
  side:THREE.DoubleSide,
  transparent:true
});
const mesh = new THREE.Mesh(geometry, material);
mesh.rotateX(-Math.PI/2)//沿X轴平铺 ,因为默认是XOY面放置
mesh.position.y=1;//往上移一下,避免图标被污染
export default mesh;

2.6、偏移属性.offset(UV动画--跑步机)

偏移的本质就是修改UV顶点坐标。

.wrapS对应offset.x偏移; .wrapT对应offset.y偏移】

texture.offset.x = 0.5; //UV--U方向偏移
// 实现“首尾相接 ”
texture.wrapS = THREE.RepeatWrapping; //改变包裹(映射方式)
texture.repeat.x=50;//针对小像素偏移时添加,大图可忽略
export { mesh, texture };
//====================index.js核心代码===========================
import { mesh, texture } from "./offset.js";
function render() {
	texture.offset.x += 0.005; //每次累加偏移
	renderer.render(scene, camera); //一定要更新内容
	requestAnimationFrame(render); //请求动画帧==实现周期性循环
}
render();

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

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

相关文章

005集—— 用户交互之CAD窗口选择图元实体(CAD—C#二次开发入门)

如下图&#xff1a;根据提示选择若干图形要素&#xff0c;空格或右键结束选择&#xff0c;返回图元的objectid&#xff0c;以便进一步操作图元实体。 代码如下&#xff1a; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.Aut…

嘉兴儿童自闭症寄宿学校独特教育模式探秘

自闭症&#xff08;孤独症&#xff09;儿童的教育问题一直是社会关注的焦点。如何为这些特殊的孩子提供一个安全、稳定且充满爱的成长环境&#xff0c;成为了许多家庭的期盼。在众多自闭症儿童教育机构中&#xff0c;广州的星贝育园自闭症儿童寄宿制学校以其独特的教育模式和全…

Keycloak 获取token 用户信息

进入Clients菜单&#xff0c;选择Client ID找到Access settings 》Direct access grants 将Direct access grants勾选Postmans URL输入地址&#xff1a;{IP}:{prot}/realms/{ realms }/protocol/openid-connect/token 例&#xff1a;http://10.18.11.3:31873/realms/master/pro…

Centos7 NTP客户端

目录 1. NTP客户端1.1 安装1.2 启动1.3 同步状态异常1.4 更改/etc/chrony.conf配置文件1.5 同步状态正常 1. NTP客户端 1.1 安装 如果chrony没有安装&#xff0c;可以使用以下命令安装 sudo yum install chrony1.2 启动 启动并设置开机自启 sudo systemctl start chronyd …

【Matlab学习日记】② 常用滤波以及噪声分析方法(上)

关注星标公众号&#xff0c;不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 【Matlab学习日记】专栏目录 第一章 ① Sinmulink自动代码生成教程 第二章 ② 常用滤波以及噪声分析方法&#xff08;上&#xff09; 文章目录 前言一、使用滤波的目的二、常见的几种噪声和表…

棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程

一、前言 【试用版软件下载&#xff0c;可以点击本文章最下方官网卡片】 棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程 棋牌计时计费软件的应用也提升了顾客的服务体验&#xff0c;顾客可以清晰的看到自己的消费时间和费用。增加了消费的透明…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

数据分析之Spark框架介绍

文章目录 概述一、发展历程与背景二、核心特点三、生态系统与组件四、应用场景五、与其他大数据技术的比较 核心概念1. 弹性分布式数据集&#xff08;RDD, Resilient Distributed Dataset&#xff09;2. 转换&#xff08;Transformations&#xff09;和动作&#xff08;Actions…

python jpg 简单研究 1

起因&#xff0c; 目的: 就是想看看 jpg 里面有什么。 其实&#xff0c;我最开始的想法是&#xff0c;自己来写一个文件格式&#xff0c;只能我自己才能打开。 然后看了 jpg 相关的内容&#xff0c;发现太复杂&#xff0c;只能罢了。 1. jpg 的魔法头数字&#xff08;File Ma…

蝶形激光器驱动(温控精度0.002°C 激光电流分辨率5uA)

蝶形半导体激光器驱动电流的稳定性直接决定了其输出波长的稳定性,进而影响检测精度.为了满足气体浓度检测中对激光器输出波长稳定可调的要求,设计了数字与模拟电路混合的恒流驱动电路.STM32为主控芯片数控模块完成扫描AD/DA转换;模拟电路主要由负反馈运算放大、高精度CMOS管和反…

《向量数据库指南》揭秘:Mlivus Cloud如何借Fivetran Partner SDK实现数据飞跃

哈哈,各位向量数据库领域的同仁们,今天咱们来聊聊 Fivetran 的 Partner SDK 如何助力技术供应商构建自定义连接器和目标,特别是与 Mlivus Cloud 的集成,这可是个热门话题啊! Fivetran 的 Partner SDK,简直就是为技术供应商量身打造的“神器”。有了它,你就可以轻松地为…

LeetCode讲解篇之300. 最长递增子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以通过动态规划求解&#xff0c;使用一个数组f&#xff0c;数组f的i号元素表示[0, i]范围内最长递增子序列的长度 状态转移方程&#xff1a;f[i] max(f[j] 1)&#xff0c;其中 0 < j < i 题…

node高版本报错: digital envelope routines::unsupported

node高版本报错&#xff1a; digital envelope routines::unsupported 解决方案&#xff1a; package.json中&#xff0c;启动命令前加上&#xff1a; set NODE_OPTIONS--openssl-legacy-provider &&

Windows安装Linux子系统报错:WslRegisterDistribution failed with error: 0x8007019e

WslRegisterDistribution failed with error: 0x8007019e 报错截图如下图&#xff1a; 该处是由于没有安装Linux内核&#xff0c;因此需要安装。可前往官网查看详情&#xff1a;https://aka.ms/wslinstall 需要解决该问题&#xff0c;可参照官网方法&#xff08;我没试过官网…

pip丢了怎么办!不用怕,教你用get-pip.py来下载

1.下载get-pip.py进行安装 我们有的时候环境中会找不到或者误删丢失了pip模块&#xff0c;就没办法安装新的python模组&#xff0c;那怎么办呢&#xff0c;官方提供了get-pip.py模块可以帮我们快速安装pip。 get-pip.py网站 bootstrap.pypa.io/get-pip.py 直接将文件下载下来…

已解决:AttributeError: ‘str‘ object has no attribute ‘decode‘

已解决&#xff1a;AttributeError: ‘str’ object has no attribute ‘decode’ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 确保只对 bytes 对象调用 decode()2. 将 Python 2 的旧代码迁移到 Python 33. 检查数据来源4. 处理编码不一致的问题5. 使用 six 库…

Java第二阶段---11封装---第四节 static 修饰符

1.static 修饰符应用范围 static修饰符只能用来修饰类中定义的成员变量、成员方法、代码块以及内部类(内部类有专门章节进行讲解)。 2.static 修饰成员变量 static 修饰的成员变量称之为类变量。属于该类所有成员共享。 示例 package cn.lyxq.test04;public class Chinese…

系统架构设计师论文《论企业应用系统的分层架构风格》精选试读

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式&#xff0c;反映了领域中诸多系统所共有的结构特征和语义特征&#xff0c;并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格&#xff0c;能够有效简化设计&…

HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 10 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Half adder | 半加器 2 Full adder | 全加器 3 3-bit binary adder | 3位二进制加法器 4 Adder | 加法器 5 Signed addition overflow | 有符号数的加法溢出 6 100-bit bi…

【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析

前言 &#x1f31f;&#x1f31f;本期讲解关于MySQL索引事务&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl…