This commit is contained in:
Vladislav Khorev 2025-03-02 21:29:33 +03:00
parent a3075433f0
commit 1bb131ecd2
6 changed files with 36493 additions and 27 deletions

View File

@ -183,6 +183,11 @@ namespace ZL
{ {
bones[i].children.push_back(getIndexByValue(boneChildren[boneName][j], boneNames)); bones[i].children.push_back(getIndexByValue(boneChildren[boneName][j], boneNames));
} }
/*if (boneName == "Bone.020")
{
std::cout << i << std::endl;
}*/
} }
startBones = bones; startBones = bones;
@ -299,8 +304,6 @@ namespace ZL
localVerticesBoneWeight[i][j].weight = localVerticesBoneWeight[i][j].weight / sumWeights; localVerticesBoneWeight[i][j].weight = localVerticesBoneWeight[i][j].weight / sumWeights;
} }
} }
std::getline(f, tempLine);//=== Animation Keyframes === std::getline(f, tempLine);//=== Animation Keyframes ===
@ -376,8 +379,9 @@ namespace ZL
} }
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0] = floatValues[0]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0] = floatValues[0];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0 + 1 * 3] = floatValues[1]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0 + 1 * 4] = floatValues[1];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0 + 2 * 3] = floatValues[2]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0 + 2 * 4] = floatValues[2];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[0 + 3 * 4] = floatValues[3];
std::getline(f, tempLine); std::getline(f, tempLine);
@ -390,8 +394,9 @@ namespace ZL
} }
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1] = floatValues[0]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1] = floatValues[0];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1 + 1 * 3] = floatValues[1]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1 + 1 * 4] = floatValues[1];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1 + 2 * 3] = floatValues[2]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1 + 2 * 4] = floatValues[2];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[1 + 3 * 4] = floatValues[3];
std::getline(f, tempLine); std::getline(f, tempLine);
b = tempLine.cbegin(); b = tempLine.cbegin();
@ -403,11 +408,26 @@ namespace ZL
} }
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2] = floatValues[0]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2] = floatValues[0];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2 + 1 * 3] = floatValues[1]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2 + 1 * 4] = floatValues[1];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2 + 2 * 3] = floatValues[2]; animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2 + 2 * 4] = floatValues[2];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[2 + 3 * 4] = floatValues[3];
std::getline(f, tempLine);// ignore last matrix line std::getline(f, tempLine);
b = tempLine.cbegin();
e = tempLine.cend();
floatValues.clear();
while (std::regex_search(b, e, match, pattern_float)) {
floatValues.push_back(std::stof(match.str()));
b = match.suffix().first;
}
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[3] = floatValues[0];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[3 + 1 * 4] = floatValues[1];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[3 + 2 * 4] = floatValues[2];
animations[0].keyFrames[i].bones[boneNumber].boneMatrixWorld.m[3 + 3 * 4] = floatValues[3];
//std::getline(f, tempLine);// ignore last matrix line
//=============== Matrix end ================== //=============== Matrix end ==================
@ -471,19 +491,48 @@ namespace ZL
currentBones[i].boneStartWorld.v[1] = oneFrameBones[i].boneStartWorld.v[1] + t * (nextFrameBones[i].boneStartWorld.v[1] - oneFrameBones[i].boneStartWorld.v[1]); currentBones[i].boneStartWorld.v[1] = oneFrameBones[i].boneStartWorld.v[1] + t * (nextFrameBones[i].boneStartWorld.v[1] - oneFrameBones[i].boneStartWorld.v[1]);
currentBones[i].boneStartWorld.v[2] = oneFrameBones[i].boneStartWorld.v[2] + t * (nextFrameBones[i].boneStartWorld.v[2] - oneFrameBones[i].boneStartWorld.v[2]); currentBones[i].boneStartWorld.v[2] = oneFrameBones[i].boneStartWorld.v[2] + t * (nextFrameBones[i].boneStartWorld.v[2] - oneFrameBones[i].boneStartWorld.v[2]);
Vector4f q1 = MatrixToQuat(oneFrameBones[i].boneMatrixWorld); Matrix3f oneFrameBonesMatrix;
Vector4f q2 = MatrixToQuat(nextFrameBones[i].boneMatrixWorld);
oneFrameBonesMatrix.m[0] = oneFrameBones[i].boneMatrixWorld.m[0];
oneFrameBonesMatrix.m[1] = oneFrameBones[i].boneMatrixWorld.m[1];
oneFrameBonesMatrix.m[2] = oneFrameBones[i].boneMatrixWorld.m[2];
oneFrameBonesMatrix.m[3] = oneFrameBones[i].boneMatrixWorld.m[0 + 1*4];
oneFrameBonesMatrix.m[4] = oneFrameBones[i].boneMatrixWorld.m[1 + 1*4];
oneFrameBonesMatrix.m[5] = oneFrameBones[i].boneMatrixWorld.m[2 + 1*4];
oneFrameBonesMatrix.m[6] = oneFrameBones[i].boneMatrixWorld.m[0 + 2*4];
oneFrameBonesMatrix.m[7] = oneFrameBones[i].boneMatrixWorld.m[1 + 2*4];
oneFrameBonesMatrix.m[8] = oneFrameBones[i].boneMatrixWorld.m[2 + 2*4];
Matrix3f nextFrameBonesMatrix;
nextFrameBonesMatrix.m[0] = nextFrameBones[i].boneMatrixWorld.m[0];
nextFrameBonesMatrix.m[1] = nextFrameBones[i].boneMatrixWorld.m[1];
nextFrameBonesMatrix.m[2] = nextFrameBones[i].boneMatrixWorld.m[2];
nextFrameBonesMatrix.m[3] = nextFrameBones[i].boneMatrixWorld.m[0 + 1 * 4];
nextFrameBonesMatrix.m[4] = nextFrameBones[i].boneMatrixWorld.m[1 + 1 * 4];
nextFrameBonesMatrix.m[5] = nextFrameBones[i].boneMatrixWorld.m[2 + 1 * 4];
nextFrameBonesMatrix.m[6] = nextFrameBones[i].boneMatrixWorld.m[0 + 2 * 4];
nextFrameBonesMatrix.m[7] = nextFrameBones[i].boneMatrixWorld.m[1 + 2 * 4];
nextFrameBonesMatrix.m[8] = nextFrameBones[i].boneMatrixWorld.m[2 + 2 * 4];
Vector4f q1 = MatrixToQuat(oneFrameBonesMatrix);
Vector4f q2 = MatrixToQuat(nextFrameBonesMatrix);
Vector4f q1_norm = q1.normalized(); Vector4f q1_norm = q1.normalized();
Vector4f q2_norm = q2.normalized(); Vector4f q2_norm = q2.normalized();
Vector4f result = slerp(q1_norm, q2_norm, t); Vector4f result = slerp(q1_norm, q2_norm, t);
currentBones[i].boneMatrixWorld = QuatToMatrix(result); Matrix3f boneMatrixWorld3 = QuatToMatrix(result);
//skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBones[i].boneMatrixWorld, InverseMatrix(animations[0].keyFrames[0].bones[i].boneMatrixWorld)); currentBones[i].boneMatrixWorld = MakeMatrix4x4(boneMatrixWorld3, currentBones[i].boneStartWorld);
Matrix4f currentBoneMatrixWorld4 = MakeMatrix4x4(currentBones[i].boneMatrixWorld, currentBones[i].boneStartWorld); Matrix4f currentBoneMatrixWorld4 = currentBones[i].boneMatrixWorld;
Matrix4f startBoneMatrixWorld4 = MakeMatrix4x4(animations[0].keyFrames[0].bones[i].boneMatrixWorld, animations[0].keyFrames[0].bones[i].boneStartWorld); Matrix4f startBoneMatrixWorld4 = animations[0].keyFrames[0].bones[i].boneMatrixWorld;
Matrix4f inverstedStartBoneMatrixWorld4 = InverseMatrix(startBoneMatrixWorld4); Matrix4f inverstedStartBoneMatrixWorld4 = InverseMatrix(startBoneMatrixWorld4);
skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4); skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4);
@ -496,13 +545,19 @@ namespace ZL
{ {
currentBones[i].boneStartWorld = oneFrameBones[i].boneStartWorld; currentBones[i].boneStartWorld = oneFrameBones[i].boneStartWorld;
currentBones[i].boneMatrixWorld = oneFrameBones[i].boneMatrixWorld; currentBones[i].boneMatrixWorld = oneFrameBones[i].boneMatrixWorld;
Matrix4f currentBoneMatrixWorld4 = MakeMatrix4x4(currentBones[i].boneMatrixWorld, currentBones[i].boneStartWorld); //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 startBoneMatrixWorld4 = MakeMatrix4x4(animations[0].keyFrames[0].bones[i].boneMatrixWorld, animations[0].keyFrames[0].bones[i].boneStartWorld);
Matrix4f currentBoneMatrixWorld4 = currentBones[i].boneMatrixWorld;
Matrix4f startBoneMatrixWorld4 = animations[0].keyFrames[0].bones[i].boneMatrixWorld;
Matrix4f inverstedStartBoneMatrixWorld4 = InverseMatrix(startBoneMatrixWorld4); Matrix4f inverstedStartBoneMatrixWorld4 = InverseMatrix(startBoneMatrixWorld4);
skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4); skinningMatrixForEachBone[i] = MultMatrixMatrix(currentBoneMatrixWorld4, inverstedStartBoneMatrixWorld4);
} if (i == 10)
*/ {
std::cout << i << std::endl;
}
}*/
for (int i = 0; i < mesh.PositionData.size(); i++) for (int i = 0; i < mesh.PositionData.size(); i++)
{ {
Vector4f originalPos = { Vector4f originalPos = {

View File

@ -11,7 +11,7 @@ namespace ZL
{ {
Vector3f boneStartWorld; Vector3f boneStartWorld;
float boneLength; float boneLength;
Matrix3f boneMatrixWorld; Matrix4f boneMatrixWorld;
// boneVector = boneLength * (0, 1, 0) в осях блендера // boneVector = boneLength * (0, 1, 0) в осях блендера
// Then multiply by boneMatrixWorld и вы получите конечную точку // Then multiply by boneMatrixWorld и вы получите конечную точку

View File

@ -53,8 +53,10 @@ void GameObjectManager::initialize() {
preloadedRoomMeshArr[0].Move(Vector3f{ 0, 93, 0 }); preloadedRoomMeshArr[0].Move(Vector3f{ 0, 93, 0 });
violaIdleModel.LoadFromFile("./idleviola001.txt"); //violaIdleModel.LoadFromFile("./idleviola001.txt");
violaWalkModel.LoadFromFile("./walkviolla001.txt"); violaIdleModel.LoadFromFile("./idleviola008.txt");
violaWalkModel.LoadFromFile("./walkviola008.txt");
sideThreadLoadingCompleted = true; sideThreadLoadingCompleted = true;
}); });
@ -250,7 +252,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_LEFT: case SDLK_LEFT:
case SDLK_a: case SDLK_a:
Environment::leftPressed = true; Environment::leftPressed = true;
audioPlayerAsync.playSoundAsync("Звук-Идут-по-земле.ogg"); // Заменено audioPlayerAsync.playSoundAsync("walk.ogg"); // Заменено
if (Environment::violaCurrentAnimation == 0) { if (Environment::violaCurrentAnimation == 0) {
Environment::violaCurrentAnimation = 1; Environment::violaCurrentAnimation = 1;
Environment::violaLastWalkFrame = -1; Environment::violaLastWalkFrame = -1;
@ -259,7 +261,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_RIGHT: case SDLK_RIGHT:
case SDLK_d: case SDLK_d:
Environment::rightPressed = true; Environment::rightPressed = true;
audioPlayerAsync.playSoundAsync("Звук-Идут-по-земле.ogg"); // Заменено audioPlayerAsync.playSoundAsync("walk.ogg"); // Заменено
if (Environment::violaCurrentAnimation == 0) { if (Environment::violaCurrentAnimation == 0) {
Environment::violaCurrentAnimation = 1; Environment::violaCurrentAnimation = 1;
Environment::violaLastWalkFrame = -1; Environment::violaLastWalkFrame = -1;
@ -268,7 +270,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_UP: case SDLK_UP:
case SDLK_w: case SDLK_w:
Environment::upPressed = true; Environment::upPressed = true;
audioPlayerAsync.playSoundAsync("Звук-Идут-по-земле.ogg"); // Заменено audioPlayerAsync.playSoundAsync("walk.ogg"); // Заменено
if (Environment::violaCurrentAnimation == 0) { if (Environment::violaCurrentAnimation == 0) {
Environment::violaCurrentAnimation = 1; Environment::violaCurrentAnimation = 1;
Environment::violaLastWalkFrame = -1; Environment::violaLastWalkFrame = -1;
@ -277,7 +279,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_DOWN: case SDLK_DOWN:
case SDLK_s: case SDLK_s:
Environment::downPressed = true; Environment::downPressed = true;
audioPlayerAsync.playSoundAsync("Звук-Идут-по-земле.ogg"); // Заменено audioPlayerAsync.playSoundAsync("walk.ogg"); // Заменено
if (Environment::violaCurrentAnimation == 0) { if (Environment::violaCurrentAnimation == 0) {
Environment::violaCurrentAnimation = 1; Environment::violaCurrentAnimation = 1;
Environment::violaLastWalkFrame = -1; Environment::violaLastWalkFrame = -1;
@ -451,6 +453,7 @@ void GameObjectManager::updateScene(size_t ms) {
if (Environment::violaCurrentAnimation == 0) { if (Environment::violaCurrentAnimation == 0) {
Environment::violaCurrentIdleFrame += ms / 24.f; Environment::violaCurrentIdleFrame += ms / 24.f;
//Environment::violaCurrentIdleFrame = 0;
while (Environment::violaCurrentIdleFrame >= 40) { while (Environment::violaCurrentIdleFrame >= 40) {
Environment::violaCurrentIdleFrame -= 40; Environment::violaCurrentIdleFrame -= 40;

View File

@ -61,7 +61,6 @@ void RenderSystem::drawViola(GameObjectManager& gameObjects)
renderer.TranslateMatrix({ 0,0, -100 * Environment::zoom }); renderer.TranslateMatrix({ 0,0, -100 * Environment::zoom });
renderer.RotateMatrix(QuatFromRotateAroundX(Environment::cameraAlpha)); renderer.RotateMatrix(QuatFromRotateAroundX(Environment::cameraAlpha));
//renderer.RotateMatrix(QuatFromRotateAroundY(Environment::cameraPhi));
//Go a little bit up to make camera at the position of Viola //Go a little bit up to make camera at the position of Viola
renderer.TranslateMatrix({ 0, Environment::cameraDefaultVerticalShift, 0 }); renderer.TranslateMatrix({ 0, Environment::cameraDefaultVerticalShift, 0 });
@ -70,6 +69,7 @@ void RenderSystem::drawViola(GameObjectManager& gameObjects)
//Viola stuff //Viola stuff
renderer.ScaleMatrix(10); renderer.ScaleMatrix(10);
renderer.RotateMatrix(QuatFromRotateAroundX(-M_PI / 2.0)); renderer.RotateMatrix(QuatFromRotateAroundX(-M_PI / 2.0));
renderer.RotateMatrix(QuatFromRotateAroundZ(M_PI));
@ -123,6 +123,7 @@ void RenderSystem::drawWorld(GameObjectManager& gameObjects) {
drawViola(gameObjects); drawViola(gameObjects);
renderer.shaderManager.PushShader(hideCamShaderName); renderer.shaderManager.PushShader(hideCamShaderName);
renderer.RenderUniform1i(textureUniformName, 0); renderer.RenderUniform1i(textureUniformName, 0);

17612
idleviola008.txt Normal file

File diff suppressed because it is too large Load Diff

18795
walkviola008.txt Normal file

File diff suppressed because it is too large Load Diff