- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
按照这里的例子:
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/
我可以使用 normal 和常量 w 定义一个 CSG.Plane,如下所示: CSG.Plane = function(normal, w) { this.normal = normal;
我有很多 View ,我试图挤出然后相交以创建最终多边形。问题是结果不是预期的,它有一些 float 的额外部分。我需要以某种方式纠正这个问题,即使解决方案是一种检测这些 float 额外部分并删除它
我使用行进立方体渲染等值面,(或者可能是 marching squares 因为这是 2D)并且我想做集合操作,例如集合差、交集和并集。我认为这很容易实现,只需在来自两个不同隐式曲面的两个顶点标量之间
我正在开展一个项目,在该项目中我必须执行光线转换并使用 CSG 树。但我不知道如何使用 CSG 树或为这个项目实现它。我可以进行光线转换并给出最终答案。我的问题实际上是如何实现树并链接它。 最佳答案
我目前正在使用 three.js 几何类来创建一个形状,然后对该形状执行多个 CSG 操作。从而不断重绘形状。 这个执行多个 csg 操作的过程很慢,因为我使用光线转换来获取单击时的形状并对所选形状和
我正在尝试使用 ThreeCSG.js 对导入的 STL 网格文件执行 bool 运算。这是代码.. function openFile() { filePath = document.form.se
这可能是基本的,但是有缩放 CSG 对象的功能吗?我想使用边界和缩放函数自动为具有已知重叠公差(通常是喷嘴直径)的 3D 打印零件生成安全区。我可以得到 CSG 对象的边界,但似乎找不到比例函数。 最
我正在为一个机器人项目实现我自己的 CSG 类,并且我正在考虑将每个实体实现为一个返回 bool 值的函数,给定一个 3D 点;如果 3D 点包含在实体中,则此函数将返回 true。我想通过这样做,我
我重新实现了 OpenCSG对于现代 OpenGL 版本。 像素格式属性: NSOpenGLPFAColorSize , 24 , NSOpenGLPFAAlphaSize , 8 ,
我尝试使用 csg.js-functions 从盒子中切出一个球体,但它不起作用?我阅读了 http://learningthreejs.com/blog/2011/12/10/constructiv
当我使用它作为立方体和球体的代码时,它会切掉该立方体的某些部分: window.onload = function() { var projector = new THREE.P
我正在尝试使用 ThreeCSG 消除平台中的“漏洞”。我希望在较大平台上的特定位置减去孔。 var geometry = new THREE.CubeGeometry( 500, 10, 500
按照这里的例子: http://learningthreejs.com/blog/2011/12/10/constructive-solid-geometry-with-csg-js/ 并且将 Thr
我将 csg.js 与 three.js 一起使用,它似乎只支持 3D CSG。查看 this 我想交叉和联合 2D (three.js) 几何体。有什么办法可以用 three.js 做 2D CSG
我正在尝试克隆然后缩放网格,但缩放似乎并没有立即在克隆的对象上起作用,出于使用 CSG ThreeBSP 进行编程的目的。我想我应该在缩放后调用一个函数来强制矩阵或其他内部变量立即重新计算,而不是等待
我同时使用 three.js 和 CSG.js 来制作一个新形状。 var materialText = new THREE.MeshBasicMaterial({ map: THRE
我正在尝试编译 Carve 1.4 c++ 库。但不断得到 C2375: 'cbrt' : redefinition; different linkage 错误。 当我点击一个错误时,它会将我带到 m
我正在为 JavaFX 使用 JCSG 库。 我有一些 MeshView 对象,我想将它们转换为 CSG 对象,有什么办法可以实现吗? 最佳答案 组合 javafx.scene.shape.Mesh
我是一名优秀的程序员,十分优秀!