threejs官方demo学习(3):几何体

news2025/1/11 12:24:03

webgl_geometries

这个案例还是比较简单的,主要介绍了一些创建物体的创建。

知识点

PointLight
PointLight 点光源,从一个点向各个方向发出光线的光源,比如灯泡。

BoxGeometry
BoxGeometry 立方缓冲几何体
在这里插入图片描述
SphereGeometry
SphereGeometry 球缓冲几何体
在这里插入图片描述
IcosahedronGeometry
IcosahedronGeometry 20面缓冲几何体,该构造函数有一个参数detail 顶点数,默认为0,当是大于0的整数时将会变成一个球体
在这里插入图片描述
OctahedronGeometry
OctahedronGeometry 8面缓冲几何体,与20面缓冲几何体基本相似。

TetrahedronGeometry
TetrahedronGeometry 4面缓冲几何体,同上。

PlaneGeometry
PlaneGeometry 平面缓冲几何体
在这里插入图片描述
CircleGeometry
CircleGeometry 圆形缓冲几何体,分段数越大越圆,最小是3是一个三角形
在这里插入图片描述
RingGeometry
RingGeometry 圆环缓冲几何体,与圆形缓冲几何体类似,是一个圆环。
在这里插入图片描述
CylinderGeometry
CylinderGeometry圆柱缓冲几何体
在这里插入图片描述
LatheGeometry
LatheGeometry车削缓冲几何体,创建具有轴对称性的网格,比如花瓶。车削绕着Y轴来进行旋转。
在这里插入图片描述
TorusGeometry
TorusGeometry圆环缓冲几何体
在这里插入图片描述
TorusKnotGeometry
TorusKnotGeometry 圆环缓冲扭结几何体
在这里插入图片描述

webgl_geometry_colors

效果图
应该是页面的尺寸和位置设置的有点问题,与官方例子的效果有很大差别,不过该例子中可以学习的知识挺多的。
在这里插入图片描述

知识点

canvas纹理
材质的颜色贴图用的最多的是图片,在这个例子中,使用了canvas创建了一个渐变的纹理

let canvas = document.createElement('canvas');
// 设置画布大小
canvas.width = 128;
canvas.height = 128;
let context = canvas.getContext('2d');
// 设置渐变
const gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2);
gradient.addColorStop(0.1, 'rgba(210,210,210,1)');
gradient.addColorStop(1, 'rgba(255,255,255,1)');
// 创建矩形
context.fillStyle = gradient;
context.fillRect(0, 0, canvas.width, canvas.height);
// 获取纹理
let shadowTexture = new THREE.CanvasTexture(canvas);

// 创建基础网格材质
let shadowMaterial = new THREE.MeshBasicMaterial({ map: shadowTexture });

设置顶点颜色

// 半径
let radius = 100;
// 创建20面缓冲几何体
let geometry1 = new THREE.IcosahedronGeometry(radius, 1);
// 获取顶点数
let count = geometry1.attributes.position.count;
// 设置顶点x、y、z三维向量的颜色属性
geometry1.setAttribute('color', new THREE.BufferAttribute(new Float32Array(count * 3), 3));

// 创建颜色对象
const color = new THREE.Color();
// 获取物体的位置属性和颜色属性
const positions1 = geometry1.attributes.position;
const colors1 = geometry1.attributes.color;

for (let i = 0; i < count; i++) {
    // 设置随机颜色,当点的位置发生改变后,颜色随之改变
    color.setHSL((positions1.getY(i) / radius + 1) / 2, 1.0, 0.5);
    colors1.setXYZ(i, color.r, color.g, color.b)
}

要想适用顶点颜色,必须要对材质进行相应的设置

let material = new THREE.MeshPhongMaterial({
    color: 0xffffff, // 颜色
    flatShading: true, // 是否使用平面着色器渲染
    vertexColors: true, // 是否使用顶点颜色
    shininess: 0 // 高亮程度,值越大越亮
});

向物体中添加另一个物体
案例中存在,创建了一个线框物体和一个实体物体。将线框物体添加到了实体物体里面。

鼠标控制镜头方向
注意是通过添加一个鼠标事件,当鼠标移动后改变相机的位置和朝向

camera.position.x += (mouseX - camera.position.x) * 0.05;
camera.position.y += (-mouseY - camera.position.y) * 0.05;
camera.lookAt(scene.position);
renderer.render(scene, camera);

webgl_geometry_convex

不知道啥情况,明明是一样的代码,官方例子是这样的
在这里插入图片描述
自己的是这样的
在这里插入图片描述

知识点

把官方例子看完,基本上是创建了一些点,给这个点添加了一个颜色贴图。然后创建了两个凸包几何体,一个是外层一个是内层。这样旋转时可以看见变化。

这里的点和凸包几何体全都是添加在组里,这样形成一个整体,旋转时可以一块旋转。

设置轨道的最小距离、最大距离、最大旋转角度

// 添加轨道控制器
 const control = new OrbitControls(camera, renderer.domElement);
 // 设置控制器的最小距离、最大距离、最大旋转角度
 control.minDistance = 20;
 control.maxDistance = 50;
 control.maxPolarAngle = Math.PI / 2;

添加坐标辅助对象

// 添加坐标轴辅助对象
 scene.add(new THREE.AxesHelper(20));

创建点
创建点的过程分为获取点的坐标、创建点。

  • 获取点。先创建了一个12面缓冲几何体,然后删除法线和uv属性。官方解释是:如果不删除,mergeVertics函数无法合并具有不同法线/uv数据的缩进顶点
// 创建半径为10的12面缓冲几何体
 let dodecahedronGeometry = new THREE.DodecahedronGeometry(10);
 // 删除属性
 // 如果未删除法线和uv属性,mergeVertics将无法合并具有不同法线/uv数据的缩进顶点
 dodecahedronGeometry.deleteAttribute('normal');
 dodecahedronGeometry.deleteAttribute('uv');
 // 合并顶点
 dodecahedronGeometry = BufferGeometryUtils.mergeVertices(dodecahedronGeometry);
  • 获取点
// 顶点数组
const vertices = [];
// 获取12面缓冲体的位置属性
const positionAttribute = dodecahedronGeometry.getAttribute('position');
// 获取顶点的位置
for (let i = 0; i < positionAttribute.count; i++) {
    const vertex = new THREE.Vector3();
    // 设置向量的xyz值,(来源属性,索引)
    vertex.fromBufferAttribute(positionAttribute, i);
    vertices.push(vertex);
}
  • 创建点
// 创建点
 const pointsMaterial = new THREE.PointsMaterial({
     color: 0x0080ff,
     map: texture, // 颜色贴图
     size: 1,
     alphaTest: 0.5 // 颜色贴图的alpha通道
 });
 // 通过向量生产12个点
 const pointsGeometry = new THREE.BufferGeometry().setFromPoints(vertices);
 const points = new THREE.Points(pointsGeometry, pointsMaterial);
 // 将点添加到组里
 group.add(points);

在这里插入图片描述

凸包几何体

const meshMaterial = new THREE.MeshLambertMaterial({
     color: 0xffffff,
     opacity: 0.5,
     transparent: true // 设置透明度要设置transparent为true
 });

 // 通过一组点生成凸包几何体,这个是后面
 const meshGeometry = new ConvexGeometry(vertices);
 const mesh1 = new THREE.Mesh(meshGeometry, meshMaterial);
 mesh1.material.side = THREE.BackSide;
 mesh1.renderOrder = 0; // 渲染顺序
 group.add(mesh1);

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

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

相关文章

C 程序设计教程(04)—— C 语言的数据类型(二):构造数据类型

C 程序设计教程&#xff08;04&#xff09;—— C 语言的数据类型&#xff08;二&#xff09;&#xff1a;构造数据类型 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门…

【Go基础】结构体和流程控制语句

文章目录一、结构体1. 结构体创建、访问与修改2. 结构体指针3. 结构体嵌套4. 深拷贝与浅拷贝二、流程控制语句1. if2. switch3. for4. break与continue5. goto与Label一、结构体 1. 结构体创建、访问与修改 定义结构体 type User struct {id intscore float32enrollment tim…

项目实用方式总结

目录 一、后端接收前端请求的方式 1、接收前端传递的单个参数 直接加在url后 通过&#xff1f;拼接 2、接收Json对象 3、一次传递多个数据不使用实例对象的方式 二、vue中使用动态数字 使展示的数字从0动态增长到指定数字 三、在Vue中使用动态数据 四、使用插槽获取表…

项目分享-校园宿舍管理系统

DormitoryManage 一、简介 项目简述&#xff1a; 本系统采用MVCJ2EEMysql实现&#xff0c;使用是Tomcat10.0作为WEB服务器&#xff0c;提供适应性强的Internet服务器功能&#xff0c;具有很高的执行效率。其中&#xff1a; JSP用于页面的设计&#xff0c;展示数据。Java用来处…

Java中String类型比较,equals()和==以及compareTo() 比较的区别

总结&#xff1a; 操作符的作用 用于基本数据类型的比较 判断引用是否指向堆内存的同一块地址。 equals()方法的作用 用于判断两个变量是否是对同一个对象的引用&#xff0c;即堆中的内容是否相同&#xff0c;返回值为布尔类型 compareTo() 方法用于两种方式的比较 字符串与对象…

使用fail2ban保护Domino

大家好&#xff0c;才是真的好。 不少人把Domino服务器直接挂在互联网上&#xff0c;前面不加任何防护&#xff0c;让Domino控制台上不住地显示饱受攻击毒打的惨状。 这些攻击&#xff0c;有从Web HTTP协议进来的攻击&#xff1a; [007577:000017-00007F621246D700] 20.03.20…

蓝牙DID蓝牙认证BQB

零. 概述主要介绍下蓝牙协议栈&#xff08;bluetooth stack&#xff09;传统蓝牙音频协议之蓝牙人机接口设备协议&#xff08;HID&#xff09;概念介绍HID协议有很多应用&#xff0c;比如蓝牙鼠标&#xff0c;键盘&#xff0c;手柄&#xff0c;自拍杆等都会用到HID协议&#xf…

「数据密集型系统搭建」原理篇|OLAP、OLTP,竟然是两个世界

本篇来聊聊OLAP与OLTP的区别以及它们各自的适用场景&#xff0c;以此话题为导引和大家聊聊技术视野与知识储备对于研发同学的重要性&#xff0c;最后站在事务处理与在线分析的角度分别论述下两个数据世界的底层构建逻辑。 OLAP、OLTP的概念与区别 概念 了解OLAP、OLTP的概念&…

Centos安装IotDB(集群版)

文章目录一、前置检查二、集群配置说明1、通用配置2、ConfigNode 配置3、DataNode 配置三、集群操作1、启动Seed-ConfigNode2、增加ConfigNode&#xff08;2个&#xff09;3、增加DataNode(3个)4、验证集群集群安装版本V1.0.0&#xff0c;相关下载地址可查看 单机版安装集群官网…

软件测试之沟通技巧

沟通是一门艺术&#xff0c;良好的沟通有助于快速解决问题&#xff0c;奠定双方长期合作、相互信任的基础。 常见沟通问题&#xff1a; 1、与对方不在同一频道&#xff0c;多见于首次沟通或者了解深度不一致场景下。 2、想当然以为对方了解自己问题&#xff0c;比如消息前后文都…

0基础学Java-02Java基础概念

1.高级语言的编译运行方式编译型&#xff1a;C&#xff08;.c->.obj->运行&#xff09;解释型&#xff1a;Python按行翻译混合型&#xff1a;Java不是直接运行在系统中的&#xff0c;是运行在虚拟机中的Java跨平台原理&#xff1a;通过虚拟机实现的2.JRE和JDKJVM - 核心内…

数组和字符串

1、数组 1.1 集合、列表、数组 集合&#xff1a;由一个或多个确定的元素所构成的整体 集合特点&#xff1a;集合中的元素类型不一定相同&#xff1b;无序 列表&#xff08;又称线性列表&#xff09;&#xff1a;即按照一定的线性顺序&#xff0c;排列而成的数据项的集合。–…

【阅读】《MYSQL技术内幕:InnoDB》索引使用

B树索引使用 不同应用下 OLTP 应用中&#xff0c;查询操作只从数据库中取得一小部分数据&#xff0c;如根据主键值取得用户信息&#xff0c;根据订单号取得订单的详细信息。通常会添加主键索引OLAP 应用中&#xff0c;查询多是面向分析的查询&#xff0c;目的是为决策者提供支…

WordPress网站速度优化教程

网站访问速度是影响网站访客流量的重要因素&#xff0c;几秒内打不开网站会导致很多访客的流失&#xff0c;因此在WordPress程序中网站速度优化尤为重要。 当然服务器地区和配置也会影响访问速度 服务器速度&#xff1a;国内>香港或国外服务器 配置你有钱就上好的&#xff0…

【7.2 指标的应用与设计(15%)-业务数据分析】——CDA

目录 I.大纲 II.可视化图表 2.1 业务图表决策树 2.2 比较 2.3 序列 2.4 构成 2.5 描述 I.大纲 II.可视化图表 2.1 业务图表决策树 分成了4类&#xff1a;比较、序列、构成、描述类 1.比较类&#xff1a;不同对象、项目间 大小多少&#xff0c;好坏关系程度。&#xff…

TikTok Shop美国小店现状如何?

SHOP美国小店现状如何&#xff1f;在2022年11月份&#xff0c;TikTok已经正式公布了TikTok Shop美国站&#xff0c;那么目前情况如何呢&#xff1f;有什么困扰&#xff1f;有参加美国小店闭环测试之后的效果并不乐观的卖家表示&#xff0c;美国电商市场相对稳定&#xff0c;且中…

使用Docker部署前后端分离项目

目录 引言 部署需要用到的镜像汇总 1. Redis部署 &#xff08;1&#xff09;搜索Redis镜像 &#xff08;2&#xff09;拉取Redis镜像 &#xff08;3&#xff09;创建Redis容器 2. MySQL部署 &#xff08;1&#xff09;拉取MySQL镜像、 &#xff08;2&#xff09;查看…

《WebGL编程指南》学习笔记(更新中)

《WebGL编程指南》学习笔记前言1.第一章 WebGL概述1.1 WebGL优势1.2 WebGL起源1.3 WebGL程序结构2.第二章 WebGL入门2.1 了解canvas2.1.1 使用canvas绘制一个长方形2.2 第一个WebGL程序&#xff08;清除画布&#xff09;2.3 绘制一个点&#xff08;版本1——了解着色器&#xf…

k8s之job和cronjob

写在前面 本文一起看下使用k8s来进行作业和定时作业。 1&#xff1a;k8s的业务类型 如果是按照业务类型来划分的话&#xff0c;可以分为离线业务和在线业务&#xff0c;如下&#xff1a; 在线业务&#xff1a;容器启动之后就一直不退出的业务&#xff0c;如Nginx 离线业务&…

XSS-Game 通关教程,XSS-Game level1-18,XSS靶场通关教程

​ 「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a; 此文章已录入专栏 靶场通关教程 XSS-GameXSS-Game level1XSS-Game level2XSS-Game level3XSS-Game level4XSS-…