Merge branch 'salmon' into pavel

This commit is contained in:
Pavel Makarov 2025-03-02 01:50:52 +06:00 committed by GitHub
commit 37e2c489a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 17555 additions and 117 deletions

View File

@ -251,7 +251,7 @@ namespace ZL
}
std::getline(f, tempLine);//=== Vertex Weights ===
std::vector<std::array<BoneWeight, 3>> localVerticesBoneWeight;
std::vector<std::array<BoneWeight, MAX_BONE_COUNT>> localVerticesBoneWeight;
localVerticesBoneWeight.resize(numberVertices);
for (int i = 0; i < numberVertices; i++)
@ -268,9 +268,9 @@ namespace ZL
throw std::runtime_error("No number found in the input string.");
}
if (boneCount > 3)
if (boneCount > MAX_BONE_COUNT)
{
throw std::runtime_error("more than 3 bones");
throw std::runtime_error("more than 5 bones");
}
float sumWeights = 0;
@ -464,6 +464,7 @@ namespace ZL
//std::vector<Matrix3f> skinningMatrixForEachBone;
skinningMatrixForEachBone.resize(currentBones.size());
for (int i = 0; i < currentBones.size(); i++)
{
currentBones[i].boneStartWorld.v[0] = oneFrameBones[i].boneStartWorld.v[0] + t * (nextFrameBones[i].boneStartWorld.v[0] - oneFrameBones[i].boneStartWorld.v[0]);
@ -472,8 +473,10 @@ namespace ZL
Vector4f q1 = MatrixToQuat(oneFrameBones[i].boneMatrixWorld);
Vector4f q2 = MatrixToQuat(nextFrameBones[i].boneMatrixWorld);
Vector4f q1_norm = q1.normalized();
Vector4f q2_norm = q2.normalized();
Vector4f result = slerp(q1, q2, t);
Vector4f result = slerp(q1_norm, q2_norm, t);
currentBones[i].boneMatrixWorld = QuatToMatrix(result);
@ -486,7 +489,20 @@ namespace ZL
skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4);
}
/*
for (int i = 0; i < currentBones.size(); i++)
{
currentBones[i].boneStartWorld = oneFrameBones[i].boneStartWorld;
currentBones[i].boneMatrixWorld = oneFrameBones[i].boneMatrixWorld;
Matrix4f currentBoneMatrixWorld4 = MakeMatrix4x4(currentBones[i].boneMatrixWorld, currentBones[i].boneStartWorld);
Matrix4f startBoneMatrixWorld4 = MakeMatrix4x4(animations[0].keyFrames[0].bones[i].boneMatrixWorld, animations[0].keyFrames[0].bones[i].boneStartWorld);
Matrix4f inverstedStartBoneMatrixWorld4 = InverseMatrix(startBoneMatrixWorld4);
skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4);
}
*/
for (int i = 0; i < mesh.PositionData.size(); i++)
{
Vector4f originalPos = {
@ -495,17 +511,30 @@ namespace ZL
startMesh.PositionData[i].v[2], 1.0};
Vector4f finalPos = Vector4f{0.f, 0.f, 0.f, 0.f};
bool vMoved = false;
//Vector3f finalPos = Vector3f{ 0.f, 0.f, 0.f };
for (int j = 0; j < 3; j++)
for (int j = 0; j < MAX_BONE_COUNT; j++)
{
if (verticesBoneWeight[i][j].weight != 0)
{
vMoved = true;
//finalPos = finalPos + MultVectorMatrix(originalPos, skinningMatrixForEachBone[verticesBoneWeight[i][j].boneIndex]) * verticesBoneWeight[i][j].weight;
finalPos = finalPos + MultMatrixVector(skinningMatrixForEachBone[verticesBoneWeight[i][j].boneIndex], originalPos) * verticesBoneWeight[i][j].weight;
}
}
if (abs(finalPos.v[0] - originalPos.v[0]) > 1 || abs(finalPos.v[1] - originalPos.v[1]) > 1 || abs(finalPos.v[2] - originalPos.v[2]) > 1)
{
std::cout << "Hello!" << std::endl;
}
if (!vMoved)
{
std::cout << "Hello!" << std::endl;
}
mesh.PositionData[i].v[0] = finalPos.v[0];
mesh.PositionData[i].v[1] = finalPos.v[1];
mesh.PositionData[i].v[2] = finalPos.v[2];

View File

@ -6,6 +6,7 @@
namespace ZL
{
constexpr int MAX_BONE_COUNT = 6;
struct Bone
{
Vector3f boneStartWorld;
@ -39,7 +40,9 @@ namespace ZL
{
VertexDataStruct mesh;
VertexDataStruct startMesh;
std::vector<std::array<BoneWeight, 3>> verticesBoneWeight;
std::vector<std::array<BoneWeight, MAX_BONE_COUNT>> verticesBoneWeight;
Matrix4f armatureMatrix;
std::vector<Bone> startBones;
std::vector<Bone> currentBones;

View File

@ -3,7 +3,7 @@
#include "BoneAnimatedModel.h"
#include "Utils.h"
#include "Inventory.h" // Add this include
#include <SDL2/SDL.h>
#include "OpenGlExtensions.h"
#include <iostream>
namespace ZL

2
Game.h
View File

@ -1,6 +1,6 @@
#pragma once
#include <SDL2/SDL.h>
#include "OpenGlExtensions.h"
#include "GameObjectManager.h"
#include "RenderSystem.h"
#include "Environment.h"

View File

@ -7,6 +7,7 @@
#include "ActiveObject.h"
#include "Room.h"
#include <SDL2/SDL.h>
#include "OpenGlExtensions.h"
namespace ZL {

View File

@ -1,5 +1,5 @@
#pragma once
#include "Vector3f.h"
#include "Math.h"
#include <vector>
#include <memory>

View File

@ -1,5 +1,5 @@
#pragma once
#include <SDL2/SDL.h>
#include "OpenGlExtensions.h"
namespace ZL {
class InputManager {

166
Math.cpp
View File

@ -247,68 +247,42 @@ namespace ZL {
Vector4f MatrixToQuat(const Matrix3f& m)
{
Vector4f r;
float f;
float trace = m.m[0] + m.m[4] + m.m[8];
if (m.m[0] >= m.m[4] && m.m[0] >= m.m[8])
if (trace > 0)
{
f = sqrtf(1.0 + m.m[0] - m.m[4] - m.m[8]);
if (f != 0)
{
r.v[3] = (m.m[5] - m.m[7]) / (f + f);
r.v[0] = f / 2;
r.v[1] = (m.m[3] + m.m[1]) / (f + f);
r.v[2] = (m.m[6] + m.m[2]) / (f + f);
}
else
{
r.v[3] = 1;
r.v[2] = 0;
r.v[1] = 0;
r.v[0] = 0;
}
float s = 0.5f / sqrtf(trace + 1.0f);
r.v[3] = 0.25f / s;
r.v[0] = (m.m[5] - m.m[7]) * s;
r.v[1] = (m.m[6] - m.m[2]) * s;
r.v[2] = (m.m[1] - m.m[3]) * s;
}
else if (m.m[0] > m.m[4] && m.m[0] > m.m[8])
{
float s = 2.0f * sqrtf(1.0f + m.m[0] - m.m[4] - m.m[8]);
r.v[3] = (m.m[5] - m.m[7]) / s;
r.v[0] = 0.25f * s;
r.v[1] = (m.m[1] + m.m[3]) / s;
r.v[2] = (m.m[6] + m.m[2]) / s;
}
else if (m.m[4] > m.m[8])
{
float s = 2.0f * sqrtf(1.0f + m.m[4] - m.m[0] - m.m[8]);
r.v[3] = (m.m[6] - m.m[2]) / s;
r.v[0] = (m.m[1] + m.m[3]) / s;
r.v[1] = 0.25f * s;
r.v[2] = (m.m[5] + m.m[7]) / s;
}
else
{
float s = 2.0f * sqrtf(1.0f + m.m[8] - m.m[0] - m.m[4]);
r.v[3] = (m.m[1] - m.m[3]) / s;
r.v[0] = (m.m[6] + m.m[2]) / s;
r.v[1] = (m.m[5] + m.m[7]) / s;
r.v[2] = 0.25f * s;
}
if (m.m[4] >= m.m[0] && m.m[4] >= m.m[8])
{
f = sqrtf(1 + m.m[4] - m.m[0] - m.m[8]);
if (f != 0)
{
r.v[3] = (m.m[6] - m.m[2]) / (f + f);
r.v[1] = f / 2;
r.v[0] = (m.m[1] + m.m[3]) / (f + f);
r.v[2] = (m.m[7] + m.m[5]) / (f + f);
}
else
{
r.v[3] = 1;
r.v[2] = 0;
r.v[1] = 0;
r.v[0] = 0;
}
}
if (m.m[8] >= m.m[4] && m.m[8] >= m.m[0])
{
f = sqrtf(1 + m.m[8] - m.m[2]);
if (f != 0)
{
r.v[3] = (m.m[1] - m.m[3]) / (f + f);
r.v[2] = f / 2;
r.v[1] = (m.m[5] + m.m[7]) / (f + f);
r.v[0] = (m.m[6] + m.m[2]) / (f + f);
}
else
{
r.v[3] = 1;
r.v[2] = 0;
r.v[1] = 0;
r.v[0] = 0;
}
}
return r;
return r.normalized();
}
Vector4f QuatFromRotateAroundX(float angle)
@ -681,65 +655,51 @@ namespace ZL {
return r;
}
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, double t)
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double cosTheta = q1.dot(q2);
const float epsilon = 1e-6f;
// <20><><EFBFBD><EFBFBD> cosTheta < 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Vector4f q2Adjusted = q2;
if (cosTheta < 0.0) {
//q2Adjusted = { -q2.w, -q2.x, -q2.y, -q2.z };
q2Adjusted.v[0] = -q2.v[0];
q2Adjusted.v[1] = -q2.v[1];
q2Adjusted.v[2] = -q2.v[2];
q2Adjusted.v[3] = -q2.v[3];
// Нормализация входных кватернионов
Vector4f q1_norm = q1.normalized();
Vector4f q2_norm = q2.normalized();
float cosTheta = q1_norm.dot(q2_norm);
// Если q1 и q2 близки к противоположным направлениям, корректируем q2
Vector4f q2_adjusted = q2_norm;
if (cosTheta < 0.0f) {
q2_adjusted.v[0] = -q2_adjusted.v[0];
q2_adjusted.v[1] = -q2_adjusted.v[1];
q2_adjusted.v[2] = -q2_adjusted.v[2];
q2_adjusted.v[3] = -q2_adjusted.v[3];
cosTheta = -cosTheta;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const double epsilon = 1e-6;
if (cosTheta > 1.0 - epsilon) {
// Если кватернионы близки, используем линейную интерполяцию
if (cosTheta > 1.0f - epsilon) {
Vector4f result;
result.v[0] = q1.v[0] + t * (q2Adjusted.v[0] - q1.v[0]);
result.v[1] = q1.v[1] + t * (q2Adjusted.v[1] - q1.v[1]);
result.v[2] = q1.v[2] + t * (q2Adjusted.v[2] - q1.v[2]);
result.v[3] = q1.v[3] + t * (q2Adjusted.v[3] - q1.v[3]);
/*Quaternion result = {
q1.w + t * (q2Adjusted.w - q1.w),
q1.x + t * (q2Adjusted.x - q1.x),
q1.y + t * (q2Adjusted.y - q1.y),
q1.z + t * (q2Adjusted.z - q1.z)
};*/
result.v[0] = q1_norm.v[0] + t * (q2_adjusted.v[0] - q1_norm.v[0]);
result.v[1] = q1_norm.v[1] + t * (q2_adjusted.v[1] - q1_norm.v[1]);
result.v[2] = q1_norm.v[2] + t * (q2_adjusted.v[2] - q1_norm.v[2]);
result.v[3] = q1_norm.v[3] + t * (q2_adjusted.v[3] - q1_norm.v[3]);
return result.normalized();
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> theta
double theta = std::acos(cosTheta);
double sinTheta = std::sin(theta);
// Иначе используем сферическую интерполяцию
float theta = std::acos(cosTheta);
float sinTheta = std::sin(theta);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double coeff1 = std::sin((1.0 - t) * theta) / sinTheta;
double coeff2 = std::sin(t * theta) / sinTheta;
float coeff1 = std::sin((1.0f - t) * theta) / sinTheta;
float coeff2 = std::sin(t * theta) / sinTheta;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*
Quaternion result = {
coeff1 * q1.w + coeff2 * q2Adjusted.w,
coeff1 * q1.x + coeff2 * q2Adjusted.x,
coeff1 * q1.y + coeff2 * q2Adjusted.y,
coeff1 * q1.z + coeff2 * q2Adjusted.z
};*/
Vector4f result;
result.v[0] = coeff1 * q1.v[0] + coeff2 * q2Adjusted.v[0];
result.v[1] = coeff1 * q1.v[1] + coeff2 * q2Adjusted.v[1];
result.v[2] = coeff1 * q1.v[2] + coeff2 * q2Adjusted.v[2];
result.v[3] = coeff1 * q1.v[3] + coeff2 * q2Adjusted.v[3];
result.v[0] = coeff1 * q1_norm.v[0] + coeff2 * q2_adjusted.v[0];
result.v[1] = coeff1 * q1_norm.v[1] + coeff2 * q2_adjusted.v[1];
result.v[2] = coeff1 * q1_norm.v[2] + coeff2 * q2_adjusted.v[2];
result.v[3] = coeff1 * q1_norm.v[3] + coeff2 * q2_adjusted.v[3];
return result.normalized();
}

2
Math.h
View File

@ -100,7 +100,7 @@ namespace ZL {
Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt);
Vector4f MultMatrixVector(Matrix4f mt, Vector4f v);
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, double t);
Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t);
Matrix3f InverseMatrix(const Matrix3f& m);
Matrix4f InverseMatrix(const Matrix4f& m);
Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2);

View File

@ -116,13 +116,13 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>C:\Work\SDL2-2.28.3\include;C:\Work\Projects\lpng1645\build\install\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>C:\Work\SDL2-2.28.3\include;C:\Work\Projects\lpng1645\build\install\include;C:\Work\OpenAL 1.1 SDK\include;C:\Work\Projects\libogg\include;C:\Work\Projects\vorbis\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>libpng16_staticd.lib;SDL2.lib;SDL2main.lib;opengl32.lib;glu32.lib;shell32.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Work\SDL2-2.28.3\lib\x64;C:\Work\Projects\lpng1645\build\install\lib</AdditionalLibraryDirectories>
<AdditionalDependencies>libogg_static.lib;audioplayer.lib;vorbisfile.lib;vorbis.lib;OpenAL32.lib;libpng16_staticd.lib;SDL2.lib;SDL2main.lib;opengl32.lib;glu32.lib;shell32.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\Work\Projects\ZeptoLabTest1\cmakeaudioplayer\build\Debug;C:\Work\SDL2-2.28.3\lib\x64;C:\Work\Projects\lpng1645\build\install\lib;C:\Work\Projects\vorbis\build\lib\Debug;C:\Work\OpenAL 1.1 SDK\libs\Win64;C:\Work\Projects\libogg\win32\VS2010\x64\Debug</AdditionalLibraryDirectories>
<EntryPointSymbol>
</EntryPointSymbol>
</Link>
@ -146,7 +146,12 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="BoneAnimatedModel.cpp" />
<ClCompile Include="Environment.cpp" />
<ClCompile Include="Game.cpp" />
<ClCompile Include="GameObjectManager.cpp" />
<ClCompile Include="GameWorld.cpp" />
<ClCompile Include="InputManager.cpp" />
<ClCompile Include="Inventory.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="Math.cpp" />
<ClCompile Include="md3test.cpp" />
@ -154,21 +159,29 @@
<ClCompile Include="OpenGlExtensions.cpp" />
<ClCompile Include="Physics.cpp" />
<ClCompile Include="Renderer.cpp" />
<ClCompile Include="RenderSystem.cpp" />
<ClCompile Include="ShaderManager.cpp" />
<ClCompile Include="TextModel.cpp" />
<ClCompile Include="TextureManager.cpp" />
<ClCompile Include="Utils.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="ActiveObject.h" />
<ClInclude Include="AnimatedModel.h" />
<ClInclude Include="BoneAnimatedModel.h" />
<ClInclude Include="Environment.h" />
<ClInclude Include="Game.h" />
<ClInclude Include="GameObjectManager.h" />
<ClInclude Include="GameWorld.h" />
<ClInclude Include="InputManager.h" />
<ClInclude Include="Inventory.h" />
<ClInclude Include="Math.h" />
<ClInclude Include="md3test.h" />
<ClInclude Include="ObjLoader.h" />
<ClInclude Include="OpenGlExtensions.h" />
<ClInclude Include="Physics.h" />
<ClInclude Include="Renderer.h" />
<ClInclude Include="RenderSystem.h" />
<ClInclude Include="ShaderManager.h" />
<ClInclude Include="TextModel.h" />
<ClInclude Include="TextureManager.h" />

View File

@ -54,6 +54,24 @@
<ClCompile Include="TextModel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Inventory.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GameWorld.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Environment.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GameObjectManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="InputManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RenderSystem.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="TextureManager.h">
@ -95,5 +113,26 @@
<ClInclude Include="TextModel.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Inventory.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ActiveObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Environment.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GameWorld.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="InputManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GameObjectManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RenderSystem.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

17393
via004.txt Normal file

File diff suppressed because it is too large Load Diff