Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
7 страниц V  < 1 2 3 4 5 > »   
Тема закрытаНачать новую тему
> Разработка игрового движка с нуля, как создать игровой движок
Молния в вакууме
сообщение 12.12.2017, 00:17
Сообщение #41


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


andreyholkin, посмотри значит что с правами у этого раздела.
Перейти в начало страницы
 
Diesel
сообщение 12.12.2017, 00:43
Сообщение #42


Почти Мастер
***********

Репутация:   111  
Группа: Участник
Сообщений: 1158
Награды: 3
Регистрация: 07.08.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа



Запустил. Вывод напросился, что физика 2.7 не работает в Win10x64
Заменил рестребутивы на 2.8.1

Сообщение отредактировал andreyholkin - 12.12.2017, 01:13
Перейти в начало страницы
 
Diesel
сообщение 12.12.2017, 01:10
Сообщение #43


Почти Мастер
***********

Репутация:   111  
Группа: Участник
Сообщений: 1158
Награды: 3
Регистрация: 07.08.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Есть подробности. Дело было не в бабине...
Дело в том, что я второй раз, до этого установил инсталятор. Видимо первый раз в реестр не пустило. А физика не причём, потому, как на старой физике всё работает.
Перейти в начало страницы
 
autistic
сообщение 17.12.2017, 13:41
Сообщение #44


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Народ! Тут возникла мысль, что экспортировать модельки из майи скриптом на С++ не очень удобно, а точнее совсем неудобно, и рано или поздно встанет вопрос о том, что неплохо бы иметь удобный инструмент который сможет не только импорт отекстуренных мешей делать, а позволит настраивать положение, материалы, анимации, физическую модель и т.д.
В общем задумался я тут какую технологию использовать для этого дела. Пока не сильно задумался, просто несколько очевидных решений которые первыми пришли в голову в порядке убывания приоритета:
1. Использовать C# в связке с С++. Для связывания использовать какой-нибудь сторонний биндинг, основанный на C++/CLI.
2. Использовать C# в связке с С++. Для связывания написать скрипт, скажем на питоне, который из интерфейсов С++ классов будет генерировать код для оболочки на C++/CLI.
3. Использовать С++ в связке с библиотекой Qt.

Какие я вижу преимущества и недостатки у перечисленных выше способов:
Плюсы 1 и 2 способов:
Ускорение времени разработки за счет гибкости и удобства языка C# в плане построения пользовательского интерфейса.
Компактное приложение, которое можно легко развернуть на любой тачке т.к. не нужно тянуть 150мб зависимостей в виде dll, все необходимые рантаймы уже установлены в ОС.

Минусы 1 способа:
Сложности с подбором и настройкой подходящего биндинга, а также с развертыванием ненобходимого окружения для его работы.

Минусы 2 способа:
Нужно тратить время на разработку собственного кодогенератора, а с учетом того что С++ сложный контекстно зависимый язык, парсер постоянно придется дорабатывать и тратить на это время и нервы в самый неподходящий момент.

Плюсы 3 способа:
Очевидно что это самый простой, на первый взгляд, способ т.к. не нужно никаких биндингов для связывания с нативным кодом движка и библиотек.
Независимость конечного продукта от платформы.

Минусы 3 способа:
Неудобство и замедление скорости разработки пользовательского интерфейса т.к. С++ плохо предназначен для этого.
Общая кривость, избыточность и плохой дизайн библиотеки Qt.
Сложности сопряженные со сборкой и распространением полученного продукта на машины, на которых не установлены рантайм библиотеки Qt соответствующей версии.

Что посоветуете, какой вариант наиболее правильный?

Все это далеко идущие планы, конечно, а пока вот вам немного котика smile.gif


Сообщение отредактировал refuse - 17.12.2017, 13:43


--------------------
nop
Перейти в начало страницы
 
jamakasi
сообщение 17.12.2017, 17:57
Сообщение #45


Доктор Игровых Наук
*******************

Репутация:   544  
Группа: Участник
Сообщений: 3657
Награды: 9
Регистрация: 12.07.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 17.12.2017, 13:41) *
1. Использовать C# в связке с С++. Для связывания использовать какой-нибудь сторонний биндинг, основанный на C++/CLI.
2. Использовать C# в связке с С++. Для связывания написать скрипт, скажем на питоне, который из интерфейсов С++ классов будет генерировать код для оболочки на C++/CLI.
3. Использовать С++ в связке с библиотекой Qt.

4. Заюзать православный fbx который решает все вопросы и у которого есть вообще все в т.ч. поддержка кучи 3д пакетов, отличный сдк и тонны утилит на любой вкус.
Перейти в начало страницы
 
autistic
сообщение 17.12.2017, 18:34
Сообщение #46


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(jamakasi @ 17.12.2017, 19:57) *
Заюзать православный fbx который решает все вопросы

Ну его-то и предполагается использовать в качестве промежуточного контейнера, в каком-то виде он и сейчас уже используется, но речь не об этом. Нужен некий инструмент в котором можно собрать воедино и настроить различные компоненты модели, например назначить отдельным поверхностям свойства материала, которые прописаны в GLSL-шейдере.


--------------------
nop
Перейти в начало страницы
 
NanoBot-AMK
сообщение 17.12.2017, 19:25
Сообщение #47


Почти Мастер
***********

Репутация:   75  
Группа: Участник
Сообщений: 1168
Награды: 4
Регистрация: 10.11.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Forser @ 26.09.2017, 08:58) *
NanoBot-AMK, сделать просто конвертер и не мучаться.

Не понял, какой ещё конвертер. Блин, прочитал как конвейер. ohmy.gif


--------------------
СТАЛКЕР только для ПК!
Перейти в начало страницы
 
Молния в вакууме
сообщение 17.12.2017, 20:29
Сообщение #48


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 17.12.2017, 13:41) *
Неудобство и замедление скорости разработки пользовательского интерфейса т.к. С++ плохо предназначен для этого.
Общая кривость, избыточность и плохой дизайн библиотеки Qt.
Сложности сопряженные со сборкой и распространением полученного продукта на машины, на которых не установлены рантайм библиотеки Qt соответствующей версии.

Что, неужели совсем нет хорошей библиотеки для интерфейса на C/C++?
Перейти в начало страницы
 
autistic
сообщение 17.12.2017, 21:00
Сообщение #49


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(saas @ 17.12.2017, 22:29) *
Что, неужели совсем нет хорошей библиотеки для интерфейса на C/C++?

В том то и вопрос - какая библиотека для построения гуя на С++ хорошо подойдет, если такая имеется, для быстрого и безболезненного формошлепства, и какие альтернативы из имеющихся будут не хуже?
Из тех вариантов что известны мне - ни один не подходит. MFC для быстрой разработки не подойдет. Всякие WxWidgets и прочие колхозные поделки тоже не годятся. Продукты Борланда безбожно устарели. Остается выбор между Qt и Windows Forms.

Сообщение отредактировал refuse - 17.12.2017, 21:05


--------------------
nop
Перейти в начало страницы
 
Молния в вакууме
сообщение 17.12.2017, 21:10
Сообщение #50


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 17.12.2017, 21:00) *
Продукты Борланда безбожно устарели.

Я и не предлагаю. laugh.gif
В X-Ray 1.8 используют вот такую библиотеку: https://github.com/ocornut/imgui.
Перейти в начало страницы
 
autistic
сообщение 17.12.2017, 21:17
Сообщение #51


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(saas @ 17.12.2017, 23:10) *
В X-Ray 1.8 используют вот такую библиотеку

Ну это что-то MyGui-подобное, оно рисуется непосредственно во вьюпорте движка. А хочется-то для отдельного приложения библиотеку промышленного качества и чтоб без лишнего геморроя smile.gif

Сообщение отредактировал refuse - 17.12.2017, 21:17


--------------------
nop
Перейти в начало страницы
 
autistic
сообщение 23.12.2017, 16:37
Сообщение #52


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


В общем пока обойдусь средствами майи, позже вернусь к этому вопросу если возникнет такая необходимость. Думаю начать делать простую игрушку какую-нибудь, например шашки онлайн или 3Д-головоломку, или что-то в этом духе, как вам идея? Мб у кого-то есть подходящая идейка такой мега-игры, оригинальной, но простой, а главное чтоб приносила многоденег и сделала меня богатеньким буратиной? biggrin.gif

Тем временем котик оброс шерстью.


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 23.12.2017, 16:47
Сообщение #53


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 23.12.2017, 16:37) *
шашки онлайн или 3Д-головоломку,

Только Сталкер2Д, ну или 2.5Д.
Перейти в начало страницы
 
autistic
сообщение 23.12.2017, 17:17
Сообщение #54


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 23.12.2017, 18:47) *
Только Сталкер2Д, ну или 2.5Д.

Не, сталкер это слишком сложно, к тому же для 2Д нужно уметь хорошо и много рисовать. Было бы норм запилить какую-нибудь трехмерную игру с ограниченным набором моделек, но зато качественных и чтоб отрисовывались при помощи всяких продвинутых техник, вот я и подумал про головоломку или логическую игру.

+
2,5D я уже делал однажды, как-то не вкатило, душа просит как минимум Сталкер или Фаллаут, на худой конец ГТА5 smile.gif


Сообщение отредактировал refuse - 23.12.2017, 17:19


--------------------
nop
Перейти в начало страницы
 
dPlayer
сообщение 23.12.2017, 17:26
Сообщение #55


Самый некомпетентный на форуме
********************

Репутация:   312  
Группа: Участник
Сообщений: 4074
Награды: 4
Регистрация: 04.09.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 23.12.2017, 18:37) *
шашки онлайн

Шахматы с сталкерскими персонажами.
Перейти в начало страницы
 
Diesel
сообщение 23.12.2017, 17:43
Сообщение #56


Почти Мастер
***********

Репутация:   111  
Группа: Участник
Сообщений: 1158
Награды: 3
Регистрация: 07.08.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 23.12.2017, 19:17) *
на худой конец ГТА5 smile.gif


Можно в азоте заморозиться, что бы увидеть результат? biggrin.gif
Перейти в начало страницы
 
abramcumner
сообщение 23.12.2017, 20:05
Сообщение #57


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 23.12.2017, 17:17) *
Было бы норм запилить какую-нибудь трехмерную игру с ограниченным набором моделек, но зато качественных и чтоб отрисовывались при помощи всяких продвинутых техник, вот я и подумал про головоломку или логическую игру.

Настолка? Очень сталкерская по сути.
В зону, которая меняется после каждого выброса, входит группа сталкеров. Цель - вынести из зоны как можно больше артефактов. Их поджидают смертельные аномали, мутанты и таинственные жители зоны.
Перейти в начало страницы
 
Молния в вакууме
сообщение 23.12.2017, 20:26
Сообщение #58


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 23.12.2017, 16:37) *
Тем временем котик оброс шерстью.

Хм. А я думал шерсть, которая вырастет на коте, будет шейдерной.
Перейти в начало страницы
 
autistic
сообщение 23.12.2017, 20:47
Сообщение #59


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(saas @ 23.12.2017, 22:26) *
Хм. А я думал шерсть, которая вырастет на коте, будет шейдерной.

А она и есть шейдерная, только без карты нормалей и освещения, всему свое время. Движок не поддерживает FFP в принципе.

Текст программы
Код
#include <engine/model.h>
#include <engine/platform.h>
#include <engine/renderer.h>
#include <engine/texture.h>

std::string vertexShaderSrc =
"\n\
#version 330\n\
attribute vec4 vertexPosition;\n\
attribute vec4 vertexNormal;\n\
attribute vec4 vertexTangent;\n\
attribute vec4 vertexBinormal;\n\
attribute vec2 vertexTexcoords;\n\
uniform mat4 modelViewProj;\n\
out vec2 UV;\n\
void main()\n\
{\n\
  gl_Position = modelViewProj * vertexPosition;\n\
  UV = vertexTexcoords;\n\
}\n\
\0";

std::string fragmentShaderSrc =
"\n\
#version 330\n\
uniform sampler2D diffuseMap;\n\
in vec2 UV;\n\
out vec4 color;\n\
void main()\n\
{\n\
  color = texture(diffuseMap, UV);\n\
}\n\
\0";

