gpt4 book ai didi

three.js - 三个 CSG 的 3D bool 运算

转载 作者:行者123 更新时间:2023-12-04 02:04:44 24 4
gpt4 key购买 nike

按照这里的例子:

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

并且将 Three.js 与 https://github.com/chandlerprall/ThreeCSG 结合使用,我正在尝试对模型中的节点执行 3D bool 运算。例如,如果我有一堵带 window 的墙,我想对其执行 invert() 以获得 window 。

我有一个函数可以返回一个节点的多边形的所有顶点,这里是一个没有孔的对象的顶点示例 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)
}
}
}

我的示例的完整代码在那里:Wall Analyzer和现场演示 there .

关于three.js - 三个 CSG 的 3D bool 运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44411001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com