Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 179
    Points
    1 179

    Par défaut extraction du redimensionnement signé d’une matrice de transformation ?

    Bonjours,

    Je coince actuellement sur un problème qui n’a pas l’air évident du tout –*extraire la partie “redimensionnement” (un tableau de trois float, scale x/y/z) d’une matrice de transformation (qui a priori ne contient que du redimensionnement, mais potentiellement modifiée par un changement d’espace).

    Le truc pour extraire le redimensionnement non signé est simple –*pour info, voici notre code C actuel*:

    Code :
    1
    2
    3
    4
    5
    6
    void mat3_to_size(float size[3], float mat[][3])
    {
    	size[0] = len_v3(mat[0]);
    	size[1] = len_v3(mat[1]);
    	size[2] = len_v3(mat[2]);
    }
    Mais pour récupérer le redimensionnement signé (en cas d’échelle négative), ben… je trouve rien. Quelqu’un a-t-il une technique*? Ou peut-il me confirmer que ce n’est pas faisable (j’aime pas me taper la tête contre les murs pour rien)*? Merci d’avance.
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

  2. #2
    Membre éclairé

    Inscrit en
    octobre 2010
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 215
    Points : 314
    Points
    314

    Par défaut

    Salut !

    A mon avis tu as posté ton problème au mauvais endroit, le terme infographie de ce forum, semble plus indiquer le domaine métier que la spécialisation mathématique.
    Sache qu’il existe un forum mathématique ici qui traite de nombreux problèmes infographie. Il est bien planqué

    Mais pour récupérer le redimensionnement signé (en cas d’échelle négative), ben… je trouve rien.
    Une échelle négative… cela n’a pas sens

    L’échelle est indiqué par la norme de chaque axe de ton repère, la longueur d’un vecteur est obligatoirement un nombre réel positif.
    Si tu cherche à réduire l’espace, il te faut fixé cet norme dans l’intervalle ]0, 1[ et pour l’agrandir ]1, infini] . Si tu appliques un coefficient négatif, en plus de modifier l’échelle, tu inversera ton axe, il est préférable de manipuler l’orientation de tes 3 axes en même temps, en utilisant des matrices de rotation ou des quaternions, afin de garder un repère cohérant.

  3. #3
    Membre Expert

    Homme Profil pro Bastien Montagne
    Diverses et multiples
    Inscrit en
    mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Nom : Homme Bastien Montagne
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : mai 2008
    Messages : 662
    Points : 1 179
    Points
    1 179

    Par défaut

    Merci pour cette réponse (et le lien )…

    Le fait est que Blender reconnaît les tailles négatives (utilisées entre autre pour les transformations “miroir”) –*et que ça pose de nombreux problèmes avec les contraintes, qui ne travaillent que sur des matrices. Bref, faut que je voie si y a moyen de bricoler quelque chose… :/
    Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques

  4. #4
    Membre éclairé

    Inscrit en
    octobre 2010
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 215
    Points : 314
    Points
    314

    Par défaut

    Ok ! Tu peux utiliser le produit scalaire de chacun de tes axes sur ceux d’origine (la matrice identité) pour en déduire l’inversion ou le signe.

    Un truc du genre :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void dot(float v1[3], float v2[3])
    {
    	return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
    }
     
    void mat3_to_size(float size[3], float mat[][3])
    {
    	size[0] = ((dot(mat[0],{1, 0, 0})>0)? 1 : -1) * len_v3(mat[0]);
    	size[1] = ((dot(mat[1],{0, 1, 0})>0)? 1 : -1) * len_v3(mat[1]);
    	size[2] = ((dot(mat[2],{0, 0, 1})>0)? 1 : -1) * len_v3(mat[2]);
    }

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •