Passer un point 2D en 3D

Faisable dans un sens, mais pas dans l'autre ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut :)

Pour un petit projet, j'essaie de passer des points 3D en 2D (facile pour le moment, et fonctionnel).

Maintenant j'aimerai faire l'inverse, c'est à dire passer un point 2D en 3D à partir d'une origine fixe (0, 0, 0). La distance entre le point d'origine et le point 3D d'arrivée est connue bien sûr.

Mais disons que je n'y arrive pas :/

Le code pour passer de la 3D à la 2D est là :

1
2
3
4
5
6
    def project(self, win_width, win_height, fov, viewer_distance):
        """ Transforms this 3D point to 2D using a perspective projection. """
        factor = fov / (viewer_distance + self.z)
        x = self.x * factor + win_width / 2
        y = -self.y * factor + win_height / 2
        return Point3D(x, y, self.z)

Et du coup je me suis dit que je pouvais essayer de faire ceci :

1
2
3
4
    def point_to2D(self, x, y, screen):
        factor = self.line_size / (4 + z * 2)
        x = x * factor + screen.get_width() / 2
        y = -y * factor + screen.get_height() / 2

Sauf que … il me faut trouver Z ! J'ai bien pensé à appliquer Pythagore en 3D, mais même avec la formule, je coince toujours …

Petit rappel de la formule en 3D :

$$distance^2 = x^2 + y^2 + z^2$$

$$distance^2 - z^2 = x^2 + y^2$$

$$z^2 = - x^2 - y^2 + distance^2 $$

$$z = \sqrt{- x^2 - y^2 + distance^2}$$

En espérant ne pas avoir fait d'erreurs. S'il n'y en a pas, on voit un petit bims : la racine va être négative …

Edit : pas forcément en fait, faut que $distance^2$ soit plus grand que $- x^2 - y^2$

Du coup j'aurais bien besoin d'un petit coup de pouce ! Merci à vous

Édité par Cithoran

Ma chaine YouTube ! | Seventh, un micro langage communautaire ! | Mon projet : Unamed (en pleine reprogrammation en C++11/SFML2.4) | Mon tuto sur Pygame !

+0 -0
Staff

J'ai du mal à comprendre ce que tu cherches à faire.

Dans l'absolu tu ne peux pas reconstruire un point 3D à partir d'un seul point 2D. Il te manque forcément une information.

Si tu veux, intuitivement, ton point 2D est une projection du point 3D sur un plan. Si tu veux retrouver la vraie coordonnée de ce point dans un espace 3D, il te faut non pas une coordonnée 2D, mais au moins deux, c'est-à-dire les coordonnées 2D de ce point sur deux plans distincts.

C'est le principe de base de la stéréoscopie.

Édité par nohar

I was a llama before it was cool

+3 -0
Auteur du sujet

En fait, j'essaie de faire un sh'emp (shoot them up) en me basant sur un mini moteur que j'avais codé auparavant (Pysique).

Le point 2D correspond ici au clic du joueur sur l'écran, et j'aimerai pouvoir dessiner une ligne partant de (0, 0, 0) jusqu'à la projection du point 2D dans l'espace 3D.

Or effectivement il me faut plus de points, et là je vois comment faire (une sorte de triangle).

Sauf que pour avoir plusieurs points … Ben là ça coince. Peut-être en considérant (0, 0, 0) comme mon 2nd point ? Je vais essayer :)

Si tu considères que x et y sont des réels, alors tu peux considérer z comme un nombre imaginaire, et donc la racine carré négative ne sera plus un problème.

Poliorcetics

Disons que les nombres complexes, j'ai pas encore vu ça x) Mais merci quand même

Ma chaine YouTube ! | Seventh, un micro langage communautaire ! | Mon projet : Unamed (en pleine reprogrammation en C++11/SFML2.4) | Mon tuto sur Pygame !

+0 -0

Possible d'avoir une sorte de représentation graphique de ce que tu souhaites faire ? J'ai du mal à me le représenter.

Si tu considères que x et y sont des réels, alors tu peux considérer z comme un nombre imaginaire, et donc la racine carré négative ne sera plus un problème.

Poliorcetics

Disons que les nombres complexes, j'ai pas encore vu ça x) Mais merci quand même

Folaefolc

Oups, désolé. C'est pas bien difficile à comprendre je trouve (les bases au moins, je suis pas non plus un expert dans le domaine), donc si tu veux chercher tu devrais pouvoir te débrouiller sans harceler ton prof de math. :)

Édité par Poliorcetics

Hey, moi c'est polio, et je te souhaite une bonne lecture :p !

+0 -0

J'arrive peut être un peu tard mais tout ce que tu pourras reconstituer c'est une droite en 3D à partir de ton point 2D, celle ci va passer par ton point 2D sur le plan et ton observateur.

Si tu veux simuler un tir, cette droite va être la trajectoire de ton tir. tu n'auras plus qu'à tester la collision avec ta cible.

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte