Three.js:为 BufferGeometry 设置索引/索引的正确方法?

2024-03-31

我正在尝试在 BufferGeometry 中设置每个面的 UV 索引。

我从几何开始。我的几何体的每个面都有一个face.materialIndex对应于紫外线指数。我正在尝试将其转换为 BufferGeometry,然后映射到face.materialIndex to the BufferGeometry.

这是我到目前为止所拥有的:

// Convert geometry > buffergeometry
const bufGeo = new BufferGeometry().fromGeometry( geometry );

// Get an array of all the original geometry's indices...
const faceIndices = geometry.faces.map( face => face.materialIndex );

// Build a new array with the indices...
const indices = new Uint16Array( faceIndices );

// Apply to the BufferGeometry
bufGeo.setIndex( new BufferAttribute( indices, 1 ) );

现在这似乎破坏了我的网格并使其根本无法绘制。我究竟做错了什么?

顺便说一句,在幕后,当 Geometry 转换为 BufferGeometry 时,Three.js 首先将其置于称为 a 的中间格式中DirectGeometry。这用于复制索引,但是由于 Doob 先生在本次提交中未知的原因而将其删除 https://github.com/mrdoob/three.js/commit/ed0b2eafe895de62bd5dbe63db14501f28647573#diff-f0786190348a02468cbe264506044e6cL302。现在,Three 似乎在 Geo > BufGeo 转换中完全放弃了索引。

我还尝试使用该提交中的代码(修改为使用 setIndex):

const indices = new Uint16Array( faceIndices.length * 3 );
bufGeo.addAttribute( 'index', new BufferAttribute( indices, 1 ).copyIndicesArray( faceIndices ) );

但我也有同样的问题。生成的网格被破坏。


The setIndex函数用于指定引用 BufferGeometry 上顶点属性缓冲区的三角形索引。在您的示例中,您将三角形索引数组设置为从materialIndex每一张脸。

MaterialIndex 对应于材质数组中用于渲染该三角形的材质,而不是 UV 索引。来自Face3 文档 https://threejs.org/docs/#api/core/Face3:

materialIndex —(可选)与面关联的材质数组的索引。

很有可能的是materialIndex对于每个面来说,它都是零,除非你做了一些改变,这可以解释为什么你的模型停止绘制(面上的顶点都是相同的)。

这行是你的问题:

// Get an array of all the original geometry's indices... const faceIndices = geometry.faces.map( face => face.materialIndex );

还需要注意的是,通过这种方式生成数组,您将获得属性所需数量的 1/3 数组元素,因为每个面有 3 个顶点。

可能的解决方案

  • 如果您希望使用不同的材质渲染每个面,如materialIndex对应,那么我会调查BufferGeometry 组 https://threejs.org/docs/#api/core/BufferGeometry.groups

  • 如果你想实际为 BufferGeometry 生成自定义 UV 坐标,我会研究一下缓冲区属性 https://threejs.org/docs/#api/core/BufferAttributeBufferGeometry.addAttribute https://threejs.org/docs/#api/core/BufferGeometry.addAttribute函数添加新的 UV 属性。

希望有帮助!

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

Three.js:为 BufferGeometry 设置索引/索引的正确方法? 的相关文章

  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • Three.js 中的文本几何

    我在 Three js r74 中的 TextGeometry 遇到一些问题 我该如何正确实施 这是我的代码笔 codepen io cheesyeyes pen eJqZxK 提前致谢 好吧 对于每个正在寻找简单答案而不是链接和其他超载示
  • 深度图三.js

    Three js中有没有办法获取深度图 我感兴趣的是制作类似于 Kinect 为给定场景制作的东西 我遇到了一种不使用颜色和雾来模仿这一点的黑客方法 但这并不理想 因为它会使用两个不同的场景并且会因光照而变化 我认为执行此操作的另一种方法是
  • 如何在 Three.js 中将 geoJSON 绘制为网格而不是线条,并填充颜色?

    我正在使用 Three js 制作一个地球仪 并将添加一些数据层 所有图层都将从 geoJSON 创建 我已将其设置为使地球仪 第一个数据文件 包含国家 地区 显示为线条 这使用三GeoJSON https github com jdomi
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 三.js环境光意想不到的效果

    在下面的代码中 我渲染了一些立方体并使用点光源和环境光照亮它们 然而 当设置为 0xffffff 时 AmbientLight 会将侧面的颜色更改为白色 无论其指定的颜色如何 奇怪的是 点光源按预期工作 我怎样才能使环境光表现得像点光 因为
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2
  • 如何使用三个JS导出然后导入场景?

    我有一个用三个 JS 和大量 Javascript 代码构建的复杂 3D 场景 我需要将此场景导出为一个文件 然后通过简单的 ThreeJS 场景播放器在我的网站上使用它 我尝试过 ObjectExporter 和 SceneExporte
  • 如何在 Three.js 中进入全屏?

    我已经尝试了数十种不同的方法几个小时 但没有一个有效 如下所示 document body addEventListener keydown function THREEx FullScreen request false 如何让Three
  • Three.js获取立方体的4个角坐标?

    如何获得立方体四个角的坐标 如果您使用 CubeGeometry 宽度 高度 深度 并将立方体放置在某处 那么您的八个角位于 position x width 2 position y height 2 position z depth 2
  • ThreeJS 动画光色

    我制作了一个定向灯 我想随着时间的推移改变颜色 我正在阅读文档 http threejs org docs index html Reference Math Color 但仍然没有启动并运行 在初始化之前我声明变量 var rmapped
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • 将 FBX 文件转换为 .gltf 后,模型非常小,为什么?

    问题 将 FBX 文件转换为 gltf 后 模型非常小 为什么 我尝试用以下方法缩放模型frontObject scale set 1000 1000 1000 但我收到以下错误 TypeError Cannot read property
  • 使用 Three.js 制作带孔的圆角盒

    我需要创建一个 4 个侧面但顶部和底部都有圆角的盒子 Three js 有一个很好的例子webgl 几何 形状 https threejs org examples webgl geometry shapes我正在尝试复制它以在绿色圆框上添
  • Morph 目标为 Three.js

    我正在尝试开始使用变形目标和 Three js 然而 关于这个主题的文档似乎并不多 当我查看源代码时 morphTargetInfluences 似乎是有魔力 这是如何运作的 我该如何使用这个 值为1就是全力吗 如何区分同一模型上的不同变形
  • glClipPlane - webGL 中有等效的吗?

    我有一个 3D 网格 是否有可能像这样呈现剖面图 剪辑 glClipPlane在OpenGL中 我正在使用 Three js r65 我添加的最新着色器是 片段着色器 uniform float time uniform vec2 reso

随机推荐