Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
OVERWAVE
0 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 45
#1

3D программирование для начинающего - C++

19.08.2012, 11:28. Просмотров 2455. Ответов 23
Метки нет (Все метки)

Я хочу создать простейшее 3D пространство, где хотя бы будут линии осей и изменять угол камеры
Про 3D пространство чуть-чуть знаю. Можно использовать Visual C++ 2010(Уже есть), и если что еще понадобится, пишите. Скорее всего DirectX, но не знаю. Лучше всего подогнать литературу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
19.08.2012, 11:30     3D программирование для начинающего #2
Ставьте DirectX SDK, там примеры есть
OVERWAVE
0 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 45
19.08.2012, 12:23  [ТС]     3D программирование для начинающего #3
А что насчет литературы?
Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
19.08.2012, 12:24     3D программирование для начинающего #4
Литература по программированию игр
OVERWAVE
0 / 1 / 0
Регистрация: 02.08.2012
Сообщений: 45
19.08.2012, 15:17  [ТС]     3D программирование для начинающего #5
А поновее? Там сам пост 9 года, не говоря о книгах. Мне на хотя бы 2010 год, пожалуйста
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
19.08.2012, 15:52     3D программирование для начинающего #6
OVERWAVE, кардинально там ничего не изменилось за эти годы, так что можете смело любую книгу по понравившейся технологии и изучать 3D
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
19.08.2012, 16:03     3D программирование для начинающего #7
Цитата Сообщение от insolent Посмотреть сообщение
OVERWAVE, кардинально там ничего не изменилось за эти годы, так что можете смело любую книгу по понравившейся технологии и изучать 3D
Да ты что? А как же Parallax Occlusion Mapping в DirectX 11 и прочие фишки?
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
19.08.2012, 18:16     3D программирование для начинающего #8
Цитата Сообщение от insolent Посмотреть сообщение
кардинально там ничего не изменилось за эти годы
Как же я часто слышу это в университете. На архитектуре пк мы изучали архитектуру какого-то сраного аналога i286 по методичкам 80х годов так как новее не было и нам говорили "да там ничего не поменялось" . По программированию для Windows мы изучали Winapi для Win95 и нам тоже говорили "да сейчас программы также пишут, там ничего с 95 года не менялось", по цос мы изучали новейшие, как их называл препод, методы 90х годов и там по словам препода тоже ничего не изменилось ...
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
19.08.2012, 21:08     3D программирование для начинающего #9
Я бы вот тоже хотел графику покодить, чтобы это делать на С++ надо VS 2010 + DirectX SDK + лит-ра?Больше ничего не надо?
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
19.08.2012, 22:33     3D программирование для начинающего #10
ИМХО OpenGL круче этих ваших директиксов. И она свободная)
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
20.08.2012, 00:45     3D программирование для начинающего #11
nexen, думаю, что OVERWAVE для познания основ не нужно будет рельефное текстурирование.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2012, 04:48     3D программирование для начинающего #12
http://d3dbegin.narod.ru/index.htm
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2012, 10:22     3D программирование для начинающего #13
Цитата Сообщение от OVERWAVE Посмотреть сообщение
Я хочу создать простейшее 3D пространство, где хотя бы будут линии осей и изменять угол камеры
Про 3D пространство чуть-чуть знаю. Можно использовать Visual C++ 2010(Уже есть), и если что еще понадобится, пишите. Скорее всего DirectX, но не знаю. Лучше всего подогнать литературу.
- вот простой пример пространтсва средствами АПИ в консольном приложении http://www.cyberforum.ru/order-progr...ml#post3242226
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.08.2012, 13:51     3D программирование для начинающего #14
Вот мой небольшой шаблон под Винду на OpenGL с рабочей камерой:
C++
#include <windows.h>
#include <GL\gl.h>
#include <GL\glu.h>
#include <math.h>
 
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
 
// ШИРИНА И ВЫСОТА ОКНА
int WIDTH   = 800;
int HEIGHT  = 600;
 
// КЛАВИШИ УПРАВЛЕНИЯ
#define VK_W    0x057 // W - ВПЕРЕД
#define VK_S    0x053 // S - НАЗАД
#define VK_A    0x041 // A - ВЛЕВО
#define VK_D    0x044 // D - ВПРАВО
#define VK_Q    0x051 // Q - ВЫХОД
#define VK_ESCAPE  //  ВЫХОД
 
 
// КООРДИТАТЫ КАМЕРЫ ПО ОСЯМ XYZ
float posx = 0.0;
float posy = 2.0;
float posz = 0.0;
 
// СКОРОСТИ ПЕРЕМЕЩЕНИЯ ПО ОСЯМ XYZ
float spdx = 0.0;
float spdy = 0.0;
float spdz = 0.0;
// СМЕЩЕНИЕ КУРСОРА
float dx = 0.0;
float dy = 0.0;
// УГЛЫ ВРАЩЕНИЯ
float yaw = 0.0;
float ptc = 0.0;
// КООРДИНАТЫ ТОЧКИ КУДА (ИЛИ ОТКУДА) СМОТРИТ КАМЕРА
float dxx = 0.0;
float dxz = 0.0;
float dyy = 0.0;
 
HWND        hwnd;
MSG         msg;
HGLRC       hRC;
HDC         hDC;
 
POINT pt;
float prevX;
float prevY;
 
 
 
//-----------------------------------------------------------------------------------------------
// ГЛАВНАЯ ФУНКЦИЯ
//-----------------------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wcex;
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_OWNDC;
    wcex.hbrBackground  = (HBRUSH)(0);
    wcex.lpfnWndProc    = WindowProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = "classname";
    wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wcex);
    hwnd = CreateWindowEx( WS_EX_APPWINDOW, "classname", " ", WS_POPUPWINDOW, 0, 0, WIDTH, HEIGHT, HWND_DESKTOP, NULL, hInstance, NULL );
 
    //////////////////////////////////////////////////////////
 
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;
    hDC = GetDC (hwnd);
    ZeroMemory (&pfd, sizeof (pfd));
    pfd.nSize       = sizeof (pfd);
    pfd.nVersion    = 1;
    pfd.dwFlags     = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType  = PFD_TYPE_RGBA;
    pfd.cColorBits  = 24;
    pfd.cDepthBits  = 16;
    pfd.iLayerType  = PFD_MAIN_PLANE;
    iFormat         = ChoosePixelFormat (hDC, &pfd);
    SetPixelFormat (hDC, iFormat, &pfd);
 
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);
 
    //////////////////////////////////////////////////////////
 
    glViewport(0, 0, WIDTH, HEIGHT);
    glMatrixMode(GL_PROJECTION);
 
    gluPerspective(45.0f, (float)WIDTH/(float)HEIGHT, 0.1f, 1000.0f);
    glMatrixMode(GL_MODELVIEW);
 
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
 
 
    ShowWindow(hwnd, nCmdShow);
    ShowCursor(false);
 
    //////////////////////////////////////////////////////////
 
 
    float angle = 0.0; // СИНИЙ КВАДРАТ БУДЕТ ВРАЩАТЬСЯ
 
    while ( msg.message != WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // ДВИЖЕНИЕ ВПРАВО-ВЛЕВО
            if      ( GetAsyncKeyState( VK_A ) < 0 )    { spdz = 0.05; }    // ДВИГАЕМСЯ ПО ОСИ X ЕСЛИ НАЖАТА КЛАВИША A
            else if ( GetAsyncKeyState( VK_D ) < 0 )    { spdz =-0.05; }    // ДВИГАЕМСЯ ПО ОСИ X ЕСЛИ НАЖАТА КЛАВИША D
            else                                        { spdz = 0.0; }     // ИНАЧЕ НЕ ДВИГАЕМСЯ ПО ЭТОЙ ОСИ
            // ДВИЖЕНИЕ ВПЕРЕД-НАЗАД
            if      ( GetAsyncKeyState( VK_W ) < 0 )    { spdx =-0.05; }    // ДВИГАЕМСЯ ПО ОСИ Z ЕСЛИ НАЖАТА КЛАВИША W
            else if ( GetAsyncKeyState( VK_S ) < 0 )    { spdx = 0.05; }    // ДВИГАЕМСЯ ПО ОСИ Z ЕСЛИ НАЖАТА КЛАВИША S
            else                                        { spdx = 0.0; }     // ИНАЧЕ НЕ ДВИГАЕМСЯ ПО ЭТОЙ ОСИ
 
            SetCursorPos(WIDTH/2, HEIGHT/2);// СТАВИМ КУРСОР В ЦЕНТР ОКНА
            GetCursorPos(&pt);              // ПОЛУЧАЕМ ПОЗИЦИЮ КУРСОРА
            prevX = pt.x;                   // ПО ШИРИНЕ
            prevY = pt.y;                   // ПО ВЫСОТЕ
            Sleep(10);                      // ДЕЛАЕМ НЕБОЛЬШУЮ ЗАДЕРЖКУ
            GetCursorPos(&pt);              // СНОВА ПОЛУЧАЕМ ПОЗИЦИЮ КУРСОРА
 
            dx = pt.x - prevX;              // ВЫЧИСЛЯЕМ СМЕЩЕНИЕ КУРСОРА ЗА 10 МИЛИСЕКУНД ПО ШИРИНЕ
            dy = pt.y - prevY;              // ВЫЧИСЛЯЕМ СМЕЩЕНИЕ КУРСОРА ЗА 10 МИЛИСЕКУНД ПО ВЫСОТЕ
 
            yaw += dx/1000.0;               // СМЕЩЕНИЕ ПО ШИРИНЕ НАКАПЛИВАЕТСЯ В УГОЛ ВРАЩЕНИЯ ВПРАВО-ВЛЕВО
            ptc += dy/1000.0;               // СМЕЩЕНИЕ ПО ВЫСОТЕ НАКАПЛИВАЕТСЯ В УГОЛ ВРАЩЕНИЯ ВВЕРХ-ВНИЗ
 
            // ОГРАНИЧИВАЕТ ВРАЩЕНИЕ КАМЕРЫ ВВЕРХ-ВНИЗ
            if (ptc >= 1.5) ptc = 1.5;
            if (ptc <=-1.5) ptc =-1.5;
 
            // ГОРИЗОНТАЛЬНОЙ ПЛОСКОСТЬЮ ЯВЛЯЕТСЯ X-Z
            dxx = sin(yaw); // dxx - ПОЛОЖЕНИЕ ТОЧКИ ОТНОСИТЕЛЬНО ОСИ X
            dxz = cos(yaw); // dxz - ПОЛОЖЕНИЕ ТОЧКИ ОТНОСИТЕЛЬНО ОСИ Z
            dyy = sin(ptc); // dyy - ПОЛОЖЕНИЕ ТОЧКИ ОТНОСИТЕЛЬНО ОСИ Y
 
            // КОРРЕКТИРУЕМ СКОРОСТЬ ПЕРЕМЕЩЕНИЯ В ЗАВИСИМОСТИ ОТ УГЛА ПОВОРОТА КАМЕРЫ
            // ЧТОБЫ КАМЕРА ДВИГАЛАСЬ ТУДА, КУДА СМОТРИТ, А НЕ ВДОЛЬ ОСЕЙ X И Z
            posz += spdz * dxx;
            posx += spdx * dxx;
            posx += spdz * dxz;
            posz -= spdx * dxz;
 
 
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            // У МЕНЯ dxx, dyy И dxz ПРИБАВЛЯЮТСЯ К ПЕРВЫМ ТРЕМ ПАРАМЕТРАМ (КООРДИНАТЫ ГЛАЗ НАБЛЮДАТЕЛЯ)
            // ДЛЯ ТОГО, ЧТОБЫ ПОТОМ МОЖНО БЫЛО СДЕЛАТЬ КАМЕРУ ОТ 3-ГО ЛИЦА (ПОПРОБУЙТЕ dxx, dyy И dxz УМНОЖИТЬ В 10 РАЗ)
            gluLookAt( posx+dxx, posy+dyy, posz-dxz, posx, posy, posz, 0.0, 1.0, 0.0 );
 
            //-----------------------------------------------------------------------------------------------
 
            // НАЧИНАЕМ РИСОВАНИЕ
            glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 
            angle += 0.5;
            if (angle >= 360.0) angle = 0.0;
 
            // РИСУЕМ КВАДРАТ В ВЕРТИКАЛЬНОЙ ПЛОСКОСТИ
            glPushMatrix();
            glTranslatef( 0.0, 2.0, 5.0 );
            glRotatef( angle, 0.0, 1.0, 0.0 );
            glBegin(GL_QUADS);
            glColor3f(0.0, 0.0, 1.0);
            glVertex3f(  1.0, -1.0, 0.0 );
            glVertex3f(  1.0,  1.0, 0.0 );
            glVertex3f( -1.0,  1.0, 0.0 );
            glVertex3f( -1.0, -1.0, 0.0 );
            glEnd();
            glPopMatrix();
            // РИСУЕМ КВАДРАТ В ГОРИЗОНТАЛЬНОЙ ПЛОСКОСТИ
            glPushMatrix();
            glTranslatef( 0.0, 0.0, 0.0 );
            glRotatef( 0.0, 0.0, 1.0, 0.0 );
            glBegin(GL_QUADS);
            glColor3f(0.0, 0.5, 0.0);
            glVertex3f(-4.0,  0.0, -4.0 );
            glVertex3f(-4.0,  0.0,  4.0 );
            glVertex3f( 4.0,  0.0,  4.0 );
            glVertex3f( 4.0,  0.0, -4.0 );
            glEnd();
            glPopMatrix();
 
            glFlush();
            SwapBuffers (hDC);
        }
    }
 
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hwnd, hDC);
    DestroyWindow(hwnd);
    return msg.wParam;
}
 
 
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
        case WM_KEYDOWN:
            switch (wParam)
            {
                case VK_ESCAPE:
                case VK_Q:
                    PostQuitMessage(0);
                    break;
            }
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
20.08.2012, 15:12     3D программирование для начинающего #15
programina, смею заметить, что лучше это все делать в классе, и потом вызывать соотв функции с проверками на нажатия, какой нить функцией из кроссплатформенной библиотеки, ибо чисто под винду, это не труЪ, да и глобальные переменные это тоже ничего хорошего, и вообще KISS! Keep it simple, stupid!
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
20.08.2012, 15:28     3D программирование для начинающего #16
Цитата Сообщение от Invader_Zim Посмотреть сообщение
KISS! Keep it simple, stupid!
Цитата Сообщение от Invader_Zim Посмотреть сообщение
смею заметить, что лучше это все делать в классе, и потом вызывать соотв функции с проверками на нажатия, какой нить функцией из кроссплатформенной библиотеки, ибо чисто под винду, это не труЪ
Шизофазия
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
20.08.2012, 16:16     3D программирование для начинающего #17
defer, Обоснуй.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
20.08.2012, 16:19     3D программирование для начинающего #18
Какая связь между принципом KISS и какой нить функцией из кроссплатформенной библиотеки?
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
20.08.2012, 16:53     3D программирование для начинающего #19
defer, из всего того что приведено, нужно только int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow), и то, если компилятор MSVS, если gcc можно и просто мейном обойтись(И то это танцы ради отсутствия консольного окна), и для обработки клавиш целесообразнее использовать сторонние перехватчики. Код стает очевиднее и кросплатфоренней. ИМХО. Но с KISS возможно перебор
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2012, 17:21     3D программирование для начинающего
Еще ссылки по теме:

C++ Подскажите для начинающего!
C++ Практика для начинающего программиста на С++
C++ Книга для начинающего
C++ Посоветуйте литературу для начинающего на С++

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

Или воспользуйтесь поиском по форуму:
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.08.2012, 17:21     3D программирование для начинающего #20
Invader_Zim, мне выложить шаблон под Линь? Не думаю что ему это надо
Yandex
Объявления
20.08.2012, 17:21     3D программирование для начинающего
Ответ Создать тему
Опции темы

Текущее время: 16:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru