Seite 1 von 1

[gelöst] OpenGL - Maus Koordinaten umrechnen!

Verfasst: 01.06.2019 00:15
von Mijikai
Nach vielen Turorials und Versuchen kann ich endlich die Fenstergröße
ändern ohne das Seitenverhältnis zu beeinflussen.

So weit so gut :)

Aber leider stimmen die Maus Koordinaten nicht mehr :(
Wie kann ich die errechnen?

:freak:

Der Cursor sollte genau in die Mitte des Kreuzes zeigen:
Bild

Rot ist der Viewport.

Beispiel Code (Problem in oglUpdateView() -> \window\mouse_factor\x & y):

Code: Alles auswählen

EnableExplicit

Structure VECTOR_STRUCT
  x.f
  y.f
EndStructure

Structure SCREEN_STRUCT
  hdc.i
  hrc.i
  width.i
  height.i
  view_width.i
  view_height.i
  aspect_ratio.f
  aspect_x.i
  aspect_y.i
EndStructure

Structure WINDOW_STRUCT
  id.i
  hwnd.i
  width.i
  height.i
  mouse.VECTOR_STRUCT
  mouse_factor.VECTOR_STRUCT
EndStructure

Structure OPENGL_STRUCT
  window.WINDOW_STRUCT
  screen.SCREEN_STRUCT
EndStructure

Global ogl.OPENGL_STRUCT

Procedure.i oglUpdateView()
  With ogl
    \screen\aspect_ratio = \screen\view_width / \screen\view_height
    
    \screen\height = \window\width / \screen\aspect_ratio
    \screen\width = \window\width
    
    If \screen\height > \window\height
      \screen\height = \window\height
      \screen\width = \window\height * \screen\aspect_ratio
    EndIf
    
    \screen\aspect_x = (\window\width - \screen\width) >> 1
    \screen\aspect_y = (\window\height - \screen\height) >> 1
    
    \window\mouse_factor\x = (\screen\view_width / \window\width);<------ WAS HIER TUN?
    \window\mouse_factor\y = (\screen\view_height / \window\height);<---- ???????????????

    glClear_(#GL_COLOR_BUFFER_BIT)
    glViewport_(\screen\aspect_x,\screen\aspect_y,\screen\width,\screen\height)
    glMatrixMode_(#GL_PROJECTION)
    glLoadIdentity_()
    glOrtho_(0,\screen\view_width,\screen\view_height,0,0,1)
    glMatrixMode_(#GL_MODELVIEW)           
    glLoadIdentity_()
    ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i oglCreate(Window.i,ViewWidth.i,ViewHeight.i)
  Protected pfd.PIXELFORMATDESCRIPTOR
  Protected pix.i
  With ogl
    \window\id = Window
    \window\hwnd = WindowID(Window)
    \screen\hdc = GetDC_(\window\hwnd)
    If \screen\hdc
      pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1
      pfd\dwFlags = #PFD_SUPPORT_OPENGL|#PFD_DOUBLEBUFFER|#PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 24
      pfd\cDepthBits = 8
      pfd\cAlphaBits = 8
      pix = ChoosePixelFormat_(\screen\hdc,@pfd)
      If pix
        If SetPixelFormat_(\screen\hdc,pix,@pfd)
          \screen\hrc = wglCreateContext_(\screen\hdc)
          If \screen\hrc
            If wglMakeCurrent_(\screen\hdc,\screen\hrc)
              \window\width = WindowWidth(Window)
              \window\height = WindowHeight(Window)
              \screen\view_width = ViewWidth
              \screen\view_height = ViewHeight
              ProcedureReturn #True
            EndIf
            wglDeleteContext_(\screen\hrc)
          EndIf
        EndIf
      EndIf
      ReleaseDC_(\window\hwnd,\screen\hdc)
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure.i oglTranslateMouse(*Mouse.VECTOR_STRUCT)
  With ogl
    \window\mouse\x = WindowMouseX(\window\id)
    \window\mouse\y = WindowMouseY(\window\id)
    If \window\mouse\x = -1 And \window\mouse\y = -1
      ProcedureReturn #False
    Else
      *Mouse\x = \window\mouse\x * \window\mouse_factor\x
      *Mouse\y = \window\mouse\y * \window\mouse_factor\y
      ProcedureReturn #True
    EndIf
  EndWith
EndProcedure 

Procedure.i oglRenderBegin()
  glClear_(#GL_COLOR_BUFFER_BIT)
  glLoadIdentity_()
  ProcedureReturn #Null
EndProcedure

Procedure.i oglBox(X.f,Y.f,Width.f,Height.f,Filled.i = #False,R.f = 1,G.f = 1,B.f = 1)
  glLineWidth_(2)
  If Filled
    glBegin_(#GL_POLYGON)
  Else
    glBegin_(#GL_LINE_LOOP)
  EndIf
  glColor3f_(R,G,B)
  glVertex2f_(X,Y)
  glVertex2f_(X + Width,Y)
  glVertex2f_(X + Width,Y + Height)
  glVertex2f_(X,Y + Height)
  glEnd_()
  ProcedureReturn #Null
EndProcedure

Procedure.i oglRenderEnd()
  With ogl
    wglSwapBuffers_(\screen\hdc)
    Sleep_(1);LAZY BAD SLEEP!
    ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i oglDestroy()
  With ogl
    If \screen\hrc
      wglMakeCurrent_(#Null,#Null)
      wglDeleteContext_(\screen\hrc)
    EndIf 
    If \screen\hdc
      ReleaseDC_(\window\hwnd,\screen\hdc)
    EndIf
  ClearStructure(@ogl,OPENGL_STRUCT)
  ProcedureReturn #Null
  EndWith
EndProcedure

Procedure.i DemoResize()
  Protected window.i
  With ogl
    window = EventWindow()
    \window\width = WindowWidth(window)
    \window\height = WindowHeight(window)
    oglUpdateView()
    ProcedureReturn #Null  
  EndWith  
EndProcedure

Procedure.i Demo(Width.i,Height.i)
  Protected window.i
  Protected window_flag.i
  Protected window_msg.i
  Protected mouse.VECTOR_STRUCT
  window_flag|#PB_Window_SystemMenu|#PB_Window_ScreenCentered
  window_flag|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
  window = OpenWindow(#PB_Any,#Null,#Null,Width,Height,"Demo",window_flag)
  If IsWindow(window)
    If oglCreate(window,320,200)
      oglUpdateView()
      WindowBounds(window,Width,Height,#PB_Ignore,#PB_Ignore)
      BindEvent(#PB_Event_SizeWindow,@DemoResize())
      Repeat
        Repeat
          window_msg = WindowEvent()
          Select window_msg
            Case #PB_Event_CloseWindow
              Break 2
          EndSelect
        Until window_msg = #Null 
        oglTranslateMouse(@mouse)
        oglRenderBegin()
        oglBox(0,0,320,200,#True,0.2,0,0)
        oglBox(mouse\x - 4,mouse\y - 1,7,1)
        oglBox(mouse\x - 1,mouse\y - 4,1,7)
        oglRenderEnd()
      ForEver
      oglDestroy()
    EndIf
    CloseWindow(window)
  EndIf
EndProcedure

Demo(1080,720)

End

Re: OpenGL - Maus Koordinaten umrechnen!

Verfasst: 01.06.2019 12:38
von Mijikai
Was ich noch erwähnen wollte -> eine der Maus Koordinaten ist jeweils korrekt!

Unter folgenden Bedingungen:

Wird das Fenster nur Horizontal verändert stimmt die Y Achse dagegen
stimmt die X Achse wenn das Fenster nur Vertikal verändert wird.

Re: [Hilfe] OpenGL - Maus Koordinaten umrechnen!

Verfasst: 09.06.2019 06:25
von diceman
Meinst du damit, daß der Mauszeiger nach jeder Bewegung immer ein wenig zu "schwimmen" scheint? Also der Zeiger ist bei mir schon weitesgehend im Zentrum des Fadenkreuzes, aber halt mal mehr mal weniger, nach jeder Bewegung schwimmt er ein wenig hin und her. :freak:

Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!

Verfasst: 09.06.2019 23:51
von Mijikai
Habs hinbekommen :)

Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!

Verfasst: 10.06.2019 22:28
von diceman
Freut mich. :) Habe, glaube ich, dein Anliegen total mißverstanden, also überhaupt zu erkennen wo das Problem lag.
Wo war der Fehler letztendlich?
Kurze Fassung reicht, werde es wahrscheinlich eh nicht kapieren :mrgreen: , aber grundsätzlich interessieren mich Probleme und wie man derer Herr wird ...

Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!

Verfasst: 11.06.2019 14:56
von Mijikai
Manchmal sieht man den Wald vor lauter Bäumen nicht <)
Wenn das Fenster gezogen (vergrößert) wird stimmt die Mausposition nicht mit dem angezeigten Fadenkreuz überein.
Hatte vergessen \screen\aspect_x u. y bei der Übersetzung der Maus mit zu berücksichtigen.