2016-06-28 1 views
0

Dans mon projet (C++/UE4), une maille à levier dépasse du sol. Maintenir le bouton gauche de la souris sur ce levier et déplacer la souris lance une opération de glissement. Cette opération de glissement est responsable du calcul des mouvements de la souris delta 2D et de l'utilisation de ces données pour faire tourner le levier * dans l'espace local *, qui ne peut tourner que sur un seul axe (négatif ou positif, mais toujours un seul axe). Mais que se passe-t-il si, au lieu d'être devant le levier, je suis derrière? Que faire si je suis sur l'un de ses côtés? Que faire si le levier dépasse d'un mur plutôt que le sol? ... Comment faire pour que les mouvements de la souris permettent de faire pivoter le levier en fonction de l'angle de vue, quelle que soit l'orientation du levier?Glissement d'un levier 3D (en fonction de l'orientation et de l'angle de vue)


Pour m'expliquer davantage ...
Voici une liste des scénarios, et comment j'aimerais la souris pour les contrôler:

Lorsque le levier est sur le sol et vous êtes en face de celui-ci:

  • Si vous déplacez le souris UP (-Y), il doit tourner loin de la caméra
  • Si vous déplacez la souris vers le bas (+ Y), il doit tourner vers la caméra

Lorsque le levier de sur le sol et vous êtes SILLAGE:

  • Si vous bougez la souris (-Y), il devrait tourner de la caméra
    (ce qui est le sens opposé de l'espace mondial quand vous êtes devant)
  • Si vous déplacez la souris vers le bas (+ Y), il doit tourner vers la caméra
    (ce qui est le sens opposé de l'espace mondial quand vous êtes en face de celui-ci)

Lorsque le levier est sur le sol et vous êtes à côté:

  • Si vous déplacez la gauche de la souris (-X), il devrait tourner à gauche de la caméra
    (ce qui est le sens opposé lorsque vous êtes de l'autre côté de celui-ci)
  • Si déplaçant le DROIT de la souris (+ X), il doit tourner à droite de l'appareil photo
    (qui est la direction opposée lorsque vous êtes sur l'autre côté de celui-ci)

lorsque le levier est sur un MUR et vous êtes en avant:

  • Si vous déplacez la souris, il devrait tourner vers le haut (vers le ciel)
  • Si vous déplacez la souris vers le bas, il devrait pivoter vers le bas (vers le sol)

Lorsque la levier est sur le mur et vous êtes à côté:

  • même que quand il est sur le mur et vous êtes en face de celui-ci

S'IL VOUS PLAÎT NOTE si elle aide à tous, que UE4 n'intégré des fonctions mathématiques vecteur 2D/3D, ainsi que des moyens faciles de projet et deproject coordonne depuis/vers le monde en 3D ou un écran 2D. Pour cette raison, je connais toujours les coordonnées spatiales et spatiales exactes de l'emplacement de la souris, l'emplacement du pivot (de base) du levier et l'emplacement du levier (en haut), ainsi que la quantité (delta) de la souris a déplacé chaque image.

Répondre

1

Obtenez le pivot du levier (le point autour de celui-ci tourne) et projetez-le aux coordonnées de l'écran. Puis, lorsque vous cliquez pour la première fois, vous stockez les coordonnées du clic.Maintenant, quand vous avez besoin de savoir dans quelle direction tourner, vous calculez le produit scalaire entre le pivot vectoriel au premier clic et le pivot vectoriel à l'emplacement actuel (vous devez normaliser les vecteurs avant le produit scalaire). Cela vous donne cos (angle) que la souris a bougé et vous pouvez l'utiliser (prendre arccos (valeur) pour obtenir l'angle) pour déplacer le levier en 3d. Ce sera un peu bancal puisque l'angle sur l'écran n'est pas le même que l'angle projeté, mais il est plus facile de le contrôler (si vous déplacez la souris à 90 degrés, le levier bouge de 90 degrés même s'il ne s'aligne pas correctement). Jouez avec l'installation et voyez ce qui fonctionne le mieux pour votre projet.

Une autre façon de faire est la suivante: Lorsque vous cliquez pour la première fois, vous stockez le point de la fin du levier (ou mieux encore le point où vous avez cliqué sur le levier) dans l'espace 3D. Vous utilisez le plan de projection de la caméra pour déplacer le point en 3D (vous pouvez utiliser le vecteur de la caméra, après l'avoir orthogonal à la direction de la caméra, puis prendre la direction de la vue pour obtenir la bonne direction). Vous appliquez les mouvements delta de la souris au point, puis le projeter dans le plan de rotation et déplacez le levier pour aligner le point sur celui projeté (le calcul est similaire à celui ci-dessus, utilisez simplement les points 3D au lieu des projections d'écran) .

Attention: cela ne fonctionne pas bien si l'appareil photo est très proche du plan de rotation car il n'est pas toujours évident que le levier puisse avancer ou reculer.

Je ne suis pas un expert en unreal-engine4 (juste en train d'apprendre moi-même) mais tout ceci est un calcul vectoriel de base et devrait être bien supporté. Découvrez le produit scalaire et le produit croisé sur wikipedia, car ils sont super utiles pour ce genre de trucs.

+0

J'ai mis à jour ma question pour être plus approfondie sur les différents types de scénarios que j'ai en tête. L'un ou l'autre de vos algorithmes suggérés fonctionnera-t-il pour tous les cas répertoriés? Merci! – RectangleEquals

+0

@RectangleEquals Les deux algorithmes fonctionnent dans tous les cas, y compris la plupart des angles pour la caméra et le levier (par exemple, levier sur une pente). Le cas étrange est quand le levier est sur le sol devant vous et il est censé s'en aller et vers la caméra. La méthode de l'espace de l'écran vous déplacez la souris vers la gauche et le levier s'éloigne de vous. La méthode de l'espace du monde vous déplacez la souris vers le bas et le levier peut revenir en avant en fonction de votre alignement exact. Les deux sont un peu étranges du point de vue du contrôle, mais sans une souris que vous pouvez pousser dans la table, ce ne sera pas une solution facile. – Sorin

+0

@RectangleEquals Je vous suggère d'essayer d'abord ces méthodes et de vous faire une idée des mathématiques. Une fois que vous êtes à l'aise avec cela, vous pouvez essayer des mappages différents, ou une combinaison de solutions, en fonction de votre position relative par rapport au levier. Vous pouvez également trouver que certaines méthodes sont plus intuitives dans votre contexte, même si elles ne sont pas parfaites pour le contrôle. – Sorin