Re: Portal BGE

Posté par gui36fr le 22/10/2010 21:32:42
Citation :
Oui, oui, j'ai vu, puis un peu avant aussi, tu es pas d'accord avec toi même...Tu mets un coup nor_1, un coup nor_p1

Ah oui mais tu regardera la ligne 69 il te manque encore le a de axey.

Citation :
Oui, je sais que ça viendra cette année, mais j'ai pas envie d'attendre.

Je t'aime bien, toi

Citation :
C'est plus l'inversion que j'ai pas compris mais vu que diviser par un nombre revient à multiplier par son inverse, je suppose que ça marche de la même façon pour les matrices

L'inversion (-rot si j'ai bien compris ce que tu me demandes) c'est parce que la vue du joueur est inversé d'un portail à l'autre (s'il rentre en "marche arrière", quand il ne regarde pas le portail il en ressort en le regardant, pareil dans l'autre sens, donc il faut inverser). Et le angle = ... - phi c'est pour la symétrie par rapport à la normale.

La division par mod (le module du projeté (sa longueur, si tu préfères)) c'est pour agrandir le projeté si son module n'est pas égal à 1 (produit en croix) :
(avec x' et y' les coordonnées du projeté (donc z'=0) et x, y et z les coordonnées de la normale)
x' = x*module(x, y, z)/module(x, y) = x*1/module(x, y) = x/module(x, y)
y' = y*module(x, y, z)/module(x, y) = y/module(x, y)

On a donc:
module(x', y')² = (x')² + (y')² = x²/(x² + y²) + y²/(x² + y²) = (x² + y²)/(x² + y²) = 1

Or la racine carré de 1 est 1 : le projeté est correcte


Pour l'orientation de la force, tu veux garder l'orientation entière ou seulement sur un plan horizontal ?

EDIT :
Finalement, j'ai conservé entièrement la force, mais si tu ne la veux qu'à l'horizontal, tu remplaces force[z] par 0. à la fin :
from bge import logic as gl

#on aura besoin de phase pour le calcul d'angle d'un complexe, du sinus et cosinus
from cmath import phase
from math import cos, sin

#on defini i
i = complex(0, 1)

x, y, z = 0, 1, 2


force = ...
mod_force = (force[x]**2 + force[y]**2)**0.5

#ici tu mets les coordonnees de la normale du portail "d'envoi"
nor_1 = ...
#la le portail de "reception"
nor_2 = ...

if (-0.9 < nor_1[2] < 0.9) and (-0.9 < nor_2[2] <0.9):
	#calcul des modules des projections des normales pour ajuster la longueur des projections
	mod_1 = (nor_1[x]**2 + nor_1[y]**2)**0.5
	mod_2 = (nor_2[x]**2 + nor_2[y]**2)**0.5
	
	#phi est l'angle entre la "force" et la normale du premier portail sur le plan horizontal
	phi = phase(complex(-force[x]/mod_force, -force[y]/mod_force)) - phase(complex(nor_1[x]/mod_1, nor_1[y]/mod_1))
	
	#calcul de l'angle entre la normale du 2eme portail et la "force"
	angle =  phase(complex(nor_2[x]/mod_2, nor_2[y]/mod_2)) -phi
	
	force = [cos(angle)*mod_force, sin(angle)*mod_force, force[z]]

Gare aux erreurs...

Bon blend

EDIT : correction des erreurs du script

Cette contribution était de : http://blenderclan.tuxfamily.org/html/newbb/viewtopic.php?forum=3&topic_id=27924&post_id=347441