three.js中的点对象(Point)和点材质(PointsMaterial)

一、点对象和点材质基本介绍

1. 点材质(PointsMaterial):

点材质用于渲染点对象,它决定了点的颜色、透明度等属性。

常用属性有:

  • color: 点的颜色,默认为白色。
  • opacity: 点的透明度,默认为1。
  • size: 点的大小,可以使用PointScaleAttenuation属性同时调整大小。
  • sizeAttenuation: 是否使用点大小衰减(根据相机远近自动调整点的大小),默认为true。
  • map: 对点纹理进行设置,可以使用贴图来代替单色点,如星空。

举例说明:

var material = new THREE.PointsMaterial({ color: 0xffffff, size: 0.1 
}); 

2. 点对象(Three.Point):

点对象用于渲染单个点,可以通过添加多个点对象来形成点云。

常用属性有:

  • position: 点的位置,可以是THREE.Vector3类型的变量。
  • color: 点的颜色,使用PointsMaterial的color属性进行设置,默认为白色。
  • size: 点的大小,使用PointsMaterial的size属性进行设置,默认为1。

举例说明:

var pointGeometry = new THREE.Geometry(); 
pointGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) ); 
var pointMaterial = new THREE.PointsMaterial( { size: 5, color: 0xff0000 } ); 
var point = new THREE.Points( pointGeometry, pointMaterial ); 

3. 基本运用示例

1. 步骤详解

首先我们需要创建一个场景、相机和渲染器:

// 1、创建场景
const scene = new THREE.Scene();// 2、创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);// 设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera);// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;
renderer.physicallyCorrectLights = true;// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);

接着,我们需要创建一个球体,和定义一个点材质,

// 创建球几何体
const sphereGeometry = new THREE.SphereBufferGeometry(3, 30, 30);// 设置点材质
const pointsMaterial = new THREE.PointsMaterial();
pointsMaterial.size = 0.1; // 设置点的大小
// 相机深度而衰减
pointsMaterial.sizeAttenuation = true; // 设置点的大小是否随着距离的增加而减小

将几何体和材质传入点对象,并将点对象添加到场景中

const points = new THREE.Points(sphereGeometry, pointsMaterial); // 将几何体和材质传入点对象scene.add(points); // 将点对象添加到场景中

最后创建轨道控制器控制物体,和创建渲染函数,渲染场景和相机

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。
controls.enableDamping = true;function render() { // 渲染函数controls.update(); // 更新控制器renderer.render(scene, camera); // 渲染器渲染场景和相机//   渲染下一帧的时候就会调用render函数requestAnimationFrame(render);
}render();

2.效果如图:

在这里插入图片描述

3.完整示例代码

import * as THREE from "three";
// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 导入动画库
import gsap from "gsap";
// 导入dat.gui
import * as dat from "dat.gui";// 目标:认识pointesconst gui = new dat.GUI();
// 1、创建场景
const scene = new THREE.Scene();// 2、创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);// 设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera);// 创建球几何体
const sphereGeometry = new THREE.SphereBufferGeometry(3, 30, 30);// 设置点材质
const pointsMaterial = new THREE.PointsMaterial();
pointsMaterial.size = 0.1; // 设置点的尺寸大小,默认为1
// 相机深度而衰减
pointsMaterial.sizeAttenuation = true;const points = new THREE.Points(sphereGeometry, pointsMaterial); // 将几何体和材质传入点对象scene.add(points);// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;
renderer.physicallyCorrectLights = true;// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。
controls.enableDamping = true;function render() {controls.update();renderer.render(scene, camera);//   渲染下一帧的时候就会调用render函数requestAnimationFrame(render);
}render();// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {//   console.log("画面变化了");// 更新摄像头camera.aspect = window.innerWidth / window.innerHeight;//   更新摄像机的投影矩阵camera.updateProjectionMatrix();//   更新渲染器renderer.setSize(window.innerWidth, window.innerHeight);//   设置渲染器的像素比renderer.setPixelRatio(window.devicePixelRatio);
});

如上面的示例,我们用点材质(pointsMaterial)和点对象(point)结合 球体(THREE.SphereBufferGeometry(3, 30, 30))实现了以点的形式构建一个球体,我们放大球体看看
在这里插入图片描述
可以看到每个点其实是由小立方体组成的。

好啦 本章节就介绍这么多,下一章详细介绍一下点材质的各个属性的作用

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

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

相关文章

Vue工程创建及应用

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…

成为优秀领导者必备的五个能力要素

领导力是现代社会不可或缺的一部分。在企业、政府、学术机构等各个领域中,领导力都是影响组织成功的关键因素之一。而要成为一名优秀的领导者,需要具备一系列重要的能力与素质。 本文将简单介绍领导力的五要素,要进一步学习领导力&#xff0…

七、云尚办公-Activiti入门

云尚办公系统:Activiti入门 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!&am…

selenium三大等待

目录 前言: 一、强制等待:sleep(秒) 二、智能等待:显性等待 三、智能等待:隐形等待 前言: 在Selenium自动化测试中,等待是非常重要的一部分,它能够确保在需要时等待页面或元素的加载完成或…

Grafana嵌入iframe,websoket连接报错400或403(nginx代理)

1、custom.ini配置文件修改allowed_origins* 2、 nginx中增加配置,如下:

网络犯罪分子在新的代理劫持活动中劫持脆弱的SSH服务器

一个活跃的金融活动针对的是脆弱的SSH服务器,以隐蔽地将它们纳入一个代理网络。 "Akamai研究员Allen West在周四的一份报告中说:"这是一个活跃的活动,攻击者利用SSH进行远程访问,运行恶意脚本,隐蔽地将受害…

【AI底层逻辑】——篇章3(下):信息交换信息加密解密信息中的噪声

续:【AI底层逻辑】——篇章3(上):数据、信息与知识&香农信息论&信息熵 目录 三、信息是如何交换的 1、互联网与信息交换 2、哈夫曼和有效编码 四、信息的加密与解密 1、密码学的发展 2、可以被公开的密钥 五、信息…

sql server 触发器往链接服务器同步数据的坑

链接服务器无法启动分布式服务 检查数据库是否勾选了一下按钮,双方都要检查 链接服务器属性,需要检查这些地方是否已经设置为true 该伙伴事务管理器已经禁止了它对远程/网络事务的支持 双方启动MSDTC服务 (1)在windows控制面版–>windows 工具->…

Elasticsearch 集群日志收集搭建

Elasticsearch-7.2.0Logstash-7.2.0Kibana-7.2.0-Filebeat-7.6.0 第一台集群内网ip:10.0.0.223 ES配置文件:/es_data/es/elasticsearch-7.2.0/config/elasticsearch.yml ES启动命令:/es_data/es/elasticsearch-7.2.0/bin/elasticsearch cl…

elasticsearch7.17.3实现按terms传入内容排序,类似mysql中order by filed()的排序方式

现有一个需求,需要在elasticsearch中实现用terms筛选内容,并且按terms传入的内容顺序排列 类型于mysql中order by filed()的排序方式,具体实现如下 目录 一、需求二、整体思路三、es查询语句四、java生成es连接五、java调用es六、最终实现结果…

linux上虚拟机vmware-workstation离线安装详细教程

linux上虚拟机vmware-workstation详细教程 一、VMWare基本介绍二、VMWare下载2.1 查看本地系统信息2.2 选择及下载合适的版本 三、VMWare安装3.1 安装依赖库3.2 vmware安装3.3 验证安装3.4 异常及解决方案3.4.1 Failed to start SYSV3.4.2 GLib does not have GSettings suppor…

Nacos架构与原理 - Nacos-Sync

文章目录 概述官网系统模块架构同步任务管理页面注册中心管理页面使用场景 概述 NacosSync 是⼀个支持多种注册中心的同步组件,基于 Spring boot 开发框架,数据层采用Spring Data JPA ,遵循了标准的 JPA 访问规范,支持多种数据源存储,默认使用Hibernate…