int main()
{
    Engine::Platform *platform = Engine::GetPlatform();
    if (!platform->CreateMainWindow())
        return -1;

    Engine::Renderer *renderer = Engine::GetRenderer();
    Engine::ModelManager *modelManager = Engine::GetModelManager();
    Engine::ModelPtr teapot = modelManager->GetModel("teapot");
    Engine::HardwareBufferId hardwareBuffer = teapot->GetGraphicsShapes().at(0)->hardwareBufferId;

    Engine::Matrix4 rotation(Engine::Matrix3(M_PI * 0.25f, M_PI * 0.1f, 0));

    Engine::Matrix4 proj, view, model, modelViewProj;
    view.SetIdentity();
    proj.SetPerspective(1.3f, 1.78f, 0.1f, 100000.0f);
    model.SetTranslation(Engine::Vector3(-0.35, -0.3f, -1.5f));
    modelViewProj = rotation * model * proj;

    size_t size = vertexShaderSrc.size();
    const Engine::Byte *pVertShaderData = reinterpret_cast<const Engine::Byte*>(vertexShaderSrc.data());
    Engine::ByteVector vertexSrc(pVertShaderData, pVertShaderData + size);

    size = fragmentShaderSrc.size();
    const Engine::Byte *pFragShaderData = reinterpret_cast<const Engine::Byte*>(fragmentShaderSrc.data());
    Engine::ByteVector fragSrc(pFragShaderData, pFragShaderData + size);

    auto progId = renderer->CreateGpuProgram(Engine::STATIC_VERTEX, vertexSrc, fragSrc);
    renderer->BindGpuProgram(progId);

    renderer->SetGpuProgramConstant(progId, "modelViewProj", modelViewProj);

    Engine::TexturePtr cat = Engine::GetTextureManager()->GetTexture("cat_diff");
    renderer->BindHardwareTexture(cat->GetHardwareTexture(), Engine::DIFFUSE_MAP);

    platform->SetMainWindowSize(1280, 720, false);
    renderer->SetViewport(1280, 720);

    for (;;) {
        if (!platform->UpdateMainWindow()) {
            break;
        }

        renderer->BeginRenderFrame();
        renderer->DrawHardwareBuffer(hardwareBuffer);
        renderer->EndRenderFrame();
    }

    renderer->DestroyGpuProgram(progId);
}



Конвертер моделей
Код
#include <exception>
#include <fstream>
#include <iostream>
#include <set>
#include <vector>

#include <fbxsdk.h>

void ConvertMesh(FbxMesh *fbxMesh, std::vector<short> &indices, std::vector<float> &vertices)
{
    if (!fbxMesh->IsTriangleMesh()) {
        throw std::exception("The mesh should be a triangle mesh");
    }

    const FbxVector4 *controlPoints = fbxMesh->GetControlPoints();

    FbxStringList uvSets;
    fbxMesh->GetUVSetNames(uvSets);

    short k = 0;
    for (int i = 0; i < fbxMesh->GetPolygonCount(); ++i) {
        for (int j = 0; j < 3; ++j) {
            int index = fbxMesh->GetPolygonVertex(i, j);
            indices.push_back(k++);

            const FbxVector4 &controlPoint = controlPoints[index];
            vertices.push_back(controlPoint[0]);
            vertices.push_back(controlPoint[1]);
            vertices.push_back(controlPoint[2]);
            vertices.resize(vertices.size() + 9);

            bool unmapped;
            FbxVector2 textureUV;
            fbxMesh->GetPolygonVertexUV(i, j, uvSets[0], textureUV, unmapped);
            vertices.push_back(textureUV[0]);
            vertices.push_back(1-textureUV[1]);
        }
    }
}

