Aktuelle Zeit: 16.06.2019 16:48

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [gelöst] OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 01.06.2019 00:15 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
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:
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


Zuletzt geändert von Mijikai am 09.06.2019 23:50, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 01.06.2019 12:38 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [Hilfe] OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 09.06.2019 06:25 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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:

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 09.06.2019 23:51 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Habs hinbekommen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 10.06.2019 22:28 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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 ...

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] OpenGL - Maus Koordinaten umrechnen!
BeitragVerfasst: 11.06.2019 14:56 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye