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

 目录

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都默认为nullif ( this.instanceColor === null ) {// 第一次执行会走这里,初始化一个 小实例的数量count * 3 的颜色分量缓冲,数组默认都是0this.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 是 要高亮实例的idlet instanceIndex = instanceIds.findIndex(id => id == mergeId.value)instanceMesh.setColorAt(instanceIndex, new Color(0, 0, 1))

效果

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

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

相关文章

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用,然后启动应用,注意启动docker引擎 打开右上角的设置,进入Docker Engine设…

【系统分析师】软件架构设计

文章目录 1、构件与软件复用1.1 主流构件标准1.2 构件获取与管理1.3 构件复用的方法 2、软件架构概述3、软件架构建模4、软件架构风格4.1 经典架构风格4.2 层次架构风格4.3 富互联网应用-RIA 5、面向服务的架构5.1 SOA概述5.2 SOA的关键技术5.3 SOA的实现方法 6、软件架构评估6…

Golang | Leetcode Golang题解之第83题删除排序链表中的重复元素

题目: 题解: func deleteDuplicates(head *ListNode) *ListNode {if head nil {return nil}cur : headfor cur.Next ! nil {if cur.Val cur.Next.Val {cur.Next cur.Next.Next} else {cur cur.Next}}return head }

前端开发工程师——ajax

express框架 终端输入 npm init --yes npm i express 请求报文/响应报文 // 1.引入express const express require(express);// 2.创建应用对象 const app express();// 3.创建路由规则 // request:是对请求报文的封装 // response:是对响应报文的封装 app.get(…

【数据结构】浅谈

✨✨✨专栏:数据结构 🧑‍🎓个人主页:SWsunlight 目录 一、概念: 二、物理结构: 1、顺序存储结构: 2、链式存储结构: 3、数据索引存储结构: 4、数据散列存储结构&#xf…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M,GitHub 是会被限制推送到仓库中的,大概率情况会显示下面的错误: remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

声明变量的六种方法

ES6 声明变量的六种方法 varfunctionletconstclassimport 顶层对象的属性 1. ES6 声明变量的六种方法 ES5 只有两种声明变量的方法: var 命令和 function 命令。 ES6 除了添加 let 和 const 命令,还有另外两种声明变量的方法: import 命令和…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时,你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

Python专题:八、列表(1)

Python的内置数据类型 数据类型:列表 list类型 可以是字符串,浮点数,整数,列表 列表特性 ①集合性的数据类型 ②列表是有序的 ③列表是可更新的 访问列表元素的方式也是[索引],也是从0开始的,不能超过…

【前端】桌面版docker并部署前端项目

环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个,不然一直转圈圈 镜像配置加速,在settings—>docker engine下 {"builder": {"gc": {"defaultKee…

二叉树介绍

引入 定义 区别 定义不同 形态不同 基本形态

自动驾驶中的神经辐射场:综述

24年4月清华大学论文“Neural Radiance Field in Autonomous Driving: A Survey”。 神经辐射场(NeRF)由于其固有的优势,特别是其隐式表示和新视图合成能力,引起了学术界和工业界的广泛关注。 随着深度学习的快速发展&#xff0c…

攻防世界-web-unseping

题目 知识点 PHP代码审计PHP序列化和反序列化PHP中魔术方法命令执行绕过方式 解读源码 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function …

视频资源汇聚平台常见的几种接入方式

视频资源汇聚平台 视频汇聚平台可以实现海量资源的接入、汇聚、存储、处理、分析、运维等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP、ONVIF、RTMP、FLV、WEBSOCKET等&#xff0c;以及厂家私有协议与SDK接…

网络安全的未来:挑战、策略与创新

引言&#xff1a; 在数字化时代&#xff0c;网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化&#xff0c;如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样&#xff0c;包括但不限于恶意软件、…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

【Linux:lesson1】的基本指令

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;打开Xshell&#xff0c;登陆root…

ASP.NET WebApi 如何使用 OAuth2.0 认证

前言 OAuth 2.0 是一种开放标准的授权框架&#xff0c;用于授权第三方应用程序访问受保护资源的流程。 OAuth 2.0 认证是指在这个框架下进行的身份验证和授权过程。 在 OAuth 2.0 认证中&#xff0c;涉及以下主要参与方&#xff1a; 资源所有者&#xff08;Resource Owner&…

springboot 引入第三方bean

如何进行第三方bean的定义 参数进行自动装配

PCB检查

文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bound_top/bottom 检查元件是否超过这个允许范围d.…