Je suis en train de créer un moteur 3D sur une base spéciale (qui reproduit la déformation de la rétine). J'ai recommencé et recommencé mes calculs, changé tout, et il me reste un problème à régler, mathématique bien sûr. Il paraît très simple, pourtant mes calculs ne correspondent pas aux observations...
Entrons dans le vif du sujet : à un certain moment, je dois calculer la position (relative ou absolue, j'utiliserais le symbole D pour dire relatif) du point C au centre de mon champ de vision pour une distance à C "Dp" donnée.
Je connais :
- Rgd, entre -π et π, correspondant à l'angle de mon regard vers la droite ou la gauche en radians ( 0 quand je suis l'axe des x)
- Rhb, entre -π/2 (en bas) et π/2 (en haut), vers le haut et le bas (0 = en face)
- ma position [xM,yM,zM]
-"Dp"
Dès lors je me suis dit que je pouvais faire un parallélépipède tout ce qu'il y a de plus honnête, si on l'appelle ACKZMYWX (en rompant toute nomenclature correcte, mais ça ne change rien)
‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸C
A‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸|‸‸‸‸‸‸‸‸‸‸‸‸‸K
|‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸Z‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸|‸‸‸‸‸‸‸‸‸‸‸‸‸|
|‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸|‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸W‸‸‸‸‸‸‸‸‸‸‸‸|‸
Y‸‸‸‸‸‸‸‸‸‸‸‸‸ |‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸X
‸‸‸‸‸‸‸‸‸‸‸‸‸‸‸M
où MX,MY et MZ suivent les axes xyz.
MX = Dxc selon toute logique, de même que MY,MZ = Dyc, Dzc (x relatif de C par rapport à M, ma position)
pourtant, DyC ne semble pas égale à tan(Rgd) pas plus que DzC à tan(Rhb) car
Ne donne pas la bonne réponse, car pour M[1,1,1] et Rgd=-π/4 et Dp=
je trouve Rhb = -0,785398 (atan(1)) au lieu de 0.6154797 qui est la bonne réponse trouvée grâce à géogébra 3D.
Donc, comment trouver Dxc, Dyc et Dzc à partir de mes informations de manière correcte ?
Pistes :
- -0,785398 correspond dans l'idée à racine de 2 (ou en tout cas juste le carré axes y/Z) alors que la vraie réponse concerne le cube (axes x/y/z)
- peut-être que Rhb = angle(KMX) n'est pas égal à l'angle (WMC) contrairement à ce que conclurait la méthode précédente (pareil pour Rgd et (KMC)).
-
Ce problème a l'air plus simple que le reste des calculs... je pense qu'il est facilement résoluble !
Merci beaucoup d'avance pour votre aide !
NB : si vous vous questionnez sur la suite des calculs :
- Code: Tout sélectionner
if not 1.5708>=Rgd>=-1.5708: Dxc*=-1
Xi = math.sqrt((Dxc+pos[0]-posp[0])**2+(math.tan(Rgd)*Dxc+pos[1]-posp[1])**2+(math.tan(Rhb)*Dxc+pos[2]-posp[2])**2)
#
Dxg=math.cos(Rgd+1.5708)*Dp
Zeta = math.sqrt((Dxg+pos[0]-posp[0])**2+(math.sin(Rgd+1.5708)*Dp+pos[1]-posp[1])**2+(pos[2]-posp[2])**2)
#print("Position c :",Dxc+pos[0],",",math.tan(Rgd)*Dxc+pos[1],",",math.tan(Rhb)*Dxc+pos[2]) # sûr ?
s=Dp+Xi/2
#print("aire (xi)**2:",abs(s*(s-Dp)**2*(s-Xi)))
B=math.sqrt(Dp**2-abs(s*(s-Dp)**2*(s-Xi))*4/Dp**2)
#print("B :",B, "=", Dp)
ss=Dp+Zeta/2
F=math.sqrt(Dp**2-abs(ss*(ss-Dp)**2*(ss-Zeta))*4/Dp**2)
#print("F :",F)
J=math.sqrt(B**2+F**2)
#print("J :",J)
prex=(math.acos(B/J)
*1.146*200) # entre 0 et 200
xecran=200-prex if Rgd<0 else prex+200
prey=(math.acos(J/Dp)
*1.432*300)
yecran=300-prey if Rhb >0 else prey+300