1
Pytania i problemy / Jak ZenGin trzyma rotację obiektów?
« dnia: 2017-09-11, 00:04 »Cytuj
Nie znam się w ogóle na macierzach i rotacji, ale to może chyba pomóc.Wow, to nie tyle pomogło, co rozwiązało całą sprawę. Dzięki.
Jakby ktoś kiedyś miał podobny problem oto szczegóły:
Rotacja zdaje się być zapisywana jako matrix 3x3 (zMAT3); oto kawałek kodu ZenLib'a, link do githuba podesłał inż. Avallach (https://github.com/degenerated1123/ZenLib/blob/master/zenload/zCVob.h)
Spoiler
struct packedVobData
{
ZMath::float3 bbox3DWS[2];
ZMath::float3 positionWS;
zMAT3 trafoRotWS;
struct packedBitField
{
uint8_t showVisual : 1;
uint8_t visualCamAlign : 2;
uint8_t cdStatic : 1;
uint8_t cdDyn : 1;
uint8_t staticVob : 1;
uint8_t dynShadow : 2;
uint8_t hasPresetName : 1;
uint8_t hasVobName : 1;
uint8_t hasVisualName : 1;
uint8_t hasRelevantVisualObject : 1;
uint8_t hasAIObject : 1;
uint8_t hasEventManObject : 1;
uint8_t physicsEnabled : 1;
uint8_t visualAniMode : 2;
uint8_t zbias : 5;
uint8_t bAmbient : 1;
} bitfield;
float visualAniStrength;
float vobFarClipZ;
};
{
ZMath::float3 bbox3DWS[2];
ZMath::float3 positionWS;
zMAT3 trafoRotWS;
struct packedBitField
{
uint8_t showVisual : 1;
uint8_t visualCamAlign : 2;
uint8_t cdStatic : 1;
uint8_t cdDyn : 1;
uint8_t staticVob : 1;
uint8_t dynShadow : 2;
uint8_t hasPresetName : 1;
uint8_t hasVobName : 1;
uint8_t hasVisualName : 1;
uint8_t hasRelevantVisualObject : 1;
uint8_t hasAIObject : 1;
uint8_t hasEventManObject : 1;
uint8_t physicsEnabled : 1;
uint8_t visualAniMode : 2;
uint8_t zbias : 5;
uint8_t bAmbient : 1;
} bitfield;
float visualAniStrength;
float vobFarClipZ;
};
Spoiler
Kod: [Zaznacz]
INLINE void zCQuat::Matrix3ToQuat(zMAT3 const& mat)
{
float dig = mat[0][0] + mat[1][1] + mat[2][2];
if(dig > 0)
{
float kf = sqrt(dig + 1.0);
qt[3] = kf * 0.5;
kf = 0.5 / kf;
qt[0] = (mat[1][2] - mat[2][1]) * kf;
qt[1] = (mat[2][0] - mat[0][2]) * kf;
qt[2] = (mat[0][1] - mat[1][0]) * kf;
return;
}
int k = 0;
if(mat[1][1] > mat[0][0])
k = 1;
if(mat[2][2] > mat[k][k])
k = 2;
int r[3] = { 1, 2, 0 };
float kf = sqrt(mat[k][k] - (mat[r[r[k]]][r[r[k]]] + mat[r[k]][r[k]]) + 1.0);
qt[k] = kf * 0.5;
if(kf != 0)
kf = 0.5 / kf;
qt[3] = (mat[r[k]][r[r[k]]] - mat[r[r[k]]][r[k]]) * kf;
qt[r[k]] = (mat[k][r[k]] + mat[r[k]][k]) * kf;
qt[r[r[k]]] = (mat[k][r[r[k]]] + mat[r[r[k]]][k]) * kf;
}