/ / Vlastná rotácia Quaternionu C ++ nefunguje správne - c ++, rotácia, vektorová grafika, kvaternály

Custom C ++ quaternion rotácia nefunguje správne - c ++, rotácia, vektorová grafika, kvaterniony

V mojom kóde mám kvartér, na ktorý sa používarotácia kamery pre hráča. Samotná rotácia vyzerá dobre, ale moje smerové vektory na pohyb a rotáciu sa neotáčajú správne.

Násobenie kvartéru:

Quaternion Quaternion::operator*(Vector3 other) const
{

float x_ = w * other.x + y * other.z - z * other.y;
float y_ = w * other.y + z * other.x - x * other.z;
float z_ = w * other.z + x * other.y - y * other.x;
float w_ = -x * other.x - y * other.y - z * other.z;

return Quaternion(x_, y_, z_, w_);

}

Quaternion Quaternion::operator*(Quaternion other) const
{

Vector4 r = other.getValues();

float x_ = x * r.w + w * r.x + y * r.z - z * r.y;
float y_ = y * r.w + w * r.y + z * r.x - x * r.z;
float z_ = z * r.w + w * r.z + x * r.y - y * r.x;
float w_ = w * r.w - x * r.x - y * r.y - z * r.z;

return Quaternion(x_, y_, z_, w_);

}

Funkcia konjugácie

Quaternion Quaternion::conjugate() const
{

return Quaternion(-x, -y, -z, w);

}

Rotácia vektora:

void Vector3::rotate(Quaternion rotation)
{

Quaternion rotated = rotation * *this * rotation.conjugate();

x = rotated.getValues().x;
y = rotated.getValues().y;
z = rotated.getValues().z;

}

Vzorový smerový vektor:

Vector3 Quaternion::getRight() const
{

Vector3 right(1.0f, 0.0f, 0.0f);
right.rotate(*this);

return right;

}

Ak mám kameru otočenú presne o 90 stupňovokolo osi y a vytlačím hodnoty správneho vektora, x je 0,000796229, y je 0 a z je -1. V tomto prípade by x malo byť 0 a z by malo byť kladné 1.

Počas posledných dní som prehliadal kód spoločnosti Google a ďalších používateľov, aby som zistil, čo robím zle, ale nemôžem nájsť nič zlé.

UPDATE:

Nakoniec som sa rozhodol začleniť GLM do mojich matematických tried a po nejakej zmene vecí všetko funguje tak, ako má.

odpovede:

1 pre odpoveď č. 1

Vo vektorovej rotácii nahraďte prvý riadok znakom

Quaternion rotated = rotation * Quaternion(this->x, this->y, this->z, 0) *
rotation.conjugate();

Vysvetlenie: Násobky kvartéru nie sú komutatívne, čo znamená, že Q * v sa nerovná v * Q, pričom v je kvartér s w = 0.


0 pre odpoveď č. 2

Nakoniec som sa rozhodol začleniť GLM do mojich matematických tried a po nejakej zmene vecí všetko funguje tak, ako má.