Войти
ПрограммированиеФорумГрафика

Загрузка моделей в OpenGL (2 стр)

Страницы: 1 2
#15
17:48, 25 фев. 2007

r2k3

эх неусПЕЛ %(

тему в ADVANCED аднАзначна!


#16
17:59, 25 фев. 2007

2 VileDog
Ты б лучше по теме че нить предложил. А на счет WinMain я сглупил, но о ней понятное дело знал :)

#17
22:27, 25 фев. 2007

Проще всего поступить так. Сначала пишешь скрипт для экспорта из MAX'а. Потом анализируешь полученный файл (там и анализировать нечего, просто читаешь числа в память). Все, загрузка геометрии закончена! Текстуры грузишь отдельно, вот пример из уроков NeHe.

Прошло более 2 лет
#18
2:32, 14 июля 2009

Хочу апнуть данную тему. Я только недавно начал изучение OpenGL. Вот подхожу к отрисовке трёхмерных моделей в OpenGL. Только вот не знаю с какой стороны подойти.
В интернете нашёл некоторые .obj модели (полагаю, этот формат проще всего для начинающего?). Только что с ним делать - в гугле там и не могу отыскать. Как его, чем считывать, как отображать...
Не направите ли меня на путь истинный в этом деле? :)

#19
3:26, 14 июля 2009

В которы раз привожу эту ссылку, твой теска писал:
http://xproger.mirgames.ru/?id=1&page=2&doc=anim3d

#20
10:48, 14 июля 2009

А ты его блокнотом открой, он ведь текстовый. сразу увидишь формат. прогу для чтения, думаю, не трудно будет и самому написать.

Прошло более 8 месяцев
#21
7:55, 9 апр. 2010

Нет ли библиотеки для загрузки моделей mm3d?

#22
13:39, 9 апр. 2010

Zhanik
> mm3d
Спецификация открыта? Напиши сам.
Некропостер. :D

#23
17:08, 9 апр. 2010

Zakus
> Некропостер. :D
тоже пользуешься некродетектором?

#24
17:46, 9 апр. 2010

Kloun
Я их нутром чую)

#25
18:22, 9 апр. 2010

Zakus
> Я их нутром чую)
это хорошо. а вот Zhanik явно не чует. поэтому ему просто необходим [utl=http://www.gamedev.ru/flame/forum/?id=132125]некродетктор[/url] =))

не подумайте, что это реклама
#26
21:43, 9 апр. 2010

Да ладно, последний пост не такой уж и старый! :)

Прошло более 6 месяцев
#27
13:41, 21 окт. 2010

я из 3dmax экспортирую в формат obj и под него написал згрузчик правда на VS2005 при помощи TaoFramework но код можно наверно и в C++
сам файлик Obj выглядит так

# Max2Obj Version 4.0 Mar 10th, 2001
#
# object Box01 to come ...
#
v  -0.025000 -0.025000 0.000000
v  0.025000 -0.025000 0.000000
v  -0.025000 0.025000 0.000000
v  0.025000 0.025000 0.000000
v  -0.025000 -0.025000 0.050000
v  0.025000 -0.025000 0.050000
v  -0.025000 0.025000 0.050000
v  0.025000 0.025000 0.050000
# 8 vertices

g Box01
f 4 2 1 3
f 8 7 5 6
f 6 5 1 2
f 8 6 2 4
f 7 8 4 3
f 5 7 3 1
# 6 faces

g
собственно чют ли не по русски все расписано
v - координаты точек
f - какая точка с какой соеденяеться в полигон
# - коментарий

вот код на Csharp

public class OpenObJect
    {
        public int
        L_Point, //количество точек
        L_Vertex, //количество векторов
        L_Val_Point,  //количество значений в точке
        L_Val_Vertex; //количестов значений в векторах
        public string MyFile="";
        public float StrToFloat(string M)
        {
            float I = 0, Y = 1, K = 0, P = 0;
            string J = "", F = "";
            int Q = 0, C = 0;
            bool POINT = false, ZNAK = false;
            while (M.Length > Q)
            {
                if (M.Substring(Q, 1) == "-") { ZNAK = true; Q++; }
                if (M.Substring(Q, 1) == ".") { Q++; POINT = true; }
                if (POINT) Y = Y * 0.1f;
                J = M.Substring(Q, 1);//Вырезаем 1 символ
                if (J != " ") C = Convert.ToInt32(J);//конвертируем в число
                K = C * Y;//сдвигаем символ
                I = I + K;//Ставим число на место
                P = I; //Присваиваем просто число
                if (ZNAK) P = -I;//если был знак то переварачиваем знак
                Q++;
            };
            return P;
        }//Функция возврата из стринга флотовского значения вот
        public float[,] Cord()
        {
            float[,] otvet = new float[1, 1];

            otvet[0, 0] = 0;
            try
            {
                //точки нумеруються с 1
                string MyData = File.ReadAllText(MyFile); //считываем символы
                byte[] MyData1 = File.ReadAllBytes(MyFile); //считываем в
                string[,] Point = new string[3, MyData1.Length];//масив для хранения координат точек

                int I = 0, S = 0, R = 0;
                while (I < MyData.Length)
                {
                    switch (MyData1)
                    {
                        case 35: // #
                            while (MyData1
!= 10) I++;// коментарии пропускаем мимо ушей
                            break;
                        case 103: //q
                            while (MyData1
!= 10) I++;// коментарии пропускаем мимо ушей
                            break;
                        case 118: //v если видим такой знак то считываем координаты точек вот
                            I += 3; //отсекаем 2 пробела в начале строки вот
                            S = 0;
                            while (MyData1
!= 10)  //пока строка не закончилась мучаем данные
                            {
                                if (MyData1
== 32)  //если находим пробел то просто получаем следующюю координату вот
                                {
                                    S++;  //переходим в следующюю координату
                                    I++;  //пропускаем пробел мимо ушей вот
                                }
                                Point[S, R] += MyData.Substring(I, 1); //сохраняем данные в масивчег
                                I++;  //двигаем курсор дальше
                            }
                            R++; //сдвигаем масив на 1 )
                            break;
                        case 102: //f
                            break;
                        case 10: //Enter

                            break;
                        case 32: //_

                            break;
                        default:

                            break;
                    }
                    I++;
                }
                //////////////////////////////////////////////////////////////////////////////////////////
                S++; //получаем полноценное количество символов которое нужно будет запоминать вот
                int MyR = R, F = 1;
                MyR++; //так как будем вычислять значения с 1 то нужно сдвинуть весь масив на 1 чтобы 1 точка начиналась с 1 вот
                otvet = new float[S, MyR]; //задаем масивчег вот тут
                for (int Y = 0; Y < R; Y++)
                {
                    for (int G = 0; G < S; G++) otvet[G, F] = StrToFloat(Point[G, Y]);
                    F++;
                }
                L_Point = F;
                L_Val_Point = S;
                //////////////////////////////////////////////////////////////////////////////////////////

            }
            catch
            {
            }
            return otvet;
        } //собственно функция возврата координат обьета вот
        public int[,] Vert() //в принципе если бы я понял как можно как в C++ возвращать разные варианты типов ответа то можно было бы конечно замутить 1 масив но нет так нет пока так
        {
            int[,] otvet = new int[1, 1];
            otvet[0, 0] = 0;
            try
            {
                //точки нумеруються с 1
                string MyData = File.ReadAllText(MyFile); //считываем символы
                byte[] MyData1 = File.ReadAllBytes(MyFile); //считываем в
                string[,] Verteks = new string[10, MyData1.Length];

                int I = 0, S = 0, R = 0;
                while (I < MyData.Length)
                {
                    switch (MyData1)
                    {
                        case 35: // #
                            while (MyData1
!= 10) I++;// коментарии пропускаем мимо ушей
                            break;
                        case 103: //q
                            while (MyData1
!= 10) I++;// коментарии пропускаем мимо ушей
                            break;
                        case 118: //v если видим такой знак то считываем координаты точек вот
                            break;
                        case 102: //f
                            I += 2; //сдвигаем на 2 чтобы получить 1 координату
                            S = 0;
                            while (MyData1
!= 10)  //пока строка не закончилась мучаем данные
                            {
                                if (MyData1
== 32)  //если находим пробел то просто получаем следующюю координату вот
                                {
                                    S++;  //переходим в следующюю координату
                                    I++;  //пропускаем пробел мимо ушей вот
                                }
                                Verteks[S, R] += MyData.Substring(I, 1); //сохраняем данные в масивчег
                                I++;  //двигаем курсор дальше
                            }
                            R++; //сдвигаем масив на 1 )

                            break;
                        case 10: //Enter

                            break;
                        case 32: //_

                            break;
                        default:

                            break;
                    }
                    I++;
                }
                //////////////////////////////////////////////////////////////////////////////////////////
                S++; //получаем полноценное количество символов которое нужно будет запоминать вот

                otvet = new int[S, R];
                for (int Y = 0; Y < R; Y++)
                {
                    for (int G = 0; G < S; G++) otvet[G, Y] = Convert.ToInt32(Verteks[G, Y]);

                }
                L_Vertex = R;
                L_Val_Vertex = S;
                //////////////////////////////////////////////////////////////////////////////////////////

            }
            catch
            {
            }

            return otvet;
        }
    }

собственно отрисовать полученные данные можно записав в функцию Display или где ты рисуеш  такой код
static OpenObJect Open = new OpenObJect(); //обьявляем класс
static int[,] V; //ребро  записываем сюда масив который вернет класс
static float[,] P; //точка записываем сюда масив который вернет класс


и рисуем ) вот             
Gl.glColor3f(0.2f, 0.1f, 1);
                for (int VV = 0; VV < Open.L_Vertex; VV++)
                {
                    Gl.glBegin(Gl.GL_POLYGON);
                    for (int U = 0; U < Open.L_Val_Vertex; U++)
                    {
                        Gl.glColor3f(P[X, V[U, VV]], P[Y, V[U, VV]], P[Z, V[U, VV]]);
                        Gl.glVertex3f(P[X, V[U, VV]], P[Y, V[U, VV]], P[Z, V[U, VV]]);
                    }
                    Gl.glEnd();
                }

если нужен целеком проэкт пишите в личку вышлю вот

#28
21:23, 21 окт. 2010

Ща кто-нибудь обязательно вставит лопату.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.