Problème correction perspective 3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Problème correction perspective 3D

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème correction perspective 3D

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre