使用三个 CSG 进行 3D 布尔运算

2023-12-07

按照此处的示例:

http://learning Threejs.com/blog/2011/12/10/constructive-solid-geometry-with-csg-js/

并使用 Three.js 与https://github.com/chandlerprall/ThreeCSG,我正在尝试对模型中的节点进行 3D 布尔运算。例如,如果我有一堵有窗户的墙,我想做invert()就这样得到了窗户。

我有一个返回节点多边形的所有顶点的函数,这是一个没有孔的对象的顶点的示例https://pastebin.com/8dhYzPwE.

我像这样使用 ThreeCSG:

    const geometryThree = new THREE.Geometry();

    geometryThree.vertices.push(
        ...vertices
    );

    const geometryCsg = new ThreeBSP(geometryThree);

但这就是我要进入的geometryCsg:

"{
    "matrix": {
        "elements": {
            "0": 1,
            "1": 0,
            "2": 0,
            "3": 0,
            "4": 0,
            "5": 1,
            "6": 0,
            "7": 0,
            "8": 0,
            "9": 0,
            "10": 1,
            "11": 0,
            "12": 0,
            "13": 0,
            "14": 0,
            "15": 1
        }
    },
    "tree": {
        "polygons": []
    }
}"

我想这是因为the geometry.faces.length is 0.

如何使顶点数组成为正确的Three.Geometry这样脸上就不会空了?Geometry.elementsNeedsUpdate不起作用...

是否有一个示例使用形状的多边形作为 Vector3 数组并将其转换为 csg?


我刚刚使用三个 csg 进行了一个演示:查看器网格有一个顶点索引数组,因此您无法直接从中创建 BSP。另外,我的代码使用 Web Worker 来处理网格,以便保持 UI 对大型模型的响应,因此我需要首先将网格数据发送给 Worker 并在 Worker 端重建一个简单的 THREE.Mesh,代码看起来像下面这样:

// Sends component geometry to the web worker  
postComponent (dbId) {

  const geometry = this.getComponentGeometry(dbId)

  const msg = {
    boundingBox: this.getComponentBoundingBox(dbId),
    matrixWorld: geometry.matrixWorld,
    nbMeshes: geometry.meshes.length,
    msgId: 'MSG_ID_COMPONENT',
    dbId
  }

  geometry.meshes.forEach((mesh, idx) => {

    msg['positions' + idx] = mesh.positions
    msg['indices' + idx] = mesh.indices
    msg['stride' + idx] = mesh.stride
  })

  this.worker.postMessage(msg)
}

// get geometry for all fragments in a component
getComponentGeometry (dbId) {

  const fragIds = Toolkit.getLeafFragIds(
    this.viewer.model, dbId)

  let matrixWorld = null

  const meshes = fragIds.map((fragId) => {

    const renderProxy = this.viewer.impl.getRenderProxy(
      this.viewer.model,
      fragId)

    const geometry = renderProxy.geometry

    const attributes = geometry.attributes

    const positions = geometry.vb
      ? geometry.vb
      : attributes.position.array

    const indices = attributes.index.array || geometry.ib

    const stride = geometry.vb ? geometry.vbstride : 3

    const offsets = geometry.offsets

    matrixWorld = matrixWorld ||
    renderProxy.matrixWorld.elements

    return {
      positions,
      indices,
      offsets,
      stride
    }
  })

  return {
    matrixWorld,
    meshes
  }
}


// On the worker side reconstruct THREE.Mesh
// from received data and create ThreeBSP
function buildComponentMesh (data) {

  const vertexArray = []

  for (let idx=0; idx < data.nbMeshes; ++idx) {

    const meshData = {
      positions: data['positions' + idx],
      indices: data['indices' + idx],
      stride: data['stride' + idx]
    }

    getMeshGeometry (meshData, vertexArray)
  }

  const geometry = new THREE.Geometry()

  for (var i = 0; i < vertexArray.length; i += 3) {

    geometry.vertices.push(vertexArray[i])
    geometry.vertices.push(vertexArray[i + 1])
    geometry.vertices.push(vertexArray[i + 2])

    const face = new THREE.Face3(i, i + 1, i + 2)

    geometry.faces.push(face)
  }

  const matrixWorld = new THREE.Matrix4()

  matrixWorld.fromArray(data.matrixWorld)

  const mesh = new THREE.Mesh(geometry)

  mesh.applyMatrix(matrixWorld)

  mesh.boundingBox = data.boundingBox

  mesh.bsp = new ThreeBSP(mesh)

  mesh.dbId = data.dbId

  return mesh
}

function getMeshGeometry (data, vertexArray) {

  const offsets = [{
    count: data.indices.length,
    index: 0,
    start: 0}
  ]

  for (var oi = 0, ol = offsets.length; oi < ol; ++oi) {

    var start = offsets[oi].start
    var count = offsets[oi].count
    var index = offsets[oi].index

    for (var i = start, il = start + count; i < il; i += 3) {

      const a = index + data.indices[i]
      const b = index + data.indices[i + 1]
      const c = index + data.indices[i + 2]

      const vA = new THREE.Vector3()
      const vB = new THREE.Vector3()
      const vC = new THREE.Vector3()

      vA.fromArray(data.positions, a * data.stride)
      vB.fromArray(data.positions, b * data.stride)
      vC.fromArray(data.positions, c * data.stride)

      vertexArray.push(vA)
      vertexArray.push(vB)
      vertexArray.push(vC)
    }
  }
}

我的示例的完整代码在那里:墙壁分析仪和现场演示there.

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

使用三个 CSG 进行 3D 布尔运算 的相关文章

  • THREE.js 使用 DOMElements 的 SphereGeometry 全景热点

    我使用以下命令创建了一个简单的 WebGL 3D 全景应用程序SphereGeometry PerspectiveCamera and a CanvasTexture 现在 我希望通过在场景的某些部分添加 热点 来使场景栩栩如生Sphere
  • 在 Three.js 中针对“子场景”进行光线投射

    因此 我正在使用 Three js 示例中的 webgl interactive cubes html 并且我有一个相对简单的问题 是否可以测试光线与对象的子对象的相交 例如 如果我做类似的事情 for var i 0 i lt 2000
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • 使用 Three.js 在片段着色器中手动选择 mipmap 的 lod

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

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 使用 Autodesk Forge API 检索“描述”或“自定义属性”字段

    我们正在尝试使用 Autodesk Forge API 请求 命令检索 BIM360 文档中所示的描述或自定义属性字段 我们尝试了以下请求来检索有关特定文件的信息 https forge autodesk com en docs data
  • 绕局部轴旋转

    我正在尝试实现一个对象 围绕一个位置 POI 兴趣点 飞行并面向它 当您按 WASD 时 您可以更改 POI 的旋转 A 和 D gt 更改 y 轴 W 和 S 更改 x 轴 正如您在演示中看到的 http jsbin com yodusu
  • 将 A 框架与 Three.js 相结合

    我想知道 是否可以将 Three js 元素添加到 A 框架场景中 假设 A frame 是基于 Three js 构建的 并且 three Version 0 74 0 登录到你的控制台这不应该是一件奇怪的事情 对吧 我在我的 A 框架场
  • Three.js 中的文本几何

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

    如何沿着简单的路径 由顶点 点数组创建 移动相机 我需要自动移动它 而不是像第一人称射击游戏那样通过键盘 鼠标事件来移动它 找了这个例子 http trijs org examples webgl geometry extrude spli
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • Autodesk Forge Viewer 如何获取线起点/终点的坐标

    我正在尝试在 forge 查看器中突出显示房间 在 Revit 中 我创建了代表房间边界的线条 转换为 svf 后 我知道这些行的 dbids 现在我想知道这些线的起点和终点 顶点 以便我可以创建房间边界的 Three Shape 编辑 我
  • Three.js 光线投射器可以与组相交吗?

    我想知道我的光线投射器是否正在查看我已加载的 OBJ 由于从 Cinema4D 导出的方式 我相信 OBJ 是一个具有 3 个子级的 THREE Group 而不是 THREE Object 我可以更改我的 raycaster 代码行来查找
  • Three.js - 将 WebGL 和 CSS3D 与 iFrame 混合

    我准备了一个混合的工作页面WebGL and CSS3D 在SO的一点帮助下here https stackoverflow com questions 24681170 three js properly blending css3d a
  • 使用 Javascript 下载 BIM360 Docs 文件

    我正在尝试使用 javascript 下载 BIM360 文档文件 我能够从 BIM360 获取文件响应 但无法保存具有正确内容的文件 这是我的 JS 代码 document ready function var anchor vcard
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • Three.js :face4 生成三角形而不是正方形

    我正在尝试使用 tree js 自定义几何图形生成一个正方形 但是这段代码 var cubeGeo new THREE Geometry cubeGeo vertices push new THREE Vector3 25 25 25 cu
  • (A 框架)本地 gltf 不会加载;无法读取未定义的属性“切片”

    我从A型框架学校 https aframe io aframe school 11其中加载了 gltf 模型 然后我从 Khronos 加载了示例模型 this box https github com KhronosGroup glTF

随机推荐

  • 嵌套类与单独的类文件

    至少在java中 我的编译器不允许我将两个 或更多 单独的类放在一个类文件中 它迫使我在同一个包中创建多个文件 我明白这是为什么 我也同意这个原则 但是 我意识到我可以轻松地嵌套类并将整个程序 不包括导入的库 包含在单个文件中 我想这会被人
  • 转换为 Dalvik 格式失败 facebook/AccessToken$SerializationProxyV1

    这是我的日志 2013 02 09 19 48 50 Dex Loader Unable to execute dex Multiple dex files define Lcom facebook AccessToken Serializ
  • 是否可以将相同的 DLL 添加两次到 AppDomain 中,或者最好重新使用加载的 DLLC?

    我的应用程序在应用程序执行期间多次加载相同的 DLL AssemblyName assemblyName AssemblyName GetAssemblyName plugin FullPathToDLLFile loadedPlugin
  • 使用 Write-Host 时输出中出现不必要的空间

    当我使用Write Host在一个Foreach Object 我在输出中得到了不必要的空格 write host http contoso com personal ADUserName Output http contoso com p
  • 自定义多色进度条

    我的应用程序要求是自定义进度条 具有多色指示的自定义进度 例如 小于 30 的进度用绿色显示 小于 60 和大于 30 的进度用黄色显示 最后从 60 到 100 的进度用红色显示 我想要这样的进度条 http www android2fr
  • Cesium - 使用相机缩放多边形以在放大/缩小时匹配经纬度位置

    我正在努力解决相机功能 我认为 可以提供一种方法强制我的多边形粘在我房子的顶部缩小 放大和旋转 或相机移动 这个问题遵循较早的question问题已解决 现在我需要一点帮助来解决我的下一个问题 我试图遵循的示例代码位于黄金标准似乎已融入现有
  • 使用 create-react-app 的多个入口点

    我的页面包含 20 的 React 组件和 80 的普通 html 内容 有必要在页面的不同位置放置多个React组件 因此我需要在index html中使用多个入口点 我想使用create react app 但我不想使用redux 因为
  • Magento - 在管理中不可见/不可编辑的产品属性

    是否可以通过代码 或手动 创建通过管理编辑产品页面不可见 因此不可编辑 的产品属性 如何 该属性只需要在php模块中使用 保存 加载 对的 这是可能的 如果您在安装脚本中执行此操作 您应该设置 visible 为假 installer gt
  • 如何建立友谊关系模型

    我一直在试图弄清楚如何做到这一点 即使查看其他示例 我也无法弄清楚 所以也许我可以获得一些个性化的帮助 我有两张桌子users status and friendships In the users status表我有一个字段userid
  • 如何修复React中的map is not a function错误?

    我遇到错误 map is not a function进行 API 调用时 我不久前才开始学习 React 和 API 我尝试将状态更改为对象 但未定义 因为 我得到的地图不是一个函数 也许我缺少调用 API 的东西 这是下面的代码 fun
  • 在ABAP中找到两个数据集的差异?

    我有一组值 foo bar blue 我有一个看起来像这样的表 ID my col 1 foo 2 bar 我想要设置值减去所有可用的 my col 值 foo bar blue 减去 foo bar 结果应该是 蓝色 在ABAP中如何做到
  • Jade Templates - 动态调用 Mixin

    如何使用 json 中的字符串输入 Jade 模板来动态加载 mixin 下面 目标是twoColumn jade加载foo and bar mixins 两列 jade mixin twoColumns obj container flu
  • AngularJS -$compileProvider.preAssignBindingsEnabled 不是一个函数

    我在尝试执行以下操作时收到以下错误消息gulp serve在我的 AngularJS 10 6 1 版 应用程序上 Error injector modulerr Failed to instantiate module myAppName
  • MS-DOS 如何获取命令的输出作为变量

    我编写了一个程序 该程序将 DOS 的键码作为整数返回 但我不知道如何将其输出作为变量 注意 我使用的是 MS DOS 7 Windows 98 所以无法使用FOR F or SET P 有谁知道我该怎么做 Eric Pement 描述了一
  • 如何在转换中使用枢轴点

    如何使用中心点平移对象 我有一个矩形 其中心点远离矩形的位置 当我旋转矩形时 它绕其中心轴旋转 如果我在 modelView 矩阵中旋转之前乘以位置 ModelViewMatrix Rotation Scaling Position 假设我
  • 在 StoryBoard 上设置自定义附加属性

    我有一个故事板 想要设置附加属性 VisualStateUtility InitialState 我尝试过各种组合 但属性从未得到解决 我收到以下错误 无法解析 TargetProperty VisualStateUtility Initi
  • 在 Ruby 中使用 new 运算符对自动激活哈希值进行多重初始化

    我想初始化几个自动激活哈希值通过一行表达式 到目前为止 我找到了一种额外的方法AutoHash object class AutoHash lt Hash def few n 0 Array new n AutoHash new end 这
  • Angular 2 rc5,使用注入的管道的单元测试问题

    我正在使用 angular2 rc 5 我编写了一个自定义管道 可以从 json 中获取值 自定义管道 literal pipe ts 看起来像 import Pipe PipeTransform Inject from angular c
  • 在从加载标签的视图扩展的页面上使用 Django template_tag

    我已向我的应用程序添加了一个模板标签 我将其加载到位于的视图中inc base html 该视图包含我的基本 HTML 布局 我所有其他观点开始 extends inc base html 在我的视图之一中 我想引用我的模板标签 该标签加载
  • 使用三个 CSG 进行 3D 布尔运算

    按照此处的示例 http learning Threejs com blog 2011 12 10 constructive solid geometry with csg js 并使用 Three js 与https github com