OpenSCAD 不渲染多面体

3D打印 3d 设计 opencad
2021-04-28 01:27:32

我试图从立方体中减去一个多面体,但它不起作用(立方体仍然是实心的)。但是,我可以在预览模式下看到切出的多边形(但不能在完整渲染后看到)。

预览- 多边形切口显示在顶部(和底部)。

预览

渲染- 多边形切口不可见。

呈现

Poly Exploded - 将多边形拉到右侧以显示其形状。

聚爆炸

代码

size = 30;
wall = 3;
wall_x2 = wall * 2;
nubGap = .125;
nubHeight = 8;
nubOffset = wall + nubGap;
xCutoutSize = size - wall_x2;
yCutoutSize = size - wall_x2;
cutoutLowerY = nubHeight + nubGap;
cutoutUpperOffset = nubOffset + wall;
    
difference() {
    cube([size, size, size]);
    
    translate([wall, wall, 0]) {
        polyhedron(
            points = [
                [0, 0, -10],
                [xCutoutSize, 0, -10],
                [xCutoutSize, yCutoutSize, -10],
                [0, yCutoutSize, -10],
        
                [0, 0, cutoutLowerY],
                [xCutoutSize, 0, cutoutLowerY],
                [xCutoutSize, yCutoutSize, cutoutLowerY],
                [0, yCutoutSize, cutoutLowerY],
        
                [cutoutUpperOffset, cutoutUpperOffset, size],
                [xCutoutSize - cutoutUpperOffset, cutoutUpperOffset, size],
                [xCutoutSize - cutoutUpperOffset, yCutoutSize - cutoutUpperOffset, size],
                [cutoutUpperOffset, yCutoutSize - cutoutUpperOffset, size]
            ],
            faces = [
                [0, 1, 2], [2, 3, 0],     // bottom
                
                [0, 1, 4], [1, 4, 5],     // side A
                [1, 2, 5], [2, 5, 6],     // side B
                [2, 3, 6], [3, 6, 7],     // side C
                [3, 0, 7], [0, 7, 4],     // side D
                
                [4, 5,  8], [5,   8,  9], // slope A
                [5, 6,  9], [6,   9, 10], // slope B
                [6, 7, 10], [7,  10, 11], // slope C
                [7, 4, 11], [4,  11,  8], // slope D
                
                [8, 9, 10], [10, 11,  8]  // top
            ]
        );
    };
};
2个回答

通常在不同操作期间两个对象重叠时,F6 渲染将解决该问题。这里涉及的不仅仅是这些,因为降低立方体的高度会从差异中创建一个非流形对象。用户 R.. 的回答有道理,但不会解决问题。

将立方体与代码隔离并将结果导出为 STL 允许我确定这些面的生成方式阻止了正确的差异操作:

网格混合器图像

这张来自 meshmixer 的图像显示了这些面的法线反转。在描述多面体时,点的顺序很关键。OpenSCAD的 wiki 页面

从哪个点开始是任意的,但所有面都必须具有在同一方向上排序的点。从外向内观察每个面时,OpenSCAD 更喜欢顺时针方向。从背面看背面,从底部看底部等。记住此排序要求的另一种方法是使用右手定则。用右手,将拇指向上竖起并弯曲手指,就像在发出竖起大拇指的标志一样,将拇指指向脸部,然后按照手指弯曲的方向排列点。

编辑:我颠倒了一些观点,偶然而幸运地选择了正确的观点:

        faces = [
            [0, 1, 2], [2, 3, 0],     // bottom
            
            [4, 1, 0], [1, 4, 5],     // side A
            [5, 2, 1], [2, 5, 6],     // side B
            [6, 3, 2], [3, 6, 7],     // side C
            [7, 0, 3], [0, 7, 4],     // side D
            
            [8, 5, 4], [5,   8,  9], // slope A
            [9, 6, 5], [6,   9, 10], // slope B
            [10, 7, 6], [7,  10, 11], // slope C
            [11, 4, 7], [4,  11,  8], // slope D
            
            [10, 9, 8], [8, 11, 10]  // top

呈现的代码

如果立方体的多面体表面和顶表面完全共面,它们看起来是一样的,它将不起作用;OpenSCAD 以数值方式而不是解析方式运行,并且“内部”或“外部”另一个受数值不稳定的影响。每当使用差异时,您需要使被减去的对象在您要减去的对象的表面外至少扩展一些小的 epsilon。