Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/97: Рейтинг темы: голосов - 97, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 4

Триангуляция 3D

12.03.2012, 20:11. Показов 17831. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Триангуляция в трехмерном пространстве должна разбивать фигуру/точки на тетраэдры?
2. Или можно просто покрывать поверхность треугольниками?
3. Есть ли в OpenGl возможности автоматического построения триангуляции? 4. Если есть, то нужно ли задавать точки в установленном порядке, или можно задавать их произвольно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2012, 20:11
Ответы с готовыми решениями:

Триангуляция в Delphi
Система: Delphi Здравствуйте все! Если у кого нибудь есть функция триангуляции массива TPoint (из которого состоит фигура)? Или может кто...

Триангуляция
Нужно написать алгоритм "раскидания" точек по фигуре и внутри нее, нарисованной на листочке в верху (первый рисунок). Все расписано на...

Триангуляция
Задан многоугольник координатами своих вершин вдоль обхода его контура. Требуется указать множество непересекающихся во внутренних точках...

3
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
14.03.2012, 06:33
Цитата Сообщение от Nick8 Посмотреть сообщение
1. Триангуляция в трехмерном пространстве должна разбивать фигуру/точки на тетраэдры?
2. Или можно просто покрывать поверхность треугольниками?
3. Есть ли в OpenGl возможности автоматического построения триангуляции? 4. Если есть, то нужно ли задавать точки в установленном порядке, или можно задавать их произвольно?
1. Триангуляция разбивает на треугольники (полигоны);
2. Да;
3. GLU;
4. Тут вам подсказать не могу, курите документацию.

http://www.toygames.ru/disignv... /?id=52225
[вырезано]

PS. Триангуляция - это частный случай тесселяции, так что не пугайтесь: триангуляцию часто называют тесселяцией.

Добавлено через 21 час 18 минут
Ну раз нарушил, то нарушил. Правда в таком случае только английский:
http://graphicsbb.itgo.com/solutions/extrude.html - пример с помощью GLU

http://vterrain.org/Implementa... ulate.html - список библиотек триангуляции

Ну и под катом пример реализации, правда на шарпе, честно спертый с буржуйского форума:
пример 3D триангуляции на C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
using System;
using System.Collections.Generic;
using System.Xml;
using OpenTK.OpenGL; //for triangulating paths with the GLU tesselator
using System.Runtime.InteropServices;
using System.Diagnostics;
 
namespace J3D
{
    //
    //This class use the OpenGL GLU tessellation
    //functions to triangulate a simple polygon.
    //
    //This code is based largely on Michael Foetsch
    //triangulation tutorial that can be found, as of
    //February 2, 2008, at [url]http://www.geocities.com/foetsch/articles.htm[/url].
    //
    //It interfaces with OpenGL through OpenTK.
    //
 
    public static class J3DTriangulate
    {
        // Some of this code is lifted from the OpenTK tesselation sample:
        // Define the signatures for the callback functions, and declare the callbacks.
        delegate void BeginCallbackDelegate(int mode);
        delegate void EndCallbackDelegate();
        delegate void VertexCallbackDelegate(IntPtr v);
        delegate void EdgeFlagCallbackDelegate(int flag);
        delegate void ErrorCallbackDelegate(int code);
        unsafe delegate void CombineCallbackDelegate(
            [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)]double[] coordinates,
            [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]double*[] vertexData,
            [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)]float[] weight,
            double** dataOut);
 
        static OpenTK.GLControl glControl = null;
 
        // Triangulate
        // "Input" is a list of Vector2's that hold the point data to be triangulated.
        //(Vector2 is not shown but is a structure that has two floating points members X and Y).
        // "VertsPerContour" is an array that determines where to break up the contours in the
        //list of points in Input. VertsPerContour must sum to the number of entries in Input.
        //
        //Note: Outer contours must be given in counter-clockwise order while inner contours
        //      (holes) must be given in clock-wise order.
        //
        //Returns true on successfull triangulation, false on failure or error
        //
        unsafe static public bool Triangulate(Vector2[] Input, int[] VertsPerContour)
        {
            InvalidPolygon = false;
            Indices = new List<int>();
 
            IntPtr tess = IntPtr.Zero;
 
            // create tesselation object
            if (glControl == null)
            {
                glControl = new OpenTK.GLControl();
            }
 
            tess = Glu.NewTess();
 
            // register tesselation callbacks
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessBegin, new BeginCallbackDelegate(BeginCallback));
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessEdgeFlag, new EdgeFlagCallbackDelegate(EdgeCallback));
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessVertex, new VertexCallbackDelegate (VertexCallback));
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessEnd, new EndCallbackDelegate(EndCallback));
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessCombine, new CombineCallbackDelegate(CombineCallback));
            Glu.TessCallback(tess, OpenTK.OpenGL.Enums.TessCallback.TessError, new ErrorCallbackDelegate(ErrorCallback));
 
            //copy input into a linear array of floats
            double[] Vertices = new double[3 * Input.Length];
            for(int v=0;v<Input.Length;v++)
            {
                Vertices[v*3+0] = Input[v].X;
                Vertices[v*3+1] = Input[v].Y;
                Vertices[v*3+2] = 0.0;
            }
 
            // begin polygon
            Glu.TessBeginPolygon(tess, IntPtr.Zero);
 
            // go through the contours
            int CurrentContour = 0;
            int VertsThisContour = 0;
 
            for(int v=0;v<Input.Length;v++)
            {
                if(v == 0)
                    Glu.TessBeginContour(tess);
 
                // pass the corresponding vertex to the tesselator object
                double[] VertsToPass = new double[3];
                VertsToPass[0] = Vertices[v * 3 + 0];
                VertsToPass[1] = Vertices[v * 3 + 1];
                VertsToPass[2] = Vertices[v * 3 + 2];
                Glu.TessVertex(tess,VertsToPass,v);
 
                if(InvalidPolygon)
                    break;
 
                VertsThisContour++;
 
                if(VertsThisContour >= VertsPerContour[CurrentContour])
                {
                    VertsThisContour = 0;
                    Glu.TessEndContour(tess);
 
                    CurrentContour++;
 
                    if(CurrentContour < (long)VertsPerContour.Length)
                    {
                        Glu.TessBeginContour(tess);
                    }
                }
            }
 
            if(InvalidPolygon)
            {
                // destroy the tesselation object
                Glu.DeleteTess(tess);
                tess = IntPtr.Zero;
 
                return false; //error in polygon definition
            }
            else
            {
                // end polygon
                Glu.TessEndPolygon(tess);
 
                // destroy the tessellation object
                Glu.DeleteTess(tess);
                tess = IntPtr.Zero;
 
                //The Indices object is now valid.
                return true;
            }
        }
 
        //After a successful call to Triangulate, this public list holds the indices
        //for the given input.
        public static List<int> Indices;
        static bool InvalidPolygon;
 
        //GLU callback functions
        static void BeginCallback(int type)
        {
        }
 
        static void EdgeCallback(int flag)
        {
        }
 
        static void VertexCallback(IntPtr vertexIndex)
        {
            unsafe
            {
                Indices.Add(*((int*)vertexIndex));
            }
        }
 
        static void EndCallback()
        {
        }
 
        unsafe static void CombineCallback(double[] coords, double*[] vertexData, float[] weight, double** outData)
        {
            //This means the polygon is self-intersecting.
            //See the OpenTK tesselation example for a working version of the
            //combine callback.
            InvalidPolygon = true;
        }
 
        static void ErrorCallback(int errno)
        {
            //some error ocurred, mark this triangulation as invalid
            InvalidPolygon = true;
        }
 
    }
}
2
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 8
16.03.2012, 12:02
Подскажите по такой ситуации: рисую в пространстве несколько точек, с помощью мыши могу их вращать. если координата точки по X,Y и Z больше 1 , то её становится невидно. её, как, будто что то закрывает или выходит она за область. думаю, это с глубиной связано. работаю я с opengl на qt(c++). пробовал использовать функции glFrustum, glScale для изменения масштаба, но мне это не совсем подходит. я новичок в этом деле
0
0 / 0 / 0
Регистрация: 28.09.2011
Сообщений: 6
07.05.2012, 13:30
скорей всего проблема в матрице проецирования. В ней задается параллелепипед видимости. покопайся в этом направлении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2012, 13:30
Помогаю со студенческими работами здесь

Триангуляция
Пытаюсь реализовать алгоритм триангуляции. Хочу узнать, с помощью чего и как нужно задавать точки, которые будут соединятся? Если задавать...

Триангуляция Делоне
Всем привет! Может кто сталкивался с триангуляцией Делоне, и может подкинуть ссылку на детально разобранный алгоритм? Книгу Скворцова...

Open GL триангуляция
Здравствуйте, только начал изучать Open GL. Мне необходимо имея массив/лист точек(x,y,z) соединить эти точки в треугольники так, чтобы...

Триангуляция Делоне
В общем есть у самого пара идей по реализации триангуляции Делоне, но они, я уверен, будут работать неправильно и находить неминимальные...

Триангуляция полигонов
Помогите написать программу для триангуляции полигонов, я нашел вот тако код: unit Unit1; interface uses Windows,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru