mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-07-04 02:01:51 +00:00
chore: replace custom vector, quaternion, matrix implementation with eigen library
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
#include "AssetDumperXModel.h"
|
||||
|
||||
#include "Game/IW3/CommonIW3.h"
|
||||
#include "Math/Quaternion.h"
|
||||
#include "ObjWriting.h"
|
||||
#include "Utils/DistinctMapper.h"
|
||||
#include "Utils/HalfFloat.h"
|
||||
@ -125,25 +124,31 @@ namespace
|
||||
bone.globalOffset[0] = model->baseMat[boneNum].trans[0];
|
||||
bone.globalOffset[1] = model->baseMat[boneNum].trans[1];
|
||||
bone.globalOffset[2] = model->baseMat[boneNum].trans[2];
|
||||
bone.globalRotation = Quaternion32(
|
||||
model->baseMat[boneNum].quat[0], model->baseMat[boneNum].quat[1], model->baseMat[boneNum].quat[2], model->baseMat[boneNum].quat[3]);
|
||||
bone.globalRotation = {
|
||||
model->baseMat[boneNum].quat[0],
|
||||
model->baseMat[boneNum].quat[1],
|
||||
model->baseMat[boneNum].quat[2],
|
||||
model->baseMat[boneNum].quat[3],
|
||||
};
|
||||
|
||||
if (boneNum < model->numRootBones)
|
||||
{
|
||||
bone.localOffset[0] = 0;
|
||||
bone.localOffset[1] = 0;
|
||||
bone.localOffset[2] = 0;
|
||||
bone.localRotation = Quaternion32(0, 0, 0, 1);
|
||||
bone.localRotation = {0, 0, 0, 1};
|
||||
}
|
||||
else
|
||||
{
|
||||
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
|
||||
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
|
||||
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
|
||||
bone.localRotation = Quaternion32(QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]));
|
||||
bone.localRotation = {
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
|
||||
};
|
||||
}
|
||||
|
||||
out.m_bones.emplace_back(std::move(bone));
|
||||
|
@ -3,9 +3,9 @@
|
||||
#include "Game/IW4/MaterialConstantsIW4.h"
|
||||
#include "Game/IW4/ObjConstantsIW4.h"
|
||||
#include "Game/IW4/TechsetConstantsIW4.h"
|
||||
#include "Math/Vector.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
|
||||
#include <Eigen>
|
||||
#include <iomanip>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <sstream>
|
||||
@ -450,7 +450,7 @@ namespace IW4
|
||||
class ConstantsInfo
|
||||
{
|
||||
public:
|
||||
Vector4f m_color_tint = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Eigen::Vector4f m_color_tint = Eigen::Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
float m_env_map_min = 0.2f;
|
||||
float m_env_map_max = 1.0f;
|
||||
float m_env_map_exponent = 2.5f;
|
||||
@ -460,13 +460,13 @@ namespace IW4
|
||||
float m_falloff_end_angle = 65.0f;
|
||||
float m_dist_falloff_begin_distance = 200.0f;
|
||||
float m_dist_falloff_end_distance = 10.0f;
|
||||
Vector4f m_falloff_begin_color = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Vector4f m_falloff_end_color = Vector4f(0.5f, 0.5f, 0.5f, 0.5f);
|
||||
Vector2f m_detail_scale = Vector2f(8.0f, 8.0f);
|
||||
Vector2f m_distortion_scale = Vector2f(0.5f, 0.5f);
|
||||
Vector4f m_color_obj_min = Vector4f(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
Vector4f m_color_obj_max = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Vector4f m_water_color = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Eigen::Vector4f m_falloff_begin_color = Eigen::Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Eigen::Vector4f m_falloff_end_color = Eigen::Vector4f(0.5f, 0.5f, 0.5f, 0.5f);
|
||||
Eigen::Vector2f m_detail_scale = Eigen::Vector2f(8.0f, 8.0f);
|
||||
Eigen::Vector2f m_distortion_scale = Eigen::Vector2f(0.5f, 0.5f);
|
||||
Eigen::Vector4f m_color_obj_min = Eigen::Vector4f(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
Eigen::Vector4f m_color_obj_max = Eigen::Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Eigen::Vector4f m_water_color = Eigen::Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
// Speed in which the wave animation is played
|
||||
float m_flag_speed = 1.0f;
|
||||
@ -497,7 +497,7 @@ namespace IW4
|
||||
m_entry.m_properties.emplace(std::make_pair(key, std::move(value)));
|
||||
}
|
||||
|
||||
void SetValue(const std::string& key, const Vector4f& v)
|
||||
void SetValue(const std::string& key, const Eigen::Vector4f& v)
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << v.x() << " " << v.y() << " " << v.z() << " " << v.w();
|
||||
@ -1183,7 +1183,7 @@ namespace IW4
|
||||
|
||||
if (constant.nameHash == Common::R_HashString("colorTint"))
|
||||
{
|
||||
m_constants_info.m_color_tint = Vector4f(constant.literal);
|
||||
m_constants_info.m_color_tint = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("envMapParms"))
|
||||
{
|
||||
@ -1198,11 +1198,11 @@ namespace IW4
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("falloffBeginColor"))
|
||||
{
|
||||
m_constants_info.m_falloff_begin_color = Vector4f(constant.literal);
|
||||
m_constants_info.m_falloff_begin_color = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("falloffEndColor"))
|
||||
{
|
||||
m_constants_info.m_falloff_end_color = Vector4f(constant.literal);
|
||||
m_constants_info.m_falloff_end_color = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("eyeOffsetParms"))
|
||||
{
|
||||
@ -1227,14 +1227,15 @@ namespace IW4
|
||||
{
|
||||
const auto detailScaleFactorX = static_cast<float>(colorMapTexture->width) / static_cast<float>(detailMapTexture->width);
|
||||
const auto detailScaleFactorY = static_cast<float>(colorMapTexture->height) / static_cast<float>(detailMapTexture->height);
|
||||
m_constants_info.m_detail_scale = Vector2f(constant.literal[0] / detailScaleFactorX, constant.literal[1] / detailScaleFactorY);
|
||||
m_constants_info.m_detail_scale =
|
||||
Eigen::Vector2f(constant.literal[0] / detailScaleFactorX, constant.literal[1] / detailScaleFactorY);
|
||||
}
|
||||
else
|
||||
m_constants_info.m_detail_scale = Vector2f(constant.literal[0], constant.literal[1]);
|
||||
m_constants_info.m_detail_scale = Eigen::Vector2f(constant.literal[0], constant.literal[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_constants_info.m_detail_scale = Vector2f(constant.literal[0], constant.literal[1]);
|
||||
m_constants_info.m_detail_scale = Eigen::Vector2f(constant.literal[0], constant.literal[1]);
|
||||
}
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("flagParms"))
|
||||
@ -1252,7 +1253,7 @@ namespace IW4
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("distortionScale"))
|
||||
{
|
||||
m_constants_info.m_distortion_scale = Vector2f(constant.literal[0], constant.literal[1]);
|
||||
m_constants_info.m_distortion_scale = Eigen::Vector2f(constant.literal[0], constant.literal[1]);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("uvAnimParms"))
|
||||
{
|
||||
@ -1262,15 +1263,15 @@ namespace IW4
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("colorObjMin"))
|
||||
{
|
||||
m_constants_info.m_color_obj_min = Vector4f(constant.literal);
|
||||
m_constants_info.m_color_obj_min = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("colorObjMax"))
|
||||
{
|
||||
m_constants_info.m_color_obj_max = Vector4f(constant.literal);
|
||||
m_constants_info.m_color_obj_max = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else if (constant.nameHash == Common::R_HashString("waterColor"))
|
||||
{
|
||||
m_constants_info.m_water_color = Vector4f(constant.literal);
|
||||
m_constants_info.m_water_color = Eigen::Vector4f(constant.literal);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "AssetDumperXModel.h"
|
||||
|
||||
#include "Game/IW4/CommonIW4.h"
|
||||
#include "Math/Quaternion.h"
|
||||
#include "ObjWriting.h"
|
||||
#include "Utils/DistinctMapper.h"
|
||||
#include "Utils/HalfFloat.h"
|
||||
@ -120,25 +119,31 @@ namespace
|
||||
bone.globalOffset[0] = model->baseMat[boneNum].trans[0];
|
||||
bone.globalOffset[1] = model->baseMat[boneNum].trans[1];
|
||||
bone.globalOffset[2] = model->baseMat[boneNum].trans[2];
|
||||
bone.globalRotation = Quaternion32(
|
||||
model->baseMat[boneNum].quat[0], model->baseMat[boneNum].quat[1], model->baseMat[boneNum].quat[2], model->baseMat[boneNum].quat[3]);
|
||||
bone.globalRotation = {
|
||||
model->baseMat[boneNum].quat[0],
|
||||
model->baseMat[boneNum].quat[1],
|
||||
model->baseMat[boneNum].quat[2],
|
||||
model->baseMat[boneNum].quat[3],
|
||||
};
|
||||
|
||||
if (boneNum < model->numRootBones)
|
||||
{
|
||||
bone.localOffset[0] = 0;
|
||||
bone.localOffset[1] = 0;
|
||||
bone.localOffset[2] = 0;
|
||||
bone.localRotation = Quaternion32(0, 0, 0, 1);
|
||||
bone.localRotation = {0, 0, 0, 1};
|
||||
}
|
||||
else
|
||||
{
|
||||
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
|
||||
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
|
||||
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
|
||||
bone.localRotation = Quaternion32(QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]));
|
||||
bone.localRotation = {
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
|
||||
};
|
||||
}
|
||||
|
||||
out.m_bones.emplace_back(std::move(bone));
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "AssetDumperXModel.h"
|
||||
|
||||
#include "Game/IW5/CommonIW5.h"
|
||||
#include "Math/Quaternion.h"
|
||||
#include "ObjWriting.h"
|
||||
#include "Utils/DistinctMapper.h"
|
||||
#include "Utils/HalfFloat.h"
|
||||
@ -120,25 +119,31 @@ namespace
|
||||
bone.globalOffset[0] = model->baseMat[boneNum].trans[0];
|
||||
bone.globalOffset[1] = model->baseMat[boneNum].trans[1];
|
||||
bone.globalOffset[2] = model->baseMat[boneNum].trans[2];
|
||||
bone.globalRotation = Quaternion32(
|
||||
model->baseMat[boneNum].quat[0], model->baseMat[boneNum].quat[1], model->baseMat[boneNum].quat[2], model->baseMat[boneNum].quat[3]);
|
||||
bone.globalRotation = {
|
||||
model->baseMat[boneNum].quat[0],
|
||||
model->baseMat[boneNum].quat[1],
|
||||
model->baseMat[boneNum].quat[2],
|
||||
model->baseMat[boneNum].quat[3],
|
||||
};
|
||||
|
||||
if (boneNum < model->numRootBones)
|
||||
{
|
||||
bone.localOffset[0] = 0;
|
||||
bone.localOffset[1] = 0;
|
||||
bone.localOffset[2] = 0;
|
||||
bone.localRotation = Quaternion32(0, 0, 0, 1);
|
||||
bone.localRotation = {0, 0, 0, 1};
|
||||
}
|
||||
else
|
||||
{
|
||||
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
|
||||
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
|
||||
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
|
||||
bone.localRotation = Quaternion32(QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]));
|
||||
bone.localRotation = {
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
|
||||
};
|
||||
}
|
||||
|
||||
out.m_bones.emplace_back(std::move(bone));
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "AssetDumperXModel.h"
|
||||
|
||||
#include "Game/T5/CommonT5.h"
|
||||
#include "Math/Quaternion.h"
|
||||
#include "ObjWriting.h"
|
||||
#include "Utils/DistinctMapper.h"
|
||||
#include "Utils/HalfFloat.h"
|
||||
@ -125,25 +124,31 @@ namespace
|
||||
bone.globalOffset[0] = model->baseMat[boneNum].trans[0];
|
||||
bone.globalOffset[1] = model->baseMat[boneNum].trans[1];
|
||||
bone.globalOffset[2] = model->baseMat[boneNum].trans[2];
|
||||
bone.globalRotation = Quaternion32(
|
||||
model->baseMat[boneNum].quat[0], model->baseMat[boneNum].quat[1], model->baseMat[boneNum].quat[2], model->baseMat[boneNum].quat[3]);
|
||||
bone.globalRotation = {
|
||||
model->baseMat[boneNum].quat[0],
|
||||
model->baseMat[boneNum].quat[1],
|
||||
model->baseMat[boneNum].quat[2],
|
||||
model->baseMat[boneNum].quat[3],
|
||||
};
|
||||
|
||||
if (boneNum < model->numRootBones)
|
||||
{
|
||||
bone.localOffset[0] = 0;
|
||||
bone.localOffset[1] = 0;
|
||||
bone.localOffset[2] = 0;
|
||||
bone.localRotation = Quaternion32(0, 0, 0, 1);
|
||||
bone.localRotation = {0, 0, 0, 1};
|
||||
}
|
||||
else
|
||||
{
|
||||
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
|
||||
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
|
||||
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
|
||||
bone.localRotation = Quaternion32(QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]));
|
||||
bone.localRotation = {
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
|
||||
};
|
||||
}
|
||||
|
||||
out.m_bones.emplace_back(std::move(bone));
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "AssetDumperXModel.h"
|
||||
|
||||
#include "Game/T6/CommonT6.h"
|
||||
#include "Math/Quaternion.h"
|
||||
#include "ObjWriting.h"
|
||||
#include "Utils/DistinctMapper.h"
|
||||
#include "Utils/QuatInt16.h"
|
||||
@ -136,25 +135,31 @@ namespace
|
||||
bone.globalOffset[0] = model->baseMat[boneNum].trans.x;
|
||||
bone.globalOffset[1] = model->baseMat[boneNum].trans.y;
|
||||
bone.globalOffset[2] = model->baseMat[boneNum].trans.z;
|
||||
bone.globalRotation =
|
||||
Quaternion32(model->baseMat[boneNum].quat.x, model->baseMat[boneNum].quat.y, model->baseMat[boneNum].quat.z, model->baseMat[boneNum].quat.w);
|
||||
bone.globalRotation = {
|
||||
model->baseMat[boneNum].quat.x,
|
||||
model->baseMat[boneNum].quat.y,
|
||||
model->baseMat[boneNum].quat.z,
|
||||
model->baseMat[boneNum].quat.w,
|
||||
};
|
||||
|
||||
if (boneNum < model->numRootBones)
|
||||
{
|
||||
bone.localOffset[0] = 0;
|
||||
bone.localOffset[1] = 0;
|
||||
bone.localOffset[2] = 0;
|
||||
bone.localRotation = Quaternion32(0, 0, 0, 1);
|
||||
bone.localRotation = {0, 0, 0, 1};
|
||||
}
|
||||
else
|
||||
{
|
||||
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
|
||||
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
|
||||
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
|
||||
bone.localRotation = Quaternion32(QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]));
|
||||
bone.localRotation = {
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
|
||||
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
|
||||
};
|
||||
}
|
||||
|
||||
out.m_bones.emplace_back(std::move(bone));
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "XModelExportWriter.h"
|
||||
|
||||
#include "Math/Quaternion.h"
|
||||
|
||||
#include <Eigen>
|
||||
#include <chrono>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
@ -61,10 +60,10 @@ protected:
|
||||
m_stream << std::format("OFFSET {:.6f}, {:.6f}, {:.6f}\n", bone.globalOffset[0], bone.globalOffset[1], bone.globalOffset[2]);
|
||||
m_stream << std::format("SCALE {:.6f}, {:.6f}, {:.6f}\n", bone.scale[0], bone.scale[1], bone.scale[2]);
|
||||
|
||||
const Matrix32 mat = bone.globalRotation.ToMatrix();
|
||||
m_stream << std::format("X {:.6f}, {:.6f}, {:.6f}\n", mat.m_data[0][0], mat.m_data[1][0], mat.m_data[2][0]);
|
||||
m_stream << std::format("Y {:.6f}, {:.6f}, {:.6f}\n", mat.m_data[0][1], mat.m_data[1][1], mat.m_data[2][1]);
|
||||
m_stream << std::format("Z {:.6f}, {:.6f}, {:.6f}\n", mat.m_data[0][2], mat.m_data[1][2], mat.m_data[2][2]);
|
||||
const auto mat = Eigen::Quaternionf(bone.globalRotation.w, bone.globalRotation.x, bone.globalRotation.y, bone.globalRotation.z).matrix();
|
||||
m_stream << std::format("X {:.6f}, {:.6f}, {:.6f}\n", mat(0, 0), mat(1, 0), mat(2, 0));
|
||||
m_stream << std::format("Y {:.6f}, {:.6f}, {:.6f}\n", mat(0, 1), mat(1, 1), mat(2, 1));
|
||||
m_stream << std::format("Z {:.6f}, {:.6f}, {:.6f}\n", mat(0, 2), mat(1, 2), mat(2, 2));
|
||||
m_stream << '\n';
|
||||
boneNum++;
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "GltfWriter.h"
|
||||
|
||||
#include "GitVersion.h"
|
||||
#include "Math/Vector.h"
|
||||
#include "XModel/Gltf/GltfConstants.h"
|
||||
#include "XModel/Gltf/JsonGltf.h"
|
||||
|
||||
@ -224,13 +223,12 @@ namespace
|
||||
const auto& bone = xmodel.m_bones[boneIndex];
|
||||
|
||||
Eigen::Vector3f translation(bone.globalOffset[0], bone.globalOffset[2], -bone.globalOffset[1]);
|
||||
Eigen::Quaternionf rotation(bone.globalRotation.m_w, bone.globalRotation.m_x, bone.globalRotation.m_z, -bone.globalRotation.m_y);
|
||||
Eigen::Quaternionf rotation(bone.globalRotation.w, bone.globalRotation.x, bone.globalRotation.z, -bone.globalRotation.y);
|
||||
if (bone.parentIndex >= 0)
|
||||
{
|
||||
const auto& parentBone = xmodel.m_bones[bone.parentIndex];
|
||||
const auto inverseParentRotation =
|
||||
Eigen::Quaternionf(
|
||||
parentBone.globalRotation.m_w, parentBone.globalRotation.m_x, parentBone.globalRotation.m_z, -parentBone.globalRotation.m_y)
|
||||
Eigen::Quaternionf(parentBone.globalRotation.w, parentBone.globalRotation.x, parentBone.globalRotation.z, -parentBone.globalRotation.y)
|
||||
.normalized()
|
||||
.inverse()
|
||||
.normalized();
|
||||
@ -521,8 +519,7 @@ namespace
|
||||
for (const auto& bone : xmodel.m_bones)
|
||||
{
|
||||
const auto translation = Eigen::Translation3f(bone.globalOffset[0], bone.globalOffset[2], -bone.globalOffset[1]);
|
||||
const auto rotation =
|
||||
Eigen::Quaternionf(bone.globalRotation.m_w, bone.globalRotation.m_x, bone.globalRotation.m_z, -bone.globalRotation.m_y);
|
||||
const auto rotation = Eigen::Quaternionf(bone.globalRotation.w, bone.globalRotation.x, bone.globalRotation.z, -bone.globalRotation.y);
|
||||
|
||||
const auto inverseBindMatrix = (translation * rotation).matrix().inverse();
|
||||
|
||||
|
Reference in New Issue
Block a user