Разработка игрового движка с нуля, как создать игровой движок |
Здравствуйте, гость ( Авторизация | Регистрация )
Разработка игрового движка с нуля, как создать игровой движок |
12.12.2017, 00:17
Сообщение
#41
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
andreyholkin, посмотри значит что с правами у этого раздела.
|
 
|
|
|
|
12.12.2017, 00:43
Сообщение
#42
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
|
 
|
|
12.12.2017, 01:10
Сообщение
#43
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
Есть подробности. Дело было не в бабине...
Дело в том, что я второй раз, до этого установил инсталятор. Видимо первый раз в реестр не пустило. А физика не причём, потому, как на старой физике всё работает. |
 
|
|
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 соответствующей версии. Что посоветуете, какой вариант наиболее правильный? Все это далеко идущие планы, конечно, а пока вот вам немного котика Сообщение отредактировал refuse - 17.12.2017, 13:43 -------------------- nop
|
 
|
|
17.12.2017, 17:57
Сообщение
#45
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
1. Использовать C# в связке с С++. Для связывания использовать какой-нибудь сторонний биндинг, основанный на C++/CLI. 2. Использовать C# в связке с С++. Для связывания написать скрипт, скажем на питоне, который из интерфейсов С++ классов будет генерировать код для оболочки на C++/CLI. 3. Использовать С++ в связке с библиотекой Qt. 4. Заюзать православный fbx который решает все вопросы и у которого есть вообще все в т.ч. поддержка кучи 3д пакетов, отличный сдк и тонны утилит на любой вкус. |
 
|
|
17.12.2017, 18:34
Сообщение
#46
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Заюзать православный fbx который решает все вопросы Ну его-то и предполагается использовать в качестве промежуточного контейнера, в каком-то виде он и сейчас уже используется, но речь не об этом. Нужен некий инструмент в котором можно собрать воедино и настроить различные компоненты модели, например назначить отдельным поверхностям свойства материала, которые прописаны в GLSL-шейдере. -------------------- nop
|
 
|
|
17.12.2017, 19:25
Сообщение
#47
|
|
Почти Мастер Репутация: 75 Группа: Участник Сообщений: 1168 Награды: 4 Регистрация: 10.11.2015 |
NanoBot-AMK, сделать просто конвертер и не мучаться. Не понял, какой ещё конвертер. Блин, прочитал как конвейер. -------------------- СТАЛКЕР только для ПК!
|
 
|
|
17.12.2017, 20:29
Сообщение
#48
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Неудобство и замедление скорости разработки пользовательского интерфейса т.к. С++ плохо предназначен для этого. Общая кривость, избыточность и плохой дизайн библиотеки Qt. Сложности сопряженные со сборкой и распространением полученного продукта на машины, на которых не установлены рантайм библиотеки Qt соответствующей версии. Что, неужели совсем нет хорошей библиотеки для интерфейса на C/C++? |
 
|
|
17.12.2017, 21:00
Сообщение
#49
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Что, неужели совсем нет хорошей библиотеки для интерфейса на 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 |
Продукты Борланда безбожно устарели. Я и не предлагаю. В X-Ray 1.8 используют вот такую библиотеку: |
 
|
|
17.12.2017, 21:17
Сообщение
#51
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
В X-Ray 1.8 используют вот такую библиотеку Ну это что-то Сообщение отредактировал refuse - 17.12.2017, 21:17 -------------------- nop
|
 
|
|
23.12.2017, 16:37
Сообщение
#52
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
В общем пока обойдусь средствами майи, позже вернусь к этому вопросу если возникнет такая необходимость. Думаю начать делать простую игрушку какую-нибудь, например шашки онлайн или 3Д-головоломку, или что-то в этом духе, как вам идея? Мб у кого-то есть подходящая идейка такой мега-игры, оригинальной, но простой, а главное чтоб приносила многоденег и сделала меня богатеньким буратиной?
Тем временем котик оброс шерстью. -------------------- nop
|
 
|
|
23.12.2017, 16:47
Сообщение
#53
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
23.12.2017, 17:17
Сообщение
#54
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Только Сталкер2Д, ну или 2.5Д. Не, сталкер это слишком сложно, к тому же для 2Д нужно уметь хорошо и много рисовать. Было бы норм запилить какую-нибудь трехмерную игру с ограниченным набором моделек, но зато качественных и чтоб отрисовывались при помощи всяких продвинутых техник, вот я и подумал про головоломку или логическую игру. + Сообщение отредактировал refuse - 23.12.2017, 17:19 -------------------- nop
|
 
|
|
23.12.2017, 17:26
Сообщение
#55
|
|
Самый некомпетентный на форуме Репутация: 312 Группа: Участник Сообщений: 4074 Награды: 4 Регистрация: 04.09.2012 |
|
 
|
|
23.12.2017, 17:43
Сообщение
#56
|
|
Почти Мастер Репутация: 111 Группа: Участник Сообщений: 1158 Награды: 3 Регистрация: 07.08.2015 |
|
 
|
|
23.12.2017, 20:05
Сообщение
#57
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Было бы норм запилить какую-нибудь трехмерную игру с ограниченным набором моделек, но зато качественных и чтоб отрисовывались при помощи всяких продвинутых техник, вот я и подумал про головоломку или логическую игру. В зону, которая меняется после каждого выброса, входит группа сталкеров. Цель - вынести из зоны как можно больше артефактов. Их поджидают смертельные аномали, мутанты и таинственные жители зоны. |
 
|
|
23.12.2017, 20:26
Сообщение
#58
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
|
 
|
|
23.12.2017, 20:47
Сообщение
#59
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Хм. А я думал шерсть, которая вырастет на коте, будет шейдерной. А она и есть шейдерная, только без карты нормалей и освещения, всему свое время. Движок не поддерживает 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 можно
Прикрепленные файлы
-------------------- nop
|
 
|
|
23.12.2017, 21:01
Сообщение
#60
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
refuse, я про такую:
|
 
|
|
Текстовая версия | Сейчас: 28.04.2024, 05:40 |