Har problem med zoomfunktionen i mitt projekt. Projektet är en app, fönsterstorlek 1920x1080 och ett scrollbart "spelfält" på 3840x2560 där man ska kunna zooma in (1x-2x). Detta funkar tills jag försöker scrolla till kanterna när jag har inzoomat då placeras musmarkören fel. Scrollningen i sig är inte heller helt korrekt.
Alltså,
när man zoomar in så hamnar musmarkörens koordinater fel så de måste modifieras baserat på zoom värdet. Detta görs med följande pseudokod.
Always
Mouse : Set X position to Xcamera + ( Xmouse - Xcamera ) / zoom
Mouse : Set Y position to Ycamera + ( Ymouse - Ycamera ) / zoom
zoom = variabel 1.0 (ingen zoom) till 2.0 (inzoomat x2)
XYcamera = skärmens mittpunkt.
Så långt funkar allt som det ska, man kan zooma in och ut och musen hänger med.
Men nu blev det problem när jag ville scrolla/zooma in till kanterna. Jag "löste" (mja) det problemet med följande kod.
if Xcamera < 960
Set "ZoomX" to 0.5 - ( ( ( 960 - Xcamera ) * 1.0 ) / 1000 )
if Xcamera > 2880
Set "ZoomX" to 0.5 + ( ( ( 2880 - Xcamera ) * 1.0 ) / 1000 * ( -1 ) )
if Ycamera < 540
Set "ZoomY" to 0.5 - ( ( ( 540 - Ycamera ) * 1.0 ) / 1000 )
if Ycamera > 2020
Set "ZoomY" to 0.5 + ( ( ( 2020 - Ycamera ) * 1.0 ) / 1000 * ( -1 ) )
960/2880 540/2020 = X/Y kordinater där mitten av skärmen "når kanten", ergo man ser kanten och det går inte att scrolla längre. (baserat på fönsterstorleken 1920x1080 och det scrollbara "spelfältet" på 3840x2560)
ZoomX = variabel på zoom shadern som anger position där zoom utgår ifrån. 0.5 är alltså mitten och default value, minskar man talet = mer åt vänster och ökar mer åt höger.
ZoomY = samma som ovan fast Y axeln då. minskar = uppåt, ökar = neråt.
Min mattekunskap är hemsk och formlerna här känns inte rätt, det borde gå att simplifiera och göra mer korrekt. Till att börja med vore det förmodligen bättre att använda Absolute() värden istället för * (-1) ?
Hur som, så beter det sig som jag vill på X axeln då maxvärden på ZoomX blir -0.5 och 1.5 medans på Y axeln scrollas det inte lika lång. maxvärden på ZoomY blir -0.04 och 1.04 dvs en decimal mindre vilket jag inte riktigt förstår. Det stora problemet är dock att musmarkören hamnar fel åter igen och jag lyckas inte hitta formeln för att korrigera.
Gissar att man bör ta med camera avstånd till scrollpunkten så nått sånt här:
Mouse : Set X position to Xcamera **avstånd till 960** + ( Xmouse - (Xcamera + ***avstånd till 960***) ***+-/* med ZoomX värdet*** ?
Skulle eventuellt kunna posta en demonstrerande *.exe där koden körs men det känns som att matten borde vara ganska enkel så nån kanske har en idé?