Page 1 sur 1

[RESOLU] Focale : Bug ou pas bug ? -> pas Bug XD

Publié : dim. 01/sept./2013 20:52
par Jenova
Salut tout le monde, aujourd'hui j'ai décidé de jouer un peu avec la 3D de purebasic et je me suis cassé une canine sur la focale.
Je vous met en place le test.
- Je prend une résolution de 1920x1080
- je crée un objet plain de 1920x1080
- je choisi une focale de 60 degré
avec Pythagore je calcule le recul nécessaire de la camera pour que l'objet prenne 100% de l'écran, d'après mes calculs la camera devrai reculer de 1662.77 or à cette distance l'objet est beaucoup trop loin.
En avançant la camera manuellement il me faut aller à une distance de 935 pour que l'objet prenne 100% de l'écran ce qui représente une focale de 91.512 degré contre les 60 demandés 8O
Quel est le problème ? Si vous avez des suggestions je suis preneur, si on ne peu pas se positionner mathématiquement ça crains :|

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 21:01
par G-Rom
Salut , tu as du code ?

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 21:08
par Jenova

Code : Tout sélectionner

IncludeFile "Screen3DRequester.pb"
#CameraSpeed = 1

If InitEngine3D()
  
  Add3DArchive("texture",#PB_3DArchive_FileSystem)
  InitSprite()
  InitKeyboard()
  InitMouse()
  AngleDeVision.f = 60; 60degré de focale... normalement, essayez avec 91.512
  ResolutionPrevueDuJeux_X.f = 1920
  ResolutionPrevueDuJeux_Y.l = 1080
  
  If Screen3DRequester()
    
    CreateMaterial(1, LoadTexture(1, "1.png"))
    
    CreateCamera(1,0,0,100,100)
    CameraFOV(1,60) ; oui oui je veux bien du 60
    CameraRange(1,0,2000)
    MoveCamera(1,0,0,((ResolutionPrevueDuJeux_X/2)/Tan(Radian(AngleDeVision/2)))*-1,#PB_Absolute)
    CameraLookAt(1,0,0,0)
    
    CreatePlane(1,1920,1080,1,1,1,1)
    CreateEntity(1,MeshID(1),MaterialID(1),0,0,0)
    RotateEntity(1,-90,0,0,#PB_Absolute)
    
    AmbientColor(RGB(255, 255, 255))
    KeyY = ((ResolutionPrevueDuJeux_X/2)/Tan(Radian(AngleDeVision/2)))*-1
        Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.15
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.15
      EndIf
      
      If ExamineKeyboard()    
        
        If KeyboardPushed(#PB_Key_Up)
          KeyY - #CameraSpeed
          Debug KeyY
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY + #CameraSpeed
          Debug KeyY
        EndIf
      EndIf
      
      MoveCamera(1, KeyX, 0, KeyY,#PB_Absolute)
      RotateCamera(1,  MouseY, MouseX, 0, #PB_Relative)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
Pour l'image prenez n'importe laquelle en png ça ferra l'affaire, le fichier Screen3DRequester.pb vient de la partie exemple inclu dans PB

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 21:49
par comtois
Avec Ogre la focale est verticale.
http://www.ogre3d.org/tikiwiki/tiki-index.php?page=-FOV

[EDIT]
Le calcul serait donc

Code : Tout sélectionner

Height.f = 1080
Fov.f = 60
Distance.f = (Height/2.0)/Tan(Radian(Fov/2.0))
Debug Distance

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 22:11
par G-Rom
Ta formule est fausse , base toi sur la resolution en Y et pas en X

edit: Comtois à tout dis. pense aussi a stocké le tout dans un float.

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 22:14
par Jenova
Merci, vous êtes des as :mrgreen:

Re: Focale : Bug ou pas bug ?

Publié : dim. 01/sept./2013 22:23
par falsam
Et comme ça c'est bon ? :mrgreen:

Code : Tout sélectionner

Global CameraSpeed = 1

Global Width.i, Height.i, vFov.f, HFov.f, CamScale.f, CamX.f

InitEngine3D()
InitKeyboard()
InitSprite()

;Avec Ogre la focale est verticale
Width = 1920
Height = 1080

vFOV = 60 
Camscale = Tan((vFov / 2 ) / 180 * #PI)
CamZ =  Height/2/CamScale

window = OpenWindow(#PB_Any,0, 0, Width, Height,"FOV")
OpenWindowedScreen(WindowID(window), 0, 0, Width, Height)

Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

Mesh = CreatePlane(#PB_Any, 1920, 1080, 1, 1, 1, 1)
Material = CreateMaterial(#PB_Any,TextureID(texture))
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(material))
RotateEntity(Entity, 90, 0, 0, #PB_Absolute)

Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraFOV(Camera, VFov)


While #True
  
  Event = WindowEvent()
  Select event
  EndSelect
  
  ExamineKeyboard()  
  
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf  
    
  If KeyboardPushed(#PB_Key_Up)
    CamZ-CameraSpeed  
    Debug CamZ
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamZ+CameraSpeed
    Debug CamZ
  EndIf
    
  MoveCamera(camera, 0, 0, CamZ, #PB_Absolute)
  CameraLookAt(camera,0,0,0)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend

Re: Focale : Bug ou pas bug ?

Publié : lun. 02/sept./2013 12:48
par Jenova
Ouille, quel dommage, on dirait que ma chtite idée fonctionne pas :(
J'avais dans l'idée de remplacer les Sprites2D et 3D par des plains ou autres formes 3D sans profondeur dans ogre.
Je croyais qu'on pouvais verrouiller certains déplacement grâce à EntityAngularFactor(seule une rotation sur axe Z autorisée) et EntityLinearFactor (aucun mouvement sur axe Z autorisé pour s'assurer que les plains restent tous sur le même plan et ainsi conserver une détection de collision) ce qui aurais été génial :D ... de la 2D avec camera de recul (comme dans Rayman legend) avec possibilité d'ajouter facilement des effets de lumières, des particules, de la physique façon Box2D, des déformations de sprites grâce à leur maillage 3D, des animations par bones etc... le pied quoi :mrgreen:
Mais ça ne fonctionne pas, les deux commandes citées plus haut restent sans effet lors des déplacements automatisées.
Si vous prenez l'exemple plus haut, ou vous avez résolu mon soucis de focale (encore bravo, jamais je n'aurai imaginé une ouverture de focale verticale 8O ) et que vous placez un autre objet plain au dessus avec les body qui vont bien et que vous laissez faire la gravité (préférez une faible gravité sans quoi on ne s’aperçoit même pas du contacte) l'objet du dessus va descendre jusqu’à toucher l'objet du dessous (ce qui va le stopper une seconde) et suite à ce contacte l'objet du dessus va se décaler sur l'axe Z de zéro virgule pas grand chose (malgré mon EntityLinearFactor qui lui dit <<pas bouger!>>) et poursuivre ça chute infernale grrrr mais pourquoi est-il aussi méchant ?!??

Re: Focale : Bug ou pas bug ?

Publié : lun. 02/sept./2013 14:18
par Fred
Eddy a posté un code a propos de sprite OGRE natifs: http://www.purebasic.fr/english/viewtop ... 12&t=55942

Re: Focale : Bug ou pas bug ?

Publié : lun. 02/sept./2013 15:36
par Jenova
Merci,
je viens de zieuter les codes, le dernier exemple génère des erreurs mais en regardant de plus près il me semble qu'au final, on restitue des sprites avec ogre mais qu'ils ne bénéficient pas de la gestion physique (gravité/poussée/transmission de forces etc...) quasi automatique calculée par RenderWorld() exploitant un body avec les entity, je me trompe ?
En tout cas c'est intéressant.

Edit: Bon je vais laisser tomber les fonctions de physique automatisées et utiliser des détections de collisions 3D associées à une gestion de la physique basique (poussée, gravité, friction) programmée avec les coudes, cela me permettra de faire suivre tout reliefs 3D et de se reposer dessus comme si on gérai de la 2D classique. J'ai testé ça fonctionne plutôt bien. Je pourrais conserver du coup Ogre et les déplacements de vue par camera, les couleurs et autres effets visuels propre à la 3D. C'est déjà assez sympa comme ça :mrgreen: mais il va falloir que je repense totalement mon éditeur de Map initialement prévu pour de la 2D/Tile classique (j'en suis déjà tout excité :D )