Форум программистов, компьютерный форум, киберфорум
Наши страницы
IamLost
Войти
Регистрация
Восстановить пароль
Оценить эту запись

C+ Opengl тетрис

Запись от IamLost размещена 22.07.2019 в 13:15

Продолжаю искать своё "призвание". В этот раз решил попробовать OpenGL, до этого уже пробовал с ним работать, это было месяцев 5 назад, но тогда вообще не понял идею связанную с линейной алгеброй, в результате сделал только тетрис, но он был двумерным (камера была в стандартном положении + рисовались только квадратные плоскости). В итоге дней 5 назад взялся попробовать снова, правда уже почти всё забыл, но прогресс по сравнению с прошлым разом заметен.

Сразу скажу, что в линейной алгебре я ещё больший ноль, чем в программировании, да я даже не ноль, а целый -.).

Если кому не сложно, то покажите пример кода/попытайтесь объяснить/можете дать ссылки на информацию по теме(англ читать могу, понимаю), как производить вращение камеры вокруг своей оси. Конкретно здесь это полный юзлесс, так как мир вокруг полностью пуст, однако, в будущем, скорее всего, потребуется.

Github

По совету XLAT(а) избавился от .bat файлов, теперь Release exe-шники сразу закидываются в Game/DLL/xXX).

Касательно предельного "минимализма", менюшки, информацию и т.п. добавлять не буду. Если кто найдёт ошибки, то фиксану.