void ConvertMesh(const std::vector<short> &indices, const std::vector<float> &vertices, FbxMesh *mesh)
{
    int count = vertices.size() / 14;
    mesh->InitControlPoints(count);

    const float *verts = vertices.data();
    FbxVector4 *points = mesh->GetControlPoints();

    for (int i = 0; i < count; ++i) {
        float x = *verts++;
        float y = *verts++;
        float z = *verts++;
        verts += 11;
        points[i] = FbxVector4(x, y, z);
    }

    count = indices.size();
    for (int i = 0; i < count; i +=3) {
        mesh->BeginPolygon();
        for (int j = 0; j < 3; ++j) {
            int index = indices[i + j];
            mesh->AddPolygon(index);
        }
        mesh->EndPolygon();
    }
}

void ExportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxImporter* importer = FbxImporter::Create(sdkManager, "");
    if (!importer->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene* scene = FbxScene::Create(sdkManager, "ImportedScene");
    importer->Import(scene);
    importer->Destroy();

    std::ofstream file;
    file.open(target, std::ios::out | std::ios::binary);
    file.write("mdl\0", 4);

    short minor = 1, major = 0;
    file.write((char*)&major, 2);
    file.write((char*)&minor, 2);

    FbxNode *root = scene->GetRootNode();
    for (int i = 0; i < root->GetChildCount(); ++i) {
        std::vector<short> indices;
        std::vector<float> vertices;
        FbxNode *child = root->GetChild(i);
        ConvertMesh(child->GetMesh(), indices, vertices);

        int chunkId = 1, size = indices.size() * 2, fmt = 31;
        file.write((char*)&chunkId, 4);
        file.write((char*)&size, 4);
        file.write((const char*)indices.data(), indices.size() * 2);

        size = vertices.size() * 4;
        file.write((char*)&fmt, 4);
        file.write((char*)&size, 4);
        file.write((const char*)vertices.data(), vertices.size() * 4);
    }

    file.close();
}

void ImportMesh(const char *source, const char *target)
{
    std::vector<short> indices;
    std::vector<float> vertices;

    std::ifstream file;
    file.open(source, std::ios::in | std::ios::binary);
    if (!file)
        throw std::exception("Can't open source file");

    int size;
    file.seekg(12, SEEK_CUR);
    file.read((char*)&size, 4);

    indices.resize(size);
    file.read((char*)&indices[0], size);

    file.seekg(4, SEEK_CUR);
    file.read((char*)&size, 4);
    vertices.resize(size);
    file.read((char*)&vertices[0], size);

    FbxManager *sdkManager = FbxManager::Create();
    FbxIOSettings *ios = FbxIOSettings::Create(sdkManager, IOSROOT);
    sdkManager->SetIOSettings(ios);

    FbxExporter* exporter = FbxExporter::Create(sdkManager, "");
    if (!exporter->Initialize(source, -1, sdkManager->GetIOSettings()))
        throw std::exception("Call to FbxImporter::Initialize() failed.");

    FbxScene *scene = FbxScene::Create(sdkManager, "ExportedScene");
    FbxNode *root = scene->GetRootNode();

    FbxNode *child = FbxNode::Create(sdkManager, "teapot");
    FbxMesh *mesh = FbxMesh::Create(scene, "teapot");

    ConvertMesh(indices, vertices, mesh);

    child->SetNodeAttribute(mesh);
    root->AddChild(child);

    exporter->Export(scene);
    exporter->Destroy();
}

int main(int argc, char *argv[])
{
    try {
        if (argc != 3) {
            throw std::exception("Invalid parameters passed.");
        }

#if 0
        ExportMesh(argv[1], argv[2]);
#elif 0
        ImportMesh(argv[2], argv[1]);
#else
        ExportMesh(argv[1], argv[2]);
        ImportMesh(argv[2], argv[1]);
#endif
    }
    catch (const std::exception &error) {
        std::clog << error.what() << std::endl;
    }
}


Конвертер текстур в формат PVR можно скачать с оф. сайта PowerVR

Прикрепленные файлы
Прикрепленный файл  cat.zip ( 311,28 килобайт ) Кол-во скачиваний: 22
 


--------------------
nop
Перейти в начало страницы
 
Молния в вакууме
сообщение 23.12.2017, 21:01
Сообщение #60


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


refuse, я про такую:
Перейти в начало страницы
 

7 страниц V  < 1 2 3 4 5 > » 
Тема закрытаНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29.03.2024, 05:18