Sinon une matrice 2*2 suffit amplement pour faire de la 2D si je ne me trompe pas :
x' = (x * cos(alpha) * sx + tx + ox) + (y * sin(alpha) * sy)
y' = (x * -sin(alpha) * sx) + (y * cos(alpha) * sy + ty + oy)
En espérant avoir bien recopier la formule que j'ai écrite sur papier ce matin.
tx et ty sont la translation de x et de y, sx et sy l'échelle, alpha l'angle de rotation, ox et oy les origines en x et y, x les coordonnées du point à transformer et ', y' les coordonnées du point transformé.
Hum..., j'ai du inverser les signes pour la matrice car l'axe y pointe vers le bas.
Ta matrice 4*4 ok elle marche mais je n'y comprend rien. :/
Bref moi je ne m'en sert que pour de la 3D. (Dans ma classe TransformMatrix j'ai 2 matrices, une 2*2 pour de la 2D et une 4*4 pour de la 3D.)
PS : de plus je combine les transformations dans ma classe TransformMatrix directement et si je veux pas combiner bah je fais loadIdentity avant chaque transformation je trouve ça plus pratique que de devoir réimplémenter une classe pour combiner les transformations.
Voici à quoi ressemble ma classe :
void TransformMatrix::setRotation (int angle) {
float cosAlpha = Math::cosinus(Math::toRadians(angle));
float sinAlpha = Math::sinus(Math::toRadians(angle));
matrix2f.m11 += cosAlpha;
matrix2f.m12 += sinAlpha;
matrix2f.m21 += -sinAlpha;
matrix2f.m22 += cosAlpha;
}
void TransformMatrix::setScale (float sx, float sy) {
matrix2f.m11 *= sx;
matrix2f.m12 *= sy;
matrix2f.m21 *= sx;
matrix2f.m22 *= sy;
}
void TransformMatrix::setTranslation (int dx, int dy) {
matrix2f.m21 += dx;
matrix2f.m22 += dy;
}
void TransformMatrix::reset () {
matrix2f.identity ();
}
Vec2f TransformMatrix::transform (const Vec2f &vec2) {
return matrix2f * vec2;
}
Vec3f TransformMatrix::inverseTransform (const Vec2f &vec2) {
Matrix2f inv;
inv = matrix2f.inverse();
return inv * vec2;
}
Bref ça m'ennuie beaucoup de devoir dériver de sf::Transformable ou bien de devoir réutiliser un sf::Transform en interne pour pouvoir faire ce genre de chose. :/
Je pense que je vais utiliser SFML que pour le fenêtrage finalement, les évènements, le son et le réseau.
Pour le reste j'ai besoin de code plus simple que de devoir dériver à chaque fois et utiliser mon propre sf::Transform pour gérer les transformations d'un parent et de ses noeuds. :/
Et ce qui m'énerve le plus c'est de devoir faire un setPosition pour un sprite si je veux lui mettre une position par défault hors que si mon sprite est statique et que je veux simplement lui donner 1 vertexarray avec 4 positions sans devoir passer par une transformation et devoir faire gaffe lorsque je combine cette transformation avec celle du noeud.
Je crois que je vais refaire une classe sprite ou je mets direct une position aux vertex pour les 4 coins et pas utiliser de tansformations si je n'en veut pas.