Треугольники эскиза соединяются в точке на краю, а не в вершине

Я пытаюсь найти границу группы треугольников. Моя проблема в том, что я сохраняю треугольники из Sketchup как файл collada .dae, а затем читаю их в своей программе. Sketchup создает треугольники, похожие на это изображение:

.

Я думаю, что это называется супом треугольников, поскольку они не связаны в точках вершин - треугольник может соединяться с другим по одному из своих краев. Это означает, что я не могу найти границу набора, проверяя каждую сторону треугольника, чтобы увидеть, соединяется ли он с другим треугольником или нет, поскольку треугольник 1 (зеленый) соединен с треугольником (2) и 'ничего такого'.

  1. Это треугольный «суп», и мне нужна треугольная «сетка» (вопрос по терминологии)?
  2. Может ли SketchUp сохранить свой файл .dae, в котором каждая вершина треугольника соединена с другой вершиной треугольника, как на изображении ниже?

  3. Есть ли лучший способ найти границу этой группы треугольников?


person CobaltGray    schedule 30.05.2017    source источник
comment
вы хотите прямоугольную границу? если это так, вам даже не нужно иметь дело с ними как с фигурами, просто с точками ... (минимум h-точка, большая h-точка, минимум v-точка, большая v-точка) ...   -  person Grady Player    schedule 30.05.2017
comment
Нет, мне нужна фактическая многоугольная граница (в этом примере 6 сторон)   -  person CobaltGray    schedule 30.05.2017
comment
Я думаю, вы могли бы найти центр ограничивающего прямоугольника ... затем вычислить расстояние оттуда, самые удаленные точки будут некоторыми из вершин ограничивающего выпуклого многоугольника ... что касается других ... вам, вероятно, понадобится кнопка на калькулятор, которым я не умею пользоваться ...   -  person Grady Player    schedule 30.05.2017
comment
Мы называем это «Т-образные переходы», но мне еще больше нравится термин «суп из треугольников» :-)   -  person abenci    schedule 31.05.2017
comment
SketchUp всегда будет пытаться объединить геометрию, то, что вы видите в первом примере, не должно быть возможным в SU. Вы должны получить то, что видите на втором изображении. Ваш вопрос, похоже, указывает на то, что у вас есть сценарий первого, который затем будет ошибкой SU. Можете ли вы добавить фрагмент кода в то, как вы создаете два треугольника?   -  person thomthom    schedule 31.05.2017
comment
Спасибо @thomthom - я опубликовал пример, чтобы вы могли сами воспроизвести результаты. (опубликовано в качестве ответа, так как я думал, что ссылки будут полезны, но пока у меня нет представителя, чтобы опубликовать более двух ссылок на каждый пост-извиняющий моды). Вот ссылка на файл Sketchup: dl.dropboxusercontent.com/u/48662552/ < / а>   -  person CobaltGray    schedule 01.06.2017


Ответы (1)


Изменения в ответ на вопрос @thomthom о воспроизведении этого в Sketchup: Сделано как «Ответ», поскольку у меня нет представителя, чтобы добавить более двух ссылок на исходный пост. -извини

Спасибо за подсказку @thomthom. Я воспроизвел для вас проблему. Мой файл Sketchup выглядит так:

Я использую Sketchup версии 17.2.2554.

Затем я перехожу в файл-> Экспорт-> 3D-модель. Выберите формат «Файл COLLADA (* .dae)». Нажмите «Параметры» и установите флажок «Экспортировать двусторонние лица» и «Триангулировать все лица». Выберите место для сохранения файла.

Это записывает файл collada .dae. У него всего 8 граней, поэтому я размещу здесь .dae, чтобы вы могли убедиться в этом сами:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
    <asset>
        <contributor>
            <authoring_tool>SketchUp 17.2.2554</authoring_tool>
        </contributor>
        <created>2017-05-31T19:42:02Z</created>
        <modified>2017-05-31T19:42:02Z</modified>
        <unit meter="0.0254000" name="inch" />
        <up_axis>Z_UP</up_axis>
    </asset>
    <library_cameras>
        <camera id="ID1" name="skp_camera_Last_Saved_SketchUp_View">
            <optics>
                <technique_common>
                    <perspective>
                        <yfov>35.0000000</yfov>
                        <aspect_ratio>0.0000000</aspect_ratio>
                        <znear>1.0000000</znear>
                        <zfar>1000.0000000</zfar>
                    </perspective>
                </technique_common>
            </optics>
        </camera>
    </library_cameras>
    <library_visual_scenes>
        <visual_scene id="ID2">
            <node name="SketchUp">
                <instance_geometry url="#ID3">
                    <bind_material>
                        <technique_common>
                            <instance_material symbol="Material2" target="#ID5">
                                <bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0" />
                            </instance_material>
                            <instance_material symbol="Material3" target="#ID10">
                                <bind_vertex_input semantic="UVSET0" input_semantic="TEXCOORD" input_set="0" />
                            </instance_material>
                        </technique_common>
                    </bind_material>
                </instance_geometry>
                <node name="skp_camera_Last_Saved_SketchUp_View">
                    <matrix>0.9857500 0.0094434 0.1679518 330.2823181 0.1682171 -0.0553379 -0.9841955 -862.0587769 0.0000000 0.9984230 -0.0561379 109.0382767 0.0000000 0.0000000 0.0000000 1.0000000</matrix>
                    <instance_camera url="#ID1" />
                </node>
            </node>
        </visual_scene>
    </library_visual_scenes>
    <library_geometries>
        <geometry id="ID3">
            <mesh>
                <source id="ID6">
                    <float_array id="ID11" count="60">318.7783345 0.0000000 0.0000000 240.0381770 -0.0000000 118.1102362 0.0000000 0.0000000 0.0000000 318.7783345 0.0000000 196.8503937 240.0381770 0.0000000 196.8503937 159.3891673 0.0000000 196.8503937 80.6490098 0.0000000 118.1102362 159.3891673 0.0000000 118.1102362 80.6490098 0.0000000 196.8503937 0.0000000 0.0000000 118.1102362 80.6490098 0.0000000 118.1102362 159.3891673 0.0000000 118.1102362 0.0000000 0.0000000 118.1102362 240.0381770 -0.0000000 118.1102362 0.0000000 0.0000000 0.0000000 80.6490098 0.0000000 196.8503937 159.3891673 0.0000000 196.8503937 240.0381770 0.0000000 196.8503937 318.7783345 0.0000000 196.8503937 318.7783345 0.0000000 0.0000000</float_array>
                    <technique_common>
                        <accessor count="20" source="#ID11" stride="3">
                            <param name="X" type="float" />
                            <param name="Y" type="float" />
                            <param name="Z" type="float" />
                        </accessor>
                    </technique_common>
                </source>
                <source id="ID7">
                    <float_array id="ID12" count="60">0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000 -0.0000000 1.0000000 -0.0000000</float_array>
                    <technique_common>
                        <accessor count="20" source="#ID12" stride="3">
                            <param name="X" type="float" />
                            <param name="Y" type="float" />
                            <param name="Z" type="float" />
                        </accessor>
                    </technique_common>
                </source>
                <vertices id="ID8">
                    <input semantic="POSITION" source="#ID6" />
                    <input semantic="NORMAL" source="#ID7" />
                </vertices>
                <triangles count="8" material="Material2">
                    <input offset="0" semantic="VERTEX" source="#ID8" />
                    <p>0 1 2 1 0 3 1 3 4 5 6 7 6 5 8 2 7 9 7 2 1 9 7 6</p>
                </triangles>
                <triangles count="8" material="Material3">
                    <input offset="0" semantic="VERTEX" source="#ID8" />
                    <p>10 11 12 13 14 11 12 11 14 15 16 10 11 10 16 17 18 13 18 19 13 14 13 19</p>
                </triangles>
            </mesh>
        </geometry>
    </library_geometries>
    <library_materials>
        <material id="ID5" name="material">
            <instance_effect url="#ID4" />
        </material>
        <material id="ID10" name="material_0">
            <instance_effect url="#ID9" />
        </material>
    </library_materials>
    <library_effects>
        <effect id="ID4">
            <profile_COMMON>
                <technique sid="COMMON">
                    <lambert>
                        <diffuse>
                            <color>1.0000000 1.0000000 1.0000000 1.0000000</color>
                        </diffuse>
                    </lambert>
                </technique>
            </profile_COMMON>
        </effect>
        <effect id="ID9">
            <profile_COMMON>
                <technique sid="COMMON">
                    <lambert>
                        <diffuse>
                            <color>0.6431373 0.6980392 0.7333333 1.0000000</color>
                        </diffuse>
                    </lambert>
                </technique>
            </profile_COMMON>
        </effect>
    </library_effects>
    <scene>
        <instance_visual_scene url="#ID2" />
    </scene>
</COLLADA>

Вы можете видеть, что вывод collada содержит 8 треугольников, а треугольник, вызывающий нарушение, находится под индексом 5, описанным в строке:

<triangles count="8" material="Material2">
    <input offset="0" semantic="VERTEX" source="#ID8" />
    <p>0 1 2 1 0 3 1 3 4 5 6 7 6 5 8 2 7 9 7 2 1 9 7 6</p>
                                     ^^^^^
                                     Tri 5
</triangles>

Это относится к вершинам 2,7,9, которые:

2:  0.0000000 0.0000000 0.0000000
7:  159.3891673 0.0000000 118.1102362 
9:  0.0000000 0.0000000 118.1102362 

что при умножении на коэффициент масштабирования дюймов в метры 0,0254000 дает:

0, 0, 0 
4, 0, 3 
0, 0, 3 

Мы видим, что индекс треугольника 3 имеет вершины 5,6 и 7, которые при перекрестной ссылке с информацией о вершине дают:

5:  159.44 0.00 196.85
6:  80.70 0.00 118.11 
7:  159.44 0.00 118.11

Что при умножении на коэффициент масштабирования дюймов в метры 0,0254000 дает:

4, 0, 5
2, 0, 3
4, 0, 3

Когда вы их строите, они выглядят как это:

Как видите, два треугольника похожи на те, что на моей первой диаграмме, а не на второй. К треугольнику 5 примыкают грани с треугольниками 3 и, а также пустая грань.

Так что это может быть ошибка в Sketchup, но это все еще не помогает мне решить мою проблему с поиском границы. Спасибо за ваше время.

person CobaltGray    schedule 31.05.2017
comment
А, я думал, у вас действительно есть треугольники, как на вашем первом изображении вашего поста. Это кое-что из того, как экспортер выполняет триангуляцию этого единственного лица. Если вам нужен полный контроль над триангуляцией, я бы рекомендовал вам сделать триангуляцию в вашем файле SketchUp. Вы можете скрыть их, если хотите сохранить внешний вид. - person thomthom; 01.06.2017
comment
Это то же самое, что и исходное изображение (на самом деле оно взято из тех же данных (но я перевернул его по оси Y). К сожалению, рисование отдельных треугольников отсутствует - моя сцена содержит ~ 100 000 треугольников. Мне потребовалось время, чтобы найти что это была причина сбоя моего кода! - person CobaltGray; 01.06.2017
comment
Я думаю, что есть расширения, которые помогут вам выполнить триангуляцию. - person thomthom; 02.06.2017
comment
Да, есть - я использую CGAL, но у триангуляции есть свои проблемы - если вы не укажете границы / сегменты правильно, она заполнит квадратное отверстие между зубцами. Вы можете попробовать взять выпуклый корпус, чтобы найти сегменты, но он также заполняет дыру. В качестве альтернативы вы можете взять вогнутый корпус (или Alpha Hull), но для этого необходимо знать ожидаемый размер «дыр». Итак, правильное решение, я думаю, состоит в том, чтобы найти сегменты, проверив каждое ребро каждого треугольника и убедившись, что к нему нет прилегающего треугольника. Если нет, то это сегмент. У тебя проблема? - person CobaltGray; 02.06.2017