Всем огромное спасибо за любой фидбек.
Изображения
Тип файла: jpg Screenshot (74).jpg (91.7 Кб, 96 просмотров)
Размещено в Без категории
Просмотров 175 Комментарии 13
Всего комментариев 13
Комментарии
  1. Старый комментарий
    Аватар для 8Observer8
    Цитата:
    как производить вращение камеры вокруг своей оси.
    Вам точно нужно вращение камеры вокруг своей оси? Я не понимаю, зачем это может быть нужно. Если бы нужно было вращение камеры вокруг объекта, то это уже более понятно.

    Я заглянул в директорию: OpenglTetris/3DTetris/Game/DLL/x86/ но там только два файла:
    • glew32.dll
    • glfw3.dll
    , а Exe нету.
    Запись от 8Observer8 размещена 22.07.2019 в 15:21 8Observer8 вне форума
  2. Старый комментарий
    Аватар для 8Observer8
    Цитата:
    Касательно предельного "минимализма", менюшки, информацию и т.п. добавлять не буду.
    Менюшка здесь лишняя, а вот вывод текста необходим. Выведите количество очков, надпись: GameOver и надпись поздравление с победой если был набрано определённое количество очков. Здесь можно начать изучать, как выводить текст на OpenGL: https://learnopengl.com/In-Practice/Text-Rendering Сайт недоступен для РФ, поэтому я использую плагин Browsec для браузеров Chrome и FireFox.
    Запись от 8Observer8 размещена 22.07.2019 в 15:30 8Observer8 вне форума
  3. Старый комментарий
    8Observer8,
    Цитата:
    Вам точно нужно вращение камеры вокруг своей оси? Я не понимаю, зачем это может быть нужно. Если бы нужно было вращение камеры вокруг объекта, то это уже более понятно.
    Конкретно в этом случае нет, но в следующей игре. То есть у меня будет персонаж и, соответственно, камера (глаза), ведь в реальности мы поворачиваем камеру вокруг своей оси, а не вокруг объекта? В игре такая же логика должна быть или нет?
    Накопал, что нужно использовать quanterions, но хз как. Есть только идея для костыля - поворачивать вокруг оси камеры точку, в которую камера смотрит.

    Цитата:
    Я заглянул в директорию: OpenglTetris/3DTetris/Game/DLL/x86/ но там только два файла:
    Они у меня в gitignore. Я не знаю почему, но просто не хотел .exe-шники в гит закидывать, сейчас исправим.

    Цитата:
    Сообщение от 8Observer8 Просмотреть комментарий
    https://learnopengl.com/In-Practice/Text-Rendering Сайт недоступен для РФ, поэтому я использую плагин Browsec для браузеров Chrome и FireFox.
    Вот за это огромное спасибо, я думал у меня с провайдером какие-то проблемы, так как его я туда зайти тупо не могу.

    Цитата:
    Выведите количество очков, надпись: GameOver и надпись поздравление с победой если был набрано определённое количество очков.
    Текст добавить для меня не проблема, проблема в том, что нет желания это делать. Это уже 6 тетрис мб 8? Не знаю, я просто когда начинаю что-то новое учить вместо Hello World'a пишу тетрис... Последний этот, предпоследний был в C#, два дня назад начал разбираться с JS тоже хотел тетрис, но теперь не хочу, они мне надоели, ну их к чёрту.
    Запись от IamLost размещена 22.07.2019 в 15:34 IamLost вне форума
  4. Старый комментарий
    Аватар для 8Observer8
    Цитата:
    То есть у меня будет персонаж и, соответственно, камера (глаза), ведь в реальности мы поворачиваем камеру вокруг своей оси, а не вокруг объекта?
    В виртуальной реальности камера остаётся на месте, а матрица вида (создаваемая с помощью LootAt - Understanding glm::lookAt()) умножается на вертексы объектов так, что они переносятся и объекты поворачиваются создавая эффект, что нам кажется, что камера перемещается, а не объекты. Камеру от первого лица я ещё не делал, но собираюсь. Я делал поворот камеры вокруг объекта, что тоже в реальной жизни очень полезно уметь делать. Я нашёл очень хороший пример здесь: 7.1.5 Rotation by Mouse Я переписал этот пример на C# OpenGL 3.1. Часть кода с самостоятельным созданием матрицы вида:

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
            // Метод getViewMatrix возвращает новую матрица вида, которая определяет
            // положение камеры
            public Matrix4 GetViewMatrix()
            {
                float cosX = (float)Math.Cos(_rotateX / 180f * (float)Math.PI);
                float sinX = (float)Math.Sin(_rotateX / 180f * (float)Math.PI);
                float cosY = (float)Math.Cos(_rotateY / 180f * (float)Math.PI);
                float sinY = (float)Math.Sin(_rotateY / 180f * (float)Math.PI);
     
                Matrix4 matrix = new Matrix4();
     
                matrix.Column0 = new Vector4(cosY, 0, sinY, 0f);
                matrix.Column1 = new Vector4(sinX * sinY, cosX, -sinX * cosY, 0f);
                matrix.Column2 = new Vector4(-cosX * sinY, sinX, cosX * cosY, -_viewDistance);
                matrix.Column3 = new Vector4(0f, 0f, 0f, 1f);
     
                return matrix;
            }
    Запись от 8Observer8 размещена 22.07.2019 в 15:45 8Observer8 вне форума
  5. Старый комментарий
    Аватар для 8Observer8
    Цитата:
    Последний этот, предпоследний был в C#
    Я использую OpenGL из C#, потому что OpenTK.GLControl позволяет выводить OpenGL графику в WinForms и WPF, что позволяет использовать GUI контролы для неигровых приложений и интерактивной 3D графикой. А для простых игр для тренировки я могу использовать эти контролы для каких-то задач в игре, пока нет своего GUI на OpenGL и WebGL.

    Цитата:
    два дня назад начал разбираться с JS тоже хотел тетрис
    Я очень не люблю JS, но обожаю TypeScript, который компилирует в JS. В виде веб-приложения намного меньше гемора с запуском на других машинах. Сейчас у многих Mac, Linux, планшеты, смартфоны. Тетрис в виде WebGL веб-приложения сразу будет работать на 5 основных платформах. Допустим, у вас Windows, а у вашего друга Mac и он очень хочет попробовать, что у вас получилось, а вам хочется очень сильно ему показать. Вам придётся либо покупать Mac, либо устанавливать его на VirtualBox, что очень много времени зайдёт и много места отнимет. Каждый раз когда вы что-то поменяете в игре и захотите, чтобы ваш друг потестил вам нужно запускать VirtualBox, запускать Mac, запускать Visual Studio на Mac (точнее, там что-то другое вместо VS, что ещё больше усложняет задачу и отнимает времени), архив создавать. А если на форум выложили, то сколько людей вы обидите, которые сидят на Linux и Mac. Они не смогут никогда попробовать ваш тетрис, будут злиться, что вы используете Windows, будут ругаться на Microsoft, нерничать и болеть, ведь многие болезни от нервов. В каждой шутке есть доля правды.

    Зацените мою 2D змейку с перспективной камерой на WebGL и TypeScript:
    Можете сделать Fork из песочницы и добавить что-то своё.

    Я хочу из Blender'а загрузить более интересные объекты, чем квадраты. Плюс ещё текстуры. А в перспективе анимации из формата Collada (.dae), потому что .obj формат не умеет хранить анимации созданные в Blender.
    Запись от 8Observer8 размещена 22.07.2019 в 16:25 8Observer8 вне форума
  6. Старый комментарий
    Аватар для 8Observer8
    Я скачал ваши исходники и попытался запустить проект в VS 2015. Что странно, появляется сообщение, что произошли ошибки и прерывается компиляция, а в "Error List" и "Output" никаких ошибок нет.
    Запись от 8Observer8 размещена 22.07.2019 в 16:28 8Observer8 вне форума
  7. Старый комментарий
    Аватар для 8Observer8
    Переключил на x86, появилось сообщение, что "Platform Toolset" не тот, переключил обратно на x64 - "Platform Toolset" стало показывать. В общем, выставил я в настройках свой Toolset, но сейчас появляется такая ошибка:

    Цитата:
    Severity Code Description Project File Line Suppression State
    Error MSB8036 The Windows SDK version 10.0 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". 3DTetris C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\x64\PlatformToolsets\v140\Toolset.targets 36
    Если, как подсказывают в сообщении выше, кликнуть правой кнопкой по Решению, то там нет строки "Retarget solution". Но зато в проекте есть строка "Retarget SDK Version". После этого проект компилируется.

    Но на этапе выполнения выбрасывается исключение на 14 строке в файле "CubeRenderer.cpp":

    C++
    1
    
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    Запись от 8Observer8 размещена 22.07.2019 в 16:39 8Observer8 вне форума
  8. Старый комментарий
    Аватар для 8Observer8
    Вот это исключение выбрасывается во время выполнения: https://social.msdn.microsoft.com/Fo...orum=vcgeneral

    Цитата:
    Exception thrown at 0x0000000000000000 in 3DTetris.exe: 0xC0000005: Access violation executing location 0x0000000000000000.
    Запись от 8Observer8 размещена 22.07.2019 в 16:43 8Observer8 вне форума
    Обновил(-а) 8Observer8 22.07.2019 в 16:47
  9. Старый комментарий
    Аватар для 8Observer8
    Я добавил код отсюда: http://glew.sourceforge.net/basic.html
    C++
    1
    2
    3
    4
    5
    6
    
        GLenum err = glewInit();
        if (GLEW_OK != err)
        {
            /* Problem: glewInit failed, something is seriously wrong. */
            fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
        }
    Выводит в консоль:
    Цитата:
    Error: Missing GL Version
    Запись от 8Observer8 размещена 22.07.2019 в 16:53 8Observer8 вне форума
  10. Старый комментарий
    Аватар для 8Observer8
    Я скачал проект с Exe c GitHub, но не запускается, выводит сообщение: 3DTetris.exe has stopped working
    Запись от 8Observer8 размещена 22.07.2019 в 16:59 8Observer8 вне форума
  11. Старый комментарий
    Цитата:
    Сообщение от 8Observer8 Просмотреть комментарий
    Я скачал проект с Exe c GitHub, но не запускается, выводит сообщение: 3DTetris.exe has stopped working
    Я не знаю что сказать...
    Запись от IamLost размещена 22.07.2019 в 17:04 IamLost вне форума
  12. Старый комментарий
    Аватар для 8Observer8
    Я сам неоднократно сталкивался с этой проблемой. Дело в том, что на многих ноутбуках две видео карты: маломощная и более мощная. По умолчанию запускается с маломощной, где у меня OpenGl 3.1. Принудительно можно запустить с более мощной правым кликом по 3DTetris.exe и выбрать "Run with graphics processor" -> "High-performance NVIDIA processor"

    Чтобы не объяснять каждому пользователю ноутбука с Geforce и Radeon, как нужно запускать игру, я прописывал в коде принудительно запускать с более мощной, а сейчас использу OpenGL 3.1, который есть везде (как я думаю).

    Прописывал так, сразу две строки добавлял:
    C++
    1
    2
    
    extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
    extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
    Первая строка учитывает Geforce, а вторая Radeon.
    Запись от 8Observer8 размещена 22.07.2019 в 17:13 8Observer8 вне форума
    Обновил(-а) 8Observer8 22.07.2019 в 17:15
  13. Старый комментарий
    Аватар для 8Observer8
    Теперь проект у меня запускается:

    3DTetris.cpp

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    #include "Game.h"
    #include "Windows.h"
     
    extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
    extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
     
    int main(int argc, char** argv)
    {
        Game game;
     
        game.Init();
        game.Run();
        game.Free();
     
        return 0;
    }
    Запись от 8Observer8 размещена 22.07.2019 в 17:22 8Observer8 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru