удаление части полигона приводит к тому, что весь объект не отображается

Итак, делаю призму:

width=30
thickness=15
polyhedron(
    points=[ 
        [width,0,0],[width,0,thickness],
        [width,width,0],[width,width,thickness],
        [0,width,0],[0,width,thickness]
    ],
    faces=[
        [1,3,5], [0,2,4],[1,0,2,3],[3,5,4,2],[1,5,4,0]
        ]
    );

Что отлично отображается: введите здесь описание изображения

Затем я удаляю кусок этого:

difference () {
    <THAT PRISM>
    translate([0,0,thickness-5]) cylinder(r=width-10, h=6);
    }

что я получаю, так это то, что вместо призмы с вынутым круглым куском я получаю неполный многоугольник: введите здесь описание изображения Что с этим делать? Что я делаю неправильно с заявлением о разнице?


person blackcoat    schedule 26.07.2015    source источник


Ответы (2)


ваши лица неправильно ориентированы, см. документацию. Порядок точек должен быть по часовой стрелке, если смотреть снаружи. Вот правильные лица:

faces=[
    //[1,3,5], [0,2,4],[1,0,2,3],[3,5,4,2],[1,5,4,0]
    [1,5,3],[0,2,4],[0,1,3,2],[3,5,4,2],[0,4,5,1]
    // edit 27.07.2015 order of faces changed
    ]

редактировать 27.07.2015:

с Вашими лицами должен быть вывод в консоли вот такой:

Top level object is a 3D object:
Simple: no
Vertices: 15
Halfedges: 30
Edges: 15
Halffacets: 4
Facets: 2
Volumes: 1
WARNING: Object may not be a valid 2-manifold and may need repair! 
Rendering finished.

"Просто: нет" и предупреждение - намеки на то, что Ваш многогранник недействителен. Если объект действителен, это будет «Простой: да» без какого-либо предупреждения.

person a_manthey_67    schedule 26.07.2015
comment
Что ж, это решило проблему, но меня все еще смущает, почему он когда-либо отображался в работающий многогранник. - person blackcoat; 27.07.2015
comment
Так как 4 грани неправильно ориентированы, правильно только ваше дно, результат выглядит только как многогранник, но рабочего многогранника нет. Таким образом, цилиндр может вырезать только одну форму, но не 3D-объект. - person a_manthey_67; 27.07.2015

Если ваш полигон не слишком сложен, иногда вы можете обернуть его корпусом, чтобы он был твердым.

Сохранив ваш код и настроив стиль и положение цилиндра, а также завернув многоугольник в корпус, мы получили:

width = 30;
thickness = 15;

difference() {
  hull() {
    polyhedron (
      points = [
        [width, 0, 0], [width, 0, thickness],
        [width, width, 0], [width, width, thickness],
        [0, width, 0], [0, width, thickness]
      ],
      faces = [
        [1,3,5], [0, 2, 4],
        [1, 0, 2, 3], [3, 5, 4, 2], [1, 5, 4, 0]
      ]
    );
  }
  translate([0, 0, thickness - 5]) cylinder(r = width, h = 6);
}

Это визуализирует и просматривает как:

введите здесь описание изображения

Руководство по OpenSCAD — корпус

person Maxime Ancelin    schedule 23.09.2020