Page 1 sur 1

Problème correction perspective 3D

Publié : mar. 22/déc./2020 16:46
par falsam
■ PB 5.73 (x64)

Peut être n'ai je pas bien compris le fonctionnement de la fonction

CameraProjectionMode(#Camera, Mode [, Width, Height])

Cette fonctionnalité permet de corriger le volume de visualisation de la caméra après un resize du screen par exemple.

:idea: j'ai noté que cette fonctionnalité ne figure pas dans l'aide en français mais figure dans l'aide en anglais.

https://www.purebasic.com/documentation ... nmode.html

Avec ce code il est possible de redimensionner une fenêtre 3D mais souci, la correction de la perspective ne fonctionne pas. Les entités 3D ne sont pas redimensionnées correctement.

Code : Tout sélectionner

Enumeration window
  #mf  
EndEnumeration

; Window
Global Event, ww = 1024, wh = 768

; 3D
Global Camera, Entity0, Entity1

; Summary
Declare Start()
Declare Render()
Declare Resize()
Declare Exit()

;-
InitEngine3D()
InitSprite()
InitKeyboard()

Start()

Procedure Start()
  OpenWindow(#mf,  0,  0, ww, wh, "Volume 3D correction", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget) 
  OpenWindowedScreen(WindowID(#mf), 0, 0, ww, wh, #True, 0, 0)
    
  Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
  CameraBackColor(Camera, RGB(245, 222, 179))
  MoveCamera(Camera, 5, 5, 10)
  CameraLookAt(Camera, 0, 0, 0)
  
  CreateLight(#PB_Any, RGB(255, 255, 255), 0, 10, 10)
  
  Entity0 = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 2)), #PB_Material_None, 0, 2, 0)
  Entity1 = CreateEntity(#PB_Any, MeshID(CreateCube(#PB_Any, 2)), #PB_Material_None, 0, -2, 0)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  BindEvent(#PB_Event_SizeWindow, @Resize())
  
  Render()
EndProcedure

Procedure Render()
  Repeat
    Repeat
      Event = WindowEvent()
    Until Event = 0
    
    RenderWorld()
    FlipBuffers()
    
    If ExamineKeyboard()
      If KeyboardReleased(#PB_Key_Escape)
        Exit()
      EndIf   
    EndIf
    
    RotateEntity(Entity0, 0.5, 0.5, 0.5, #PB_Relative)
    RotateEntity(Entity1, 0.3, 0.3, 0.3, #PB_Relative)
    
    ClearScreen(RGB(128, 128, 128))      
  ForEver
EndProcedure

Procedure Resize()
  ;Protected sw = ScreenWidth()
  ;Protected sh = ScreenHeight()

  Protected sw = WindowWidth(#mf, #PB_Window_InnerCoordinate)
  Protected sh = WindowHeight(#mf, #PB_Window_InnerCoordinate)
  
  CameraProjectionMode(Camera, #PB_Camera_Perspective, sw, sh) 
EndProcedure

Procedure Exit()
  End  
EndProcedure
Dans la procédure Resize(), Les fonctionnalités ScreenWidth() ou ScreenHeight() renvoient toujours les mêmes valeurs.

Re: Problème correction perspective 3D

Publié : mar. 22/déc./2020 16:51
par falsam
Une solution serait d'utiliser la fonction ResizeCamera() pour corriger la perspective 3D.

Remplacer la procédure Resize() du code précédent par

Code : Tout sélectionner

Procedure Resize()
  ;Protected sw = ScreenWidth()
  ;Protected sh = ScreenHeight()

  Protected sw = WindowWidth(#mf, #PB_Window_InnerCoordinate)
  Protected sh = WindowHeight(#mf, #PB_Window_InnerCoordinate)
  
  ; Not work
  ; CameraProjectionMode(Camera, #PB_Camera_Perspective, sw, sh) 
    
  ResizeCamera(Camera, 0, 0, 100 - (1 - sw/ww), 100 - (1 - sh/wh))
EndProcedure