如何在 Three.js 中覆盖 GLTF 材质

2023-11-24

我正在尝试创建一种动态方式来在 Three.js 中的 gltf 导入模型上显示太阳能数据。目的是将不同的纯色与模型的不同部分相关联,并能够关闭和打开它们。我当前的障碍是改变 gltf 中材质的颜色。

我尝试使用 ObjLoader 来代替,以便我可以输入自己的材料,但这不起作用:/

这是我目前拥有的js:

        const gltfLoader = new THREE.GLTFLoader();
        gltfLoader.load('Building.glb', (gltf) => {
            const root = gltf.scene;
            scene.add(root);

            const box = new THREE.Box3().setFromObject(root);
            const boxSize = box.getSize(new THREE.Vector3()).length();
            const boxCenter = box.getCenter(new THREE.Vector3());

            frameArea(boxSize * 0.5, boxSize, boxCenter, camera);

            controls.maxDistance = boxSize * 10;
            controls.target.copy(boxCenter);
            controls.update();
          });


    function frameArea(sizeToFitOnScreen, boxSize, boxCenter, camera) {
        const halfSizeToFitOnScreen = sizeToFitOnScreen * 0.5;
        const halfFovY = THREE.Math.degToRad(camera.fov * .5);
        const distance = halfSizeToFitOnScreen / Math.tan(halfFovY);
        const direction = (new THREE.Vector3())
        .subVectors(camera.position, boxCenter)
        .multiply(new THREE.Vector3(1, 0, 1))
        .normalize();

        camera.position.copy(direction.multiplyScalar(distance).add(boxCenter));

        camera.near = boxSize / 100;
        camera.far = boxSize * 100;

        camera.updateProjectionMatrix();

        // point the camera to look at the center of the box
        camera.lookAt(boxCenter.x, boxCenter.y, boxCenter.z);
    }

    renderer = new THREE.WebGLRenderer({canvas: myCanvas, antialias: true});
    renderer.setClearColor(0x000000);
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild( renderer.domElement );



    function resizeRendererToDisplaySize(renderer) {
        const canvas = renderer.domElement;
        const width = canvas.clientWidth;
        const height = canvas.clientHeight;
        const needResize = canvas.width !== width || canvas.height !== height;
        if (needResize) {
          renderer.setSize(width, height, false);
      }
      return needResize;
    }

    function render() {
        if (resizeRendererToDisplaySize(renderer)) {
            const canvas = renderer.domElement;
            camera.aspect = canvas.clientWidth / canvas.clientHeight;
             camera.updateProjectionMatrix();
            }
            renderer.render(scene, camera);
            requestAnimationFrame(render);
         }
         requestAnimationFrame(render);

The gltf.scene加载器返回的结果是THREE.Scene实例 – 一旦拥有它,使用什么文件格式加载模型就不再重要了。在这种情况下,您需要遍历该场景并更改其中任何网格的材质。这MeshStandardMaterial and Mesh文档可能会有所帮助。

var model = gltf.scene;
var newMaterial = new THREE.MeshStandardMaterial({color: 0xff0000});
model.traverse((o) => {
  if (o.isMesh) o.material = newMaterial;
});

如果您需要更改纹理,请注意中的说明GLTFLoader文档.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Three.js 中覆盖 GLTF 材质 的相关文章

  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • Three.js ShaderMaterial 灯光问题

    你好 这是我的代码的一部分 地球仪 function createGlobe var normalMap THREE ImageUtils loadTexture images earth normal 2048 jpg var surfa
  • 在 Three.js 中针对“子场景”进行光线投射

    因此 我正在使用 Three js 示例中的 webgl interactive cubes html 并且我有一个相对简单的问题 是否可以测试光线与对象的子对象的相交 例如 如果我做类似的事情 for var i 0 i lt 2000
  • 使用 Three.js 在片段着色器中手动选择 mipmap 的 lod

    我正在使用 Three js 中的 glsl es 编写一个基于物理的着色器 为了添加镜面全局照明 我使用内部带有 mipmap 链的立方体贴图 dds 纹理 按照 CubeMapGen 的说明进行预先计算here http seblaga
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 三个js如何手动添加三角形到BufferGeometry

    我一直在尝试找到使用 Three js 更改网格顶点的最快方法 我发现 如果我更改 mesh geometry attributes position array 的部分内容 然后设置 mesh geometry attributes po
  • Material.alphaTest 是什么意思?

    在过去的几天里 我一直在非相交对象的透明度方面遇到重大问题 我遇到了设置的建议alphaTest将材料的值调整为0 5 从而解决了问题 太好了 但我想更好地理解它的含义以及它如何如此优雅地解决问题 有人可以建议吗 从一个简单的实验来看 这似
  • 将球体上的 3d 点转换为 UV 坐标

    我在球体上有一个 3d 点 想要将其转换为球体纹理上的 UV 点 有人可以指出正确的方向吗 我可以采用纯数学解决方案 Edit 我目前有这个 它不会返回正确的 UV 坐标 p 是球体上的 3d 点 mesh position 是球体的位置
  • 如何沿着简单的路径移动相机

    如何沿着简单的路径 由顶点 点数组创建 移动相机 我需要自动移动它 而不是像第一人称射击游戏那样通过键盘 鼠标事件来移动它 找了这个例子 http trijs org examples webgl geometry extrude spli
  • 将球体 a 旋转到自身的 b 点

    我试图弄清楚如何将球体从 A 点旋转到 B 点 我找到了一些Unity3d代码 Quaternion rot Quaternion FromToRotation pointA pointB sphere transform rotation
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • Three.js:通过触摸和设备方向旋转相机

    我正在使用 Threejs 制作一个 3D 项目 它允许使用计算机设备的鼠标控制相机 还允许使用触摸事件和智能手机的设备方向事件进行控制 举个例子 这个网站 http lacostewinter seeourwork cn en intro
  • 如何计算给定坐标处相机可见矩形的大小? [复制]

    这个问题在这里已经有答案了 我制作了一个小型的 Three js 应用程序 它将一堆圆圈从画布的底部移动到顶部 let renderer scene light circles camera initialize animate funct
  • 三.JS Shadow 到对象

    我想添加castShadow and receiveShadow在一个物体上 但是下面的代码有什么问题吗 var mtlLoader new THREE MTLLoader mtlLoader setPath objects Tree mt
  • 在 ant 脚本中使用最新的 Rhino

    我试图在 ant 标签中使用最新版本的 Rhino 但它似乎使用与 JVM 捆绑在一起的 Rhino 版本 我尝试调整类路径以指定 Rhino 脚本 jar 目前 我已尝试以下操作
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • Three.js - 如何翻译几何图形

    我有一个脚本 可以定位各种宽度 高度和深度的立方体 并且正在努力根据 xAxis yAxis 和 zAxis 也有所不同 将它们准确地排列起来 var geometry new THREE BoxGeometry width height
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 递归方法比交互式方法慢 10 倍 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 代码已尽可
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2

随机推荐

  • 为什么当我在此处将 CREATE PROCEDURE 语句与 IF 语句一起使用时,它会失败?

    我试图删除存储过程 如果存在 然后通过以下方式创建它 IF OBJECT ID dbo myStoredProc IS not NULL DROP PROCEDURE dbo myStoredProc CREATE PROCEDURE db
  • 将 PHP cURL 请求从 SSLv3 更新为 TLS..?

    因为最近在 SSLv3 中发现的漏洞 许多网络服务提供商 即 PayPal Facebook Google 正在禁用该功能 并希望我们改用 TLS 我在弄清楚如何执行此操作时遇到了一些麻烦 我目前正在使用以下函数来处理我的 cURL 请求
  • 添加事件监听器到事件监听器添加的表单元素

    我正在构建一个 Symfony 应用程序 并使用表单事件和一些 jquery ajax 来完成整个 状态 地点 的事情 不过 我有一个小问题 我使用的格式是省 gt 城市 gt 郊区 现在 据我所知 我的代码很好 但是当执行到达我向 城市
  • 使用 twig 和 Slim 框架上传文件(版本 2)- PHP

    我正在使用 UserFrosting 一个用户管理系统 但在通过表单发布上传文件时遇到一些问题 这就是我尝试过的 这就是我的树枝文件的样子
  • 如何并行等待多个阻塞队列?

    我有两个独立的阻塞队列 客户端通常使用第一个或第二个阻塞队列来检索要处理的元素 在某些情况下 客户端对两个阻塞队列中的元素感兴趣 无论哪个队列首先提供数据 客户端如何并行等待两个队列 您可以尝试使用poll某种循环中的方法 仅在轮询另一个队
  • 可选实体框架复杂类型所需的属性

    我想定义 Required 实体框架中复杂类型的属性 例如 我有一个Customer具有可选实体Address 地址实体有一个必需的PostCode财产 ComplexType public class Address public str
  • 如何在java eclipse中将其他maven项目的依赖添加到我当前的maven项目中?

    我想在我的maven项目1中使用maven项目2类 这样我就可以将它用作父类 你能告诉我如何使用 eclipse 和 JAVA 来做到这一点吗 请写下逐步导航 因为我是 Maven 新手 提前致谢 我知道为时已晚但这可以帮助其他正在寻找同样
  • Excel VBA高效获取文件名函数

    我需要使用 Excel 2010 中的 VBA 从远程服务器上的文件夹中获取文件名集合 我有一个可以工作的函数 并且在大多数情况下它可以完成这项工作 但是远程服务器经常出现糟糕的情况 terrible网络性能问题 这意味着循环遍历 300
  • 异常处理指南 - Python 与 Java

    我是原始的 Java 开发人员 对我来说 Java 中的检查异常显然 很容易让我决定捕获它或将其扔给调用者稍后处理 然后是Python 没有受检查的异常 所以从概念上讲 没有什么会强迫你处理任何事情 根据我的经验 如果不检查文档 你甚至不知
  • 获取backstack中最新的fragment

    如何获取添加到 backstack 中的最新片段实例 如果我不知道片段标签和 id FragmentManager fragManager activity getSupportFragmentManager FragmentTransac
  • Android:如何制作 GroupBox 小部件?

    Android 似乎没有提供如此有用的小部件 但是 我的屏幕设计需要这样的视图 此外 交互设计要求根据其他数据显示和隐藏此类框 当然 我可以从 XML 布局中的单独元素 例如 从其上的形状和文本视图 构造这样的框 但管理它们的可见性会变得很
  • PhpMyAdmin 错误:令牌不匹配

    我最近在 xampp 上的 apache 上安装的本地安装中遇到错误 我正在运行 phpmyadmin v4 0 5 错误描述为错误 令牌不匹配 有其他人经历过这个并找到解决办法吗 您可以尝试以下方法 找到 XAMPP php ini 文件
  • 在 RMarkdown 的输出中显示代码块名称

    正如 RMarkdown 中所知 代码块可以这样命名 r chunkname plot x y 是否可以在输出文档中显示块名称 您可以使用knitr opts current get label example r cars library
  • 什么 Java 数据类型对应于 Oracle SQL 数据类型 NUMERIC?

    Oracle JDBC 驱动程序将什么 Java 数据类型分配给 Oracle SQL 数据类型NUMERIC 这会随着尺寸的变化而变化吗NUMERIC type 正如其他人已经说过的 驱动程序将所有内容映射到 BigDecimal 即使它
  • macOS 上的 Clang 无法从 ncurses 链接 lmenu

    我是使用 ncurses 库的新手 所以我一直在尝试重新创建此页面上的一些示例 http www tldp org HOWTO NCURSES Programming HOWTO index html 我已经获得了有关创建菜单的部分 特别是
  • 我想找到填充或搜索,猫鼬

    我的模型代码 var user mongoose Schema email password name company position phoneNumber signDate Date friends type mongoose Sch
  • 如何读取 Python 请求的响应?

    我有两个 Python 脚本 一个使用的是urllib2库一个使用请求库 我发现 Requests 更容易实现 但我找不到 urlib2 的等效项read 功能 例如 response url urlopen req print respo
  • 为什么 Linux 内核中没有零拷贝网络? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想知道为什么linux内核 或任何其他主流操作系统 没有零拷贝网络功能的原因 我所说的零复制是指 数据包 数据流不会被复制以传递到用户空间中的应用程序 但例如使用内存池类型的分配器在内核
  • C++11 和 C++03 在对 std::string 小字符串优化的支持方面有所不同?

    在C 11标准的兼容性附录中 C 03到C 11的变化之一描述如下 C 2 11 第 21 条 字符串库 21 4 1 Change 放宽 basic string 失效规则 基本原理 允许小字符串优化 对原始特征的影响 可以执行有效的 C
  • 如何在 Three.js 中覆盖 GLTF 材质

    我正在尝试创建一种动态方式来在 Three js 中的 gltf 导入模型上显示太阳能数据 目的是将不同的纯色与模型的不同部分相关联 并能够关闭和打开它们 我当前的障碍是改变 gltf 中材质的颜色 我尝试使用 ObjLoader 来代替