1
votes

Diviser un nombre par un vecteur3

Est-il possible de diviser un nombre par un Vector3 ? Par exemple, comment puis-je diviser 1 par le vecteur d'échelle d'un objet pour redimensionner son enfant en fonction de son échelle parent sans créer un nouveau Vector3 en appliquant les valeurs de chaque axe respectivement?


2 commentaires

Non, afaik il n'y a rien de tel que 1 / Vector3


Je vous recommande d'écrire une méthode d'extension pour Vector3 si vous devez le faire plusieurs fois.


3 Réponses :


0
votes

Vous ne pouvez pas faire cela car un Vector3 n'est pas une valeur scalaire.

Vous pouvez cependant utiliser des fonctions mathématiques en utilisant les parties individuelles d'un Vector3 (x, y, z) .

EX:

var number = 5 * someVector.x; 


1 commentaires

et c'est exactement ce que OP ne voulait pas faire;) sans faire un nouveau Vector3 appliquant les valeurs de chaque axe



3
votes

Il n'existe pas de méthode intégrée de ce type

mais vous pouvez simplement ajouter un méthode d'extension une fois comme

var parentSize = transform.parent.lossyScale; // e.g. 1, 2, 3

var invertedParentSize = parentSize.Invert();

// -> 1.0, 0.5, 0.333..

que plus tard dans tous vos scripts il vous suffit de faire par exemple

public static class Vector3Extensions
{
    /// <summary>
    /// Inverts a scale vector by dividing 1 by each component
    /// </summary>
    public static Vector3 Invert(this Vector3 vec)
    {
        return new Vector3(1 / vec.x, 1 / vec.y, 1 / vec.z);
    }
}


8 commentaires

Je pense que le mot `` inverser '' signifie un vecteur de direction opposée, il ressemble plus au vecteur ^ (- 1)


@caxapexac alors comment l'appellerais-tu? ce que vous voulez dire est déjà simplement couvert par - Vector3 ou Reflect < / a>. Puisqu'il est censé être utilisé pour "inverser" un vecteur d'échelle, j'ai "trouvé" ce nom pour lui;)


@derHuro, je ne connais pas exactement le mot juste pour ce comportement mais je suppose que c'est quelque chose comme PowMinusOne ()


@derHugo Je l'appellerais Reciprocal () . C'est finalement ce que vous faites. Invert () est vraiment un terme trompeur et à mon humble avis


@Neuron ainsi que déjà dit, vous pouvez l'appeler comme vous voulez l'appeler ... J'ai utilisé Invert parce que, comme vous le voyez, il fait exactement cela, inverser la mise à l'échelle de l'objet parent. Je suis conscient que ce n'est probablement pas le terme mathématique correct, mais pour moi plutôt une description de ce à quoi il sert. Pour moi, dans mes projets, ce nom avait un sens ... mais n'hésitez pas à l'appeler comme vous voulez;) Vous pouvez l'appeler Réciproque mais je peux vous dire que je devrais à chaque fois regarder pour comprendre ce qu'il fait;) (je ne suis pas natif anglais)


@derHugo oui, je ne suis pas non plus de langue maternelle anglaise. Je suppose que vous parlez l'allemand natif (ce que je fais aussi), auquel cas on l'appelle aussi "reziproke Wert", donc la langue n'est pas vraiment une excuse;) et les mots dans la programmation sont importants. dans tout projet, lorsque vous travaillez avec les autres, les mots doivent avoir une élégance, une simplicité et une vérité. Si le mot est nouveau pour vous, tant mieux. un nouveau mot auquel vous pouvez apprendre et vous habituer. J'accepterais votre excuse si vous n'utilisiez jamais ce mot que dans votre propre projet et ne le partagiez jamais avec personne, mais vous utilisez ce mot sur SO. Ne sous-estimez pas le nombre de personnes qui copient simplement ...


code dans leurs projets sur lesquels de nombreuses personnes travaillent. Je pense que si vous voulez que votre réponse soit bonne, vous ne devriez pas utiliser Invert parce que pour quiconque est quelque peu habitué à la notation mathématique, c'est vraiment trompeur. Cela peut en fait amener certains développeurs sur certains projets à utiliser cette méthode. il passe ensuite non testé et atterrit en code de production. Je n'essaie donc pas d'avoir une discussion philosophique ici, mais je pense que cela compte vraiment et vous pourriez améliorer votre réponse en changeant le nom de cette fonction;) bravo


conclusion .. "vous pouvez l'appeler comme vous voulez l'appeler ..." -> dans votre propre projet, pas sur SO :)



0
votes

Vous ne pouvez pas le faire, mais si vous garantissez que les trois axes changeront l'échelle à la même valeur comme (1, 1, 1) à (0,5, 0,5, 0,5) ou au moins à la même proportion (100% à 70% dans tous les axes), alors vous pouvez enregistrer dans un int la valeur de l'un de ces axes.

int number = 1/gameObject.transform.localScale.x;

gameObject.transform.localScale *= gameObject.transform.parent.getComponent<someClass>().number;

Ensuite, sur les objets enfants, vous utilisez simplement le nombre:

gameObject.transform.localScale *= gameObject.transform.parent.getComponent<someClass>().number;

Les variables int ne peuvent stocker qu'une seule valeur, vous ne pouvez donc pas utiliser la même variable pour allouer des données de trois axes simultanément.

la méthode que je vous ai donnée est de copiez l'échelle, si vous voulez conserver la taille des enfants même si le parent change l'échelle, vous divisez 1 / échelle parent

int number = gameObject.transform.localScale.x;


0 commentaires