Jump to content
Korean Random

Dragon armor

User
  • Content Count

    151
  • Joined

  • Last visited

  • Days Won

    1

Dragon armor last won the day on August 10 2018

Dragon armor had the most liked content!

Community Reputation

36

3 Followers

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Нет. Мне периодически надоедает заниматься одним и тем же. Сейчас другим проектом занялся. Позже вернусь. Наверное. Ну и тем, кто желает сделать физику танку, может попробовать помочь. Потому что у меня в этом проблема, не получается повторить пример. Можно и по-другому сделать, лишь бы работало. Итак, нужен физический движок. Скачиваем тут. Для сборки нужна VisualStudio 2015. Открываем applications\demosSandbox\projects\visualStudio_2015\demosSandbox.sln. Открываем любой файл из demos, чтобы заменить существующий пример, или добавляем свой собственный, как сделано у меня, заодно добавив вызов функции в mainLogic\DemoEntityManager.cpp (DemoEntityManager::SDKDemos DemoEntityManager::m_demosSelection). #include "toolbox_stdafx.h" #include "SkyBox.h" #include "PhysicsUtils.h" #include "TargaToOpenGl.h" #include "dCustomHinge.h" #include "DemoMesh.h" #include "DemoCamera.h" #include "DebugDisplay.h" #include "DemoEntityManager.h" #include "toolbox_stdafx.h" #include "SkyBox.h" #include "DemoMesh.h" #include "DemoEntity.h" #include "DemoCamera.h" #include "PhysicsUtils.h" #include "DebugDisplay.h" #include "TargaToOpenGl.h" #include "DemoEntityManager.h" #include "DemoCameraManager.h" //#include "DemoEntityListener.h" #include "DemoCameraManager.h" #include "dHighResolutionTimer.h" #include "DemoEntityManager.h" #include "HeightFieldPrimitive.h" #include <dCustomJoint.h> #include <dCustomHinge.h> typedef float vec_t; typedef struct vec3_t { union { struct { vec_t m_x, m_y, m_z; }; vec_t v[3]; }; } vec3_t; typedef struct Mat4x4 { union { struct { vec3_t m_front; float w0; vec3_t m_up; float w1; vec3_t m_right; float w2; vec3_t m_posit; float w3; }; vec_t mat[16]; vec_t m[4][4]; }; } Mat4x4; struct wheel_data_s { float radius; BOOL isLeft; BOOL isLeading; Mat4x4 matrix; }; static const wheel_data_s wheel_data_r[] = { {0.511382f, 0, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.840247f, 3.437970f, 1.000000f, }}, /*WD_R0*/ {0.352796f, 0, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.715852f, -3.440844f, 1.000000f, }}, /*WD_R1*/ {0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 2.490273f, 1.000000f, }}, /*W_R0*/ {0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 1.779711f, 1.000000f, }}, /*W_R1*/ {0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, 1.051981f, 1.000000f, }}, /*W_R2*/ {0.490210f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566073f, 0.345949f, 1.000000f, }}, /*W_R3*/ {0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -0.367665f, 1.000000f, }}, /*W_R4*/ {0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566179f, -1.073491f, 1.000000f, }}, /*W_R5*/ {0.495185f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -1.782996f, 1.000000f, }}, /*W_R6*/ {0.491401f, 0, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 1.536556f, 0.566284f, -2.494514f, 1.000000f, }}, /*W_R7*/ }; static const wheel_data_s wheel_data_l[] = { {0.511382f, 1, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.840247f, 3.437970f, 1.000000f, }}, /*WD_L0*/ {0.352796f, 1, 1, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.715852f, -3.440844f, 1.000000f, }}, /*WD_L1*/ {0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 2.490273f, 1.000000f, }}, /*W_L0*/ {0.491377f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 1.779711f, 1.000000f, }}, /*W_L1*/ {0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, 1.051981f, 1.000000f, }}, /*W_L2*/ {0.490210f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566073f, 0.345949f, 1.000000f, }}, /*W_L3*/ {0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -0.367665f, 1.000000f, }}, /*W_L4*/ {0.491401f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566179f, -1.073491f, 1.000000f, }}, /*W_L5*/ {0.495185f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -1.782996f, 1.000000f, }}, /*W_L6*/ {0.491401f, 1, 0, {1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, -1.536556f, 0.566284f, -2.494514f, 1.000000f, }}, /*W_L7*/ }; static int Ignore_Material_NewtonOnAABBOverlap(const NewtonJoint* const contact, dFloat timestep, int threadIndex) { return 0; } static NewtonBody * Create_Single_Wheel(DemoEntityManager *scene, const int chassis_material, const wheel_data_s *wheel_data, const dMatrix &matrix) { //NewtonCollision *collision = NewtonCreateChamferCylinder(scene->GetNewton(), wheel_data->radius, 0.5f, 0, NULL); NewtonCollision *collision = NewtonCreateCylinder(scene->GetNewton(), wheel_data->radius, wheel_data->radius, 0.5f, 0, NULL); DemoMesh *geometry = new DemoMesh("primitive", scene->GetShaderCache(), collision, "smilli.tga", "smilli.tga", "smilli.tga"); //dMatrix matrix = dMatrix(wheel_data->matrix.mat); //dMatrix matrix = dRollMatrix(90.0f * dDegreeToRad) * m; //m.m_posit.m_y += susp_data[i].radius + .5f; NewtonBody *tire_body = CreateSimpleSolid(scene, geometry, 150, matrix, collision, chassis_material); //DemoEntity *entity geometry->Release(); NewtonDestroyCollision(collision); return tire_body; } static dVector Vec3_To_Vector(const vec3_t &vec) { return dVector(vec.m_x, vec.m_y, vec.m_z); } static void Create_Wheels(DemoEntityManager *scene, const int chassis_material, NewtonBody *hull_body, const wheel_data_s *wheel_data, const uint32_t count) { //NewtonWorld *world = scene->GetNewton(); //dMatrix main_matrix(wheel_data->matrix.m_posit.v); dMatrix main_matrix(dGetIdentityMatrix()); main_matrix.m_posit = Vec3_To_Vector(wheel_data->matrix.m_posit); NewtonBody *main_wheel = Create_Single_Wheel(scene, chassis_material, wheel_data, main_matrix); //dMatrix main_matrix(wheel_data->matrix.mat); const dMatrix rot_matrix = dPitchMatrix(90.0f * dDegreeToRad); dCustomHinge *master = new dCustomHinge(rot_matrix * main_matrix, main_wheel, hull_body); master->EnableMotor(true, 12.1f); master->SetFriction(1.0e4f); dMatrix matrix(dGetIdentityMatrix()); for (uint32_t i = 1; i < count; i++) { //NewtonCollision *collision = NewtonCreateChamferCylinder(world, wheel_data[i].radius, 0.5f, 0, NULL); //DemoMesh *geometry = new DemoMesh("primitive", scene->GetShaderCache(), collision, "smilli.tga", "smilli.tga", "smilli.tga"); //dMatrix matrix = dMatrix(wheel_data[i].matrix.mat); ////dMatrix matrix = dRollMatrix(90.0f * dDegreeToRad) * m; ////m.m_posit.m_y += susp_data[i].radius + .5f; ////DemoEntity *entity //geometry->Release(); //NewtonDestroyCollision(collision); matrix.m_posit = Vec3_To_Vector(wheel_data[i].matrix.m_posit); //dMatrix matrix(wheel_data[i].matrix.mat); NewtonBody *tire_body = Create_Single_Wheel(scene, chassis_material, &wheel_data[i], matrix); //dMatrix pinMatrix0; //dMatrix pinMatrix1; //master->CalculateGlobalMatrix(pinMatrix0, pinMatrix1); dCustomHinge *hinge = new dCustomHinge(rot_matrix * matrix, tire_body, hull_body); //hinge->SetAsSpringDamper(true, 0.9f, 2.0f, 20.0f); //hinge->EnableMotor(true, 1.1f); //dFloat masterRadio = masterTire.m_chamferCylinder.m_height * 0.5f + masterTire.m_chamferCylinder.m_radio; //dFloat slaveRadio = slaveTire.m_chamferCylinder.m_height * 0.5f + slaveTire.m_chamferCylinder.m_radio; //main_matrix = main_matrix.Inverse(); new dCustomGear(wheel_data[i].radius / wheel_data->radius, main_matrix[0], main_matrix[0].Scale(-1.0f), tire_body, main_wheel); //new dCustomGear(wheel_data[i].radius / wheel_data->radius, pinMatrix0[0], pinMatrix0[0].Scale(-1.0f), tire_body, main_wheel); } } void Test(DemoEntityManager* const scene) { /*NewtonBody * const floor =*/ CreateHeightFieldTerrain(scene, HEIGHTFIELD_DEFAULT_SIZE, HEIGHTFIELD_DEFAULT_CELLSIZE, 4.0f, 0.1f, 200.0f, -130.0f); //NewtonCollision* const floorCollision = NewtonBodyGetCollision(floor); dMatrix pos = dGetIdentityMatrix(); NewtonCollision *shape = NewtonCreateBox(scene->GetNewton(), 3.187f, 1.2f, 8.f, 0, &pos[0][0]); pos.m_posit.m_y += 1.2f; NewtonBody *hull_body = NewtonCreateDynamicBody(scene->GetNewton(), shape, &pos[0][0]); NewtonDestroyCollision(shape); shape = NewtonBodyGetCollision(hull_body); NewtonBodySetForceAndTorqueCallback(hull_body, PhysicsApplyGravityForce); NewtonBodySetTransformCallback(hull_body, DemoEntity::TransformCallback); NewtonBodySetMassProperties(hull_body, 50000, shape); DemoMesh *m_redBox = new DemoMesh("platform", scene->GetShaderCache(), shape, "smilli.tga", "smilli.tga", "smilli.tga"); pos.m_posit.m_y = 20; DemoEntity *hull_model = new DemoEntity(pos, NULL); hull_model->SetMesh(m_redBox, dGetIdentityMatrix()); NewtonBodySetUserData(hull_body, hull_model); m_redBox->Release(); // //DemoEntity *hull_model = DemoEntity::LoadNGD_mesh("wte100\\hull_model.ngd", scene->GetNewton(), scene->GetShaderCache()); scene->Append(hull_model); NewtonWorld *world = scene->GetNewton(); const int chassis_material = NewtonMaterialCreateGroupID(world); NewtonMaterialSetCollisionCallback(world, chassis_material, chassis_material, Ignore_Material_NewtonOnAABBOverlap, NULL); const int body_material = NewtonMaterialCreateGroupID(world); NewtonMaterialSetCollisionCallback(world, body_material, chassis_material, Ignore_Material_NewtonOnAABBOverlap, NULL); NewtonBodySetMaterialGroupID(hull_body, body_material); Create_Wheels(scene, chassis_material, hull_body, wheel_data_l, _countof(wheel_data_l)); Create_Wheels(scene, chassis_material, hull_body, wheel_data_r, _countof(wheel_data_r)); }
  2. @Exemp1ee Приветствую. Меня нет в социальных сетях. С разрушаемыми объектами сложности возникли. Не так-то просто их разрушить в физическом движке. В общем-то, догадывался, что нельзя удалять объекты при обновлениях физического мира, а только до или после. И на сайте нашёл подтверждение своим догадкам. Если бы это были динамические тела, было бы проще, в sdk даже пример разрушаемого объекта есть. А у меня это статика. И, как мне кажется, это разумно, ведь объекты не двигаются. Как и деревья до того момента, пока с ним не взаимодействуют, с которыми тоже надо что-то подобное сделать. Просто удалять один статический объект и ставить на его место новый у меня получилось, а разрушить секцию, в которую был удар - нет. Но удаление и создание нового объекта делал в обновлении состояния физического движка и это может быть причиной, почему не получается. Сложность ещё и в нахождении секции, которую надо разрушить при столкновении. То есть, появится должно на одну секцию меньше, чем есть в разрушаемом объекте. И кстати, про деревья. Нашёл вьювер для них. Вот так выглядит коллизия. Ни веток, ни ствола. Простейшие геометрические фигуры. А потом удивляемся, почему куст дырявый и наоборот, наполовину выехал, а всё-равно скрыт. Ранее писал про непонятное значение при проверке, будет ли объект на карте или нет (2 & map.BSMI.bsmi.visibility_masks). Это тип боя. Совсем забыл про это. ctf, domination и прочее. - <type> <name>Capture the Flag</name> <tagName>ctf</tagName> <visibilityMask>1</visibilityMask> </type> - <type> <name>Domination</name> <tagName>domination</tagName> <visibilityMask>2</visibilityMask> </type>
  3. @SkepticalFox Только до этого файла не добраться из space.bin. Загрузка у меня только из того, что привёл. Нужная группа, возможно, не совсем правильно у меня выбирается. Но раз есть строка с нужной группой, почему бы ей не воспользоваться? Надоели ассерты в физическом движке. Интеграция, чувствую, будет проблемной. То геометрия загружаемая не нравится, то сейчас на матрице для дерева падает. Но если ассерты пропустить, то даже загружается. Не всё верно, полигоны ошибочные вижу. Похоже, это дерево ошибочно грузится. А в физдвижке красота прямо-таки. Правда, с вывернутыми нормалями. Но это только в экспорте. Внутри всё должно быть хорошо. 10кк полигонов. Наверное, с bsp придётся разбираться. Там должна быть упрощенная геометрия. Тут слишком много. Но с bsp такая проблема. Всё грузится нормально. Даже видно, что отсутствующие полигоны можно достроить, вершины есть.
  4. scene::IVertexBuffer *vertex_buffer = Create_Vertex_Buffer(&primitives); Тут без индекса. Вершины же едины для секции? scene::CDynamicMeshBuffer *buffer = Create_Mesh_Buffer(&primitives, render_item->primitive_index, vertex_buffer, indexType); Тут индексы загружаю. static scene::CDynamicMeshBuffer * Create_Mesh_Buffer(primitives_s *prim, const uint32_t groupe_index, scene::IVertexBuffer *vertex_buffer, const video::E_INDEX_TYPE indexType) { scene::CDynamicMeshBuffer *buffer = new scene::CDynamicMeshBuffer(video::EVT_STANDARD, indexType); scene::IIndexBuffer &indixes = buffer->getIndexBuffer(); buffer->setVertexBuffer(vertex_buffer); indixes.set_used(prim->groupe[groupe_index].triangles_count * 3); memcpy( indixes.getData(), prim->groupe[groupe_index].index_offset * prim->index_size + prim->indices, prim->index_size * prim->groupe[groupe_index].triangles_count * 3); indixes.setHardwareMappingHint(scene::EHM_STATIC); buffer->recalculateBoundingBox(); return buffer; } Дальше коллизию создаю тем же способом, что загружал вершины и индексы. typedef struct vertex_data_s { uint32_t count; vec3_t *position; vec3_t *normal; vec2_t *uv; } vertex_data_s; typedef struct primitives_s { uint32_t index_size; uint32_t index_count; uint8_t *indices; triangle_groupe_s *groupe; uint32_t groupe_count; vertex_data_s vertex_data; } primitives_s; typedef struct triangle_groupe_s { uint32_t index_offset; uint32_t triangles_count; // Count of indexes = 3 * triangles_count uint32_t vertex_offset; uint32_t vertex_count; } triangle_groupe_s;
  5. Да. У меня даже ассерт есть assert(primitives.groupe_count > render_item->primitive_index); primitives - это загруженные секции из файла. А название секций из verts_name_fnv и prims_name_fnv. verts_name_fnv и prims_name_fnv это такие вот строки content/Environment/env044_AFStones/normal/lod0/env044_AFStone2.primitives/indices content/Environment/env044_AFStones/normal/lod0/env044_AFStone3.primitives/vertices Достаточно обрезать до primitives/ и название нужных секций есть.
  6. Для простоты у меня сейчас нет лодов. Беру первый индекс из bsmo.models_loddings->index0, по нему затем прохожу по всем элементам от bsmo.lod_renders->index0 до bsmo.lod_renders->index1. Для каждой части загружаю материал. В общем, цепочка таблиц 0-7-8. А там указывается группа примитивов. До этого думал, что только index и vertex бывают, а потом попробовал загрузить другую карту. Пришлось исправлять и делать загрузку именно из этих двух строк verts_name_fnv и prims_name_fnv. Подозреваю, мы об одном и том же говорим. Если у тебя всё загружается правильно и у меня правильно.
  7. Загружаю файл из render_item->verts_name_fnv и render_item->prims_name_fnv для вершин и индексов соответственно.Секцию BWSG не использую. Это предварительная загрузка моделей, чтобы не дублировать информацию. А потом прохожу по секции BSMI, количество моделей беру из map.BSMI.bsmi.chunk_models.count, хотя без разницы, из какой таблицы брать, нулевой, первой. Даже если лишнее гружу, то не использованная модель не должна вовсе выводиться. Но, как уже написал, специально проверил, сколько загруженных моделей используется. И все из секции BSMO используются в BSMI.bsmo_models_id. Может и неправильно делаю. Попробую пока что разобраться с разрушаемыми объектами, чтобы они разрушаться начали. Вот два скрина из вьювера. Первый - загружаю только видимые объекты (условие (chunk_model[ i ].unknown & 1) && (2 & map.BSMI.bsmi.visibility_masks.chunk_4[ i ].index) != 0. Второй - инвертирование условия. Два объекта (неразрушаемые изначально) исчезли.
  8. Если выводить всё подряд из bsmo_models_id, то будут и разрушаемые объекты, и неразрушаемые. Одни накладываются на другие и даже не заметно, что их больше одного.
  9. В таблице BSMI.8_12 индексы 0 и 1 - это новые объекты, которые появятся в замен разрушенного. 4 объекта соответствуют трём разрушаемым секциям и один - это основание. Просто меня смутило твоё описание разрушаемых объектов. На всякий случай, решил спросить. Вдруг сам ошибся. Тогда всё норм. @SkepticalFox Тогда встречный вопрос. А как обходите вывод разрушамых объектов? Они же мешаться будут. Если всё подряд из bsmo_models_id выводить.
  10. @SkepticalFox Там один флаг. Проверка только на &1. Объект видимый, это разрушаемое по секциям здание. Но на момент создания карты должно быть невидимо. Вот он содержит все используемые объекты. И разрушаемые, и неразрушаемые.
  11. @SkepticalFox Так ты написал, что BSMI ссылается только на неразрушаемые объекты. Вот не получается так.
  12. Сейчас пытаюсь с разрушаемыми объектами разобраться. И тут не понятно. Вот тут маленькая неувязочка. В BSMI есть ссылки на все объекты. Специально проверял, заведя счётчик использованных моделей. Все были больше нуля, за исключением тех, у кого -1 изначально в имени было. Есть структура у тебя ChunkModel, второе поле unknown. Это очень похоже не на unknown, а на видимый объект или нет. Есть такая проверка: (chunk_model[ i ].unknown & 1) && (2 & map.BSMI.bsmi.visibility_masks.chunk_4[ i ].index) Где i - индекс модели 2 - вообще без понятия на данный момент, откуда оно берётся Если сделать вывод моделей только в случае, когда проверка проходит, то выводятся только неразрушаемые модели. Если же инвертировать его, то пропадают все изначально неразрушаемые здания (таких два на Эль-Халуфе, оба на левой базе). Остальные модели останутся неразрушаемыми. BSMI.8_12 очень похоже на индексы разрушаемых объектов. Например, индекс 23 - это "content/Buildings/bldAF_003_vhouse/normal/lod0/bldAF_003_vhouse.primitives" [23] 4294967295 4294967295 22 А индекс 22 - "content/Buildings/bldAF_003_vhouse/merged/lod0/bldAF_003_vhouse.primitives" [22] 23 26 4294967295 normal - разрушаемый по секциям объект. merged - модель неразрушаемого домика. И так выглядит весь кусок таблицы [6][22] 23 26 4294967295 [6][23] 4294967295 4294967295 22 [6][24] 4294967295 4294967295 22 [6][25] 4294967295 4294967295 22 [6][26] 4294967295 4294967295 22 Или опять занимаюсь уже ранее исследованным?
  13. Забавно, искал неразрушаемое дерево на Редшире, а его и нет. Оно было добавлено позже. Попытался загрузить другую карту и узнал, что в .primitives_processed может быть множество 3d моделей. Пришлось долго переделывать загрузчик. Но не понятно, как bsp для них всех грузится. Оно едино для всего файла. По материалу определяется? Значит, где-то есть его индекс. Никто bsp не разбирал? @Slava7572 Вот смотри скрин. Это про дырявые кусты. Альфа-канал выключен, поэтому видно так, как будет видеть физический движок. При некоторых позициях можно засветиться. Такое можно и на актуальной версии сделать, достаточно убрать альфа-канал у всей растительности. Для определения кустов без маскировки это не поможет, но дыры между кустами будет видно. И какие всё-таки карты были хорошие по сравнению с тем, что сейчас. Wot, который мы потеряли. Из темы, на которую ссылку приводили. Ага.
  14. Но если на офсайте у них есть описание работы механик игры, всё-таки стоит сделать их актуальными. А в моей цитате было сказано именно об навыке "Маскировка". Речь именно о навыке. Вот боевое братство не зависит ведь от контузии экипажа? А радиоперехват зависит. И лампа. Хотя ты прав. В видео сказали так. Но при такой фразе понимают именно итоговый коэффициент маскировки. А не чисто от танка.
×
×
  • Create New...