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

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

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

Author24 — интернет-сервис помощи студентам
1. Триангуляция в трехмерном пространстве должна разбивать фигуру/точки на тетраэдры?
2. Или можно просто покрывать поверхность треугольниками?
3. Есть ли в OpenGl возможности автоматического построения триангуляции? 4. Если есть, то нужно ли задавать точки в установленном порядке, или можно задавать их произвольно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2012, 20:11
Ответы с готовыми решениями:

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

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

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

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

3
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
14.03.2012, 06:33 2
Цитата Сообщение от 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 3
Подскажите по такой ситуации: рисую в пространстве несколько точек, с помощью мыши могу их вращать. если координата точки по X,Y и Z больше 1 , то её становится невидно. её, как, будто что то закрывает или выходит она за область. думаю, это с глубиной связано. работаю я с opengl на qt(c++). пробовал использовать функции glFrustum, glScale для изменения масштаба, но мне это не совсем подходит. я новичок в этом деле
0
0 / 0 / 0
Регистрация: 28.09.2011
Сообщений: 6
07.05.2012, 13:30 4
скорей всего проблема в матрице проецирования. В ней задается параллелепипед видимости. покопайся в этом направлении.
0
07.05.2012, 13:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2012, 13:30
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru