Threejs 动态修改InstanceMesh实例化几何体中单个实例的颜色

news2024/12/24 3:06:26

 目录

InstanceMesh多实例

场景

思路

注意点

实现

效果


InstanceMesh多实例

instanceMesh 是使用InstancedMesh类来创建实例化的几何体。它适用于当需要大量重复的几何体时,但是每个实例之间有不同的变换属性(如位置、旋转、缩放等)

场景

在InstanceMesh多实例创建后,动态修改某个实例的颜色

思路

  1. InstanceMesh外层材质颜色置为白色,创建时调用setColorAt对每个实例设置color
  2. 要创建后修改,需要为InstanceMesh添加一个数组,按序存放每个小实例的id
  3. 根据id检索数组,获取当前实例在多实例中的索引
  4. setColorAt(index, color) 修改单个实例颜色

注意点

1. 第一次调用setColorAt()方法,会创建一个多实例的 InstanceColor 颜色缓冲对象数据,用于后续存放维护每个实例的 r g b 三个颜色分量,创建时,会对所有实例的颜色分量都会默认初始为0!!!看源代码

 setColorAt: function ( index, color ) {
  // 没有执行前,InstanceColor都默认为null

  if ( this.instanceColor === null ) {
   // 第一次执行会走这里,初始化一个 小实例的数量count * 3 的颜色分量缓冲,数组默认都是0
   this.instanceColor = new THREE.BufferAttribute( new Float32Array( this.count * 3 ), 3 );

  }
  // 修改颜色缓冲,设置实例索引为index对应的rgb分量
  color.toArray( this.instanceColor.array, index * 3 );

 }

这也注定了一个现象,InstanceMesh无论是创建时还是创建后(创建后,默认创建时没有对每个实例设置颜色,只由外层的InstanceMesh材质颜色决定),你不可以只设置一个小实例的颜色,即setColorAt不可只调用一次,需要为每个实例指定setColorAt,否则除了当前实例,所有实例的颜色都会置为黑色!

2. 要正确实现动态修改实例颜色的效果,创建时,需要把 InstanceMesh材质颜色设置为白色,每个实例的颜色为本色,未来某时刻,要控制单个实例时,直接调用setColorAt对单个实例修改颜色即可

特别注意:最终实例显示的颜色,受材质和单实例颜色的叠加影响:若材质和实例的颜色都是非白色,实例会显示为黑色!所以必须要把材质的颜色置为白色。

实现

InstanceMesh添加Ids

    const instanceIds = item.geomList.map(geom => geom.id)
    instanceHeadMesh['instanceIds'] = instanceIds // id 映射
    instanceHeadMesh.material.color = new Color(0xffffff)
    instanceHeadMesh.setColorAt(i, new Color(1, 1, 0)) // 不高亮的颜色,本色

 

修改某个实例颜色

    // instanceMesh为InstanceMesh大实例
    const instanceIds = instanceMesh.instanceIds
    // mergeId.value 是 要高亮实例的id
    let instanceIndex = instanceIds.findIndex(id => id == mergeId.value)
    instanceMesh.setColorAt(instanceIndex, new Color(0, 0, 1))

效果

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

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

相关文章

LangChain:大模型框架的深度解析与应用探索

在数字化的时代浪潮中,人工智能技术正以前所未有的速度蓬勃发展,而大模型作为其中的翘楚,以生成式对话技术逐渐成为推动行业乃至整个社会进步的核心力量。再往近一点来说,在公司,不少产品都戴上了人工智能的帽子&#…

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现&#…

模拟无线音频传输实验

zkhengyang进数字音频系统研究开发交流答疑群(课题组) 一个单管调频无线话筒模块一台调频收音机,全部自己动手制作调试,无线话筒模块可以接话筒mic,人讲话,收音机接受到语音信号, 或者直接输入模拟音频音乐信号&#…

CentOS 8.5 安装配置 squid 6.9 代理服务器 Windows10 系统设置http代理 详细教程

1 下载地址: 官网下载 2 通过xftp等方式上传到服务器 #查看环境 [rootlocalhost ~]# cat /etc/redhat-release CentOS Stream release 8 [rootlocalhost ~]# uname -a Linux localhost.localdomain 4.18.0-552.el8.x86_64 #1 SMP Sun Apr 7 19:39:51 UTC 2024 x86_64 x86_6…

24寸2K显示器 - HKC G24H2

🔥🖥️ 嘿,大家好!今天,我要给大家介绍一款超棒的显示器——HKCG24H2!这款显示器可是个全能选手,无论你是工作狂人还是游戏迷,它都能满足你的需求! 😎&#x…

AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

AWTK-HMI 内置了不少模型,利用这些模型开发应用程序,不需要编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。 本文档介绍如何使用 C 语言自定义命令。 1. 实现 hmi_model_cmd_t 接口 1.1…

wordpress主题 7B2 PRO主题5.4.2免授权直接安装

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 WordPress 资讯、资源、社交、商城、圈子、导航等多功能商用主题:B2 PRO 其设计风格专业且时尚,功能十分强大,包括多栏布局、自定义页面、强大的主…

250 基于matlab的5种时频分析方法((短时傅里叶变换)STFT

基于matlab的5种时频分析方法((短时傅里叶变换)STFT,Gabor展开和小波变换,Wigner-Ville(WVD),伪Wigner-Ville分布(PWVD),平滑伪Wigner-Ville分布(SPWVD),每条程序都有详细的说明,设置仿真信号进行时频输出。…

Netty核心组件介绍

Netty是一款用于创建高性能网络应用程序的高级框架。Netty的核心组件如下: Channel回调Future事件和ChannelHander Channel channel是Java NIO的一个基本构造。可以把Channel看作是传入或传出数据的载体。它可以被打开或关闭,连接或断开连接。 回调 …

JVM---垃圾回收

目录 一、C/C的内存管理 二、Java的内存管理 三、垃圾回收的对比 四、Java的内存管理和自动垃圾回收 五、方法区的回收 手动触发回收 六、堆回收 如何判断堆上的对象可以回收? 引用计数法 可达性分析算法 五种对象引用 软引用 软引用的使用场景-缓存 弱引用 虚…

window.location.href的介绍及使用

目录 介绍: 获取当前 URL 设置新的 URL URL 的组成部分 解析 URL 参数 什么是片段标识符的URL? 使用new URL: 输出的部分解释: 假如我们需要获取路径上的最后一级的路径名: 介绍: window.location.h…

vscode默认终端设置为cmd的方法

vscode默认终端是powershell,执行某些命令时会提示权限等问题,如果更习惯使用cmd终端的话,可以将默认终端配置为cmd。 方法一: 方法二: 如果你想更改默认的终端,可以通过以下步骤操作: 打开 VSCode。使用…

【QT学习】补充:qt使用已经存在的类

1.右键项目--》添加现有文件 注意:不是添加新文件!!! 2.添加配置

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包:搜狗输入法linux-首页 安装:sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启,但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可

【免费Java系列】大家好 ,今天是学习面向对象高级的第十二天点赞收藏关注,持续更新作品 !

这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day10-多线程 一、多线程常用方法 下面我们演示一下getName()、setName(String name)、currentThread()、sleep(long time)这些方法的使用效果。 public class MyThread extends Thread{publi…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归(Linear Regressio…

Linux·基本指令

从本节开始将新开一个关于Linux操作系统的板块,其实Linux也没什么太神秘的,就是一个操作系统(OS)嘛,跟Windows操作系统是一个概念,只不过Windows中的大部分操作都是用光标点击来进行人机交互,但是Linux是通过输入命令行…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下,ChatGPT、Sora、Gemini、文言一心 等新技…

LoRaWAN入门

1.文档资料 飞书云文档 (feishu.cn) G43室内LoRaWAN网关 - doc.alinkwise.com > LoRaWAN网关(基站) > G4x > G43室内LoRaWAN网关 2.简介 LoRa: 远距离无线电(long rang radio), 它最大特点就是在同样的功耗条件下比其他无线方式…

《构建合同中台系统:实现合同管理的集成化与智能化》

随着企业数字化转型的深入推进,合同管理作为企业日常运营的重要组成部分,也在不断演进与升级。传统的合同管理方式已经无法满足企业对于效率、合规性和智能化的需求,因此,构建合同中台系统成为了当下企业迫切需要解决的问题。 **1…