# opengl von scale in breite und höhe konvertieren



## coolian (6. Okt 2019)

oder einen anderen weg zu gucken ob maus in bestimmtem bereich drinnen ist lwjgl 2


----------



## httpdigest (6. Okt 2019)

Die Art, wie du die Frage gestellt hast, lässt noch etwas auf Unkenntnis des Koordinatensystems von OpenGL und der Transformationen schließen. Bitte habe einen Blick auf:
- https://learnopengl.com/Getting-started/Coordinate-Systems
- http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho
- http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

Dann wird alles klarer. Die konkrete Antwort auf deine Frage setzt jetzt voraus, dass du genauer beschreibst, was du mit "Bereich" meinst. Wenn du einen Pixelbereich (also Koordinaten ausgedrückt in Pixeln) im Viewport meinst, dann ist die Lösung ja ein einfacher "point in rectangle" Test.
Wenn du mit dem "Bereich" einen Bereich ausgedrückt in einem anderen Koordinatensystem meinst, dann musst du dieses Koordinatensystem einfach durch eine affine Transformation in das Pixelkoordinatensystem (window coordinate system) transformieren. Hier kommt es dann wieder darauf an, von welchem Koordinatensystem du genau redest.


----------



## coolian (6. Okt 2019)

mit scale ist die scale die für transformations matrixe nötig ist gemeint und im grunde ist es point in rectangle allerdings hab ich keine breite und höhe sondern eben nur scale fällt mir tatsächlich jetzt auch auf wie dumm ich meine frage gestellt hab schiebs aber auf 4 uhr morgens denn da hab ich die frage erstellt


----------



## httpdigest (6. Okt 2019)

OpenGL selbst verwendet nur den Clip Space, in dem die Koordinaten (x/w, y/w, z/w) innerhalb des Würfels [-1, -1, -1]..[+1, +1, +1] liegen. Wenn du also keine perspektivische Projektion verwendest, dann brauchst du lediglich mit einem Intervallmapping das Intervall [-1, -1]..[+1, +1] auf das deines Viewports [0, 0]..[width, height] zu mappen und dann deine Clip Space Koordinaten (die in diesem Fall auch gleichzeitig "Normalized Device Coordinates" (NDC) sind) zu transformieren.
Wenn du jetzt zusätzlich noch weitere Transformationen vor den Clip Space einbaust, die dann dein eigenes Koordinatensystem in den Clip Space transformieren, dann transformiere deine Vertices/Positionen zusätzlich zuerst mit dieser Transformationsmatrix.


----------



## coolian (6. Okt 2019)

so ungefähr dann brauch ich aber w hab aber kein w und weiß auch nicht woher ich w nehmen soll


----------



## httpdigest (6. Okt 2019)

Nenne doch mal bitte, was du ganz genau gegeben hast und was dein Ziel ist.
Also z.B.:
  Gegeben folgende Transformationsmatrix (4x4 Matrix hier nennen), und folgender Viewport (x, y, w, h des Viewports nennen)
  Gesucht: Window Space Koordinaten eines Punktes, wenn es durch OpenGL mit dieser Matrix transformiert wird
Darauf aufbauend kannst du dann z.B. vier Punkte transformieren und daraus das bounding rectangle im Window Space bilden und da dann dein Point in Rectangle test machen.


----------



## coolian (6. Okt 2019)

gegebn sind position scale textur font und text scale und position wird später benutzt um eine transformations matrix zu erstellen zu der ich aber kein zugriff habe wo ich den bräuchte  scale uns position sind Vector2f textur ist texture id font ist eine font klasse und text ist ein string und um zu testen ob die maus in dem bereich welche von scale größer b.z kleiner gemacht wird und halt eine position hat ein rechteck halt aber hab halt keine width height nur scale


----------



## httpdigest (6. Okt 2019)

Okay, also du verwendest eine bisher nicht näher genannte Library, um Text zu rendern. LWJGL 2 (wie in deinem ersten Post genannt) alleine kann keinen Text rendern. Und diese unbekannte Library verwendet ein bisher unbekanntes bzw. nicht näher genanntes Koordinatensystem, um an einer "Position" mit einer in einem unbekannten Koordinatensystem ausgedrückten Größe einen Text mit unbekannter Weite und unbekanntem Umbruch zu rendern. Und jetzt bietet diese Library einen Skalierungsfaktor an, der den Text auf unbekannte Weise größer macht bzw. skaliert. De fakh?!
Kurz: Du hast eigentlich überhaupt keine sinnvollen Informationen geliefert, um dir hier zu helfen.


----------



## coolian (6. Okt 2019)

es geht nicht um den text der sollte funktonieren und ist relitv unötig das ich den gennannt hab  aber der konstruktor von meiner button klasse nimmt halt einen string sondern um diese klassen:

```
package guiElements;

import org.lwjgl.util.vector.Vector2f;

import fontMeshCreator.FontType;
import guis.GuiTexture;

public class Button extends GuiTexture{
    
    private FontType font;
    private String text;
    
    private Vector2f position;
    private Vector2f scale;
    
    public Button(int texture, Vector2f position, Vector2f scale, FontType font, String text) {
        super(texture, (Vector2f)position.normalise(), scale);
        
        this.font = font;
        this.text = text;
        this.position = position;
        this.scale = scale;
    }
    
    private static float normalize(float value, float min, float max) {
        float normalized = (value - min) / (max - min);
        return normalized;
    }
    
    public void checkMouse() {
        
    }
    
}





package guis;

import org.lwjgl.util.vector.Vector2f;

public class GuiTexture {
    
    private int texture;
    private Vector2f position;
    private Vector2f scale;
    
    public GuiTexture(int texture, Vector2f position, Vector2f scale) {
        this.texture = texture;
        this.position = position;
        this.scale = scale;
    }

    public int getTexture() {
        return texture;
    }

    public Vector2f getPosition() {
        return position;
    }

    public Vector2f getScale() {
        return scale;
    }
}






package guis;

import java.util.List;

import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import org.lwjgl.util.vector.Matrix4f;

import models.RawModel;
import renderEngine.Loader;
import toolbox.Maths;

public class GuiRenderer {
    
    private final RawModel quad;
    private GuiShader shader;
    
    public GuiRenderer(Loader loader) {
        float [] positions = {-1, 1, -1, -1, 1, 1, 1, -1};
        quad =loader.loadToVAO(positions);
        shader = new GuiShader();
    }
    
    public void render(List<GuiTexture> guis) {
        shader.start();
        GL30.glBindVertexArray(quad.getVaoID());
        GL20.glEnableVertexAttribArray(0);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glDisable(GL11.GL_DEPTH_TEST);
        for(GuiTexture gui : guis) {
            GL13.glActiveTexture(GL13.GL_TEXTURE0);
            GL11.glBindTexture(GL11.GL_TEXTURE_2D, gui.getTexture());
            Matrix4f matrix = Maths.createTransformationMatrix(gui.getPosition(), gui.getScale());
            shader.loadTransformation(matrix);
            GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, quad.getVertexCount());
        }
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glDisable(GL11.GL_BLEND);
        GL20.glDisableVertexAttribArray(0);
        GL30.glBindVertexArray(0);
        shader.stop();
    }
    
    public void cleanUp() {
        shader.cleanUp();
    }
    
}
```


----------



## coolian (6. Okt 2019)

bin in 3 bis 4 stunden wieder da muss jetzt aber erstmal wochenblatt austragen


----------



## mihe7 (6. Okt 2019)

coolian hat gesagt.:


> bin in 3 bis 4 stunden wieder da muss jetzt aber erstmal wochenblatt austragen


Ach, Du bist das. Wenn ich Dich erwische


----------



## coolian (6. Okt 2019)

bin wieder da und immer noch nichts hilfreiches


----------



## coolian (6. Okt 2019)

mihe7 hat gesagt.:


> Ach, Du bist das. Wenn ich Dich erwische


? was bin ich warum was hab ich getan


----------



## Meniskusschaden (6. Okt 2019)

coolian hat gesagt.:


> ? was bin ich warum was hab ich getan


Wahrscheinlich hat ihm jemand am letzten starken Regentag eine unerwünschte Zeitung in den Briefkasten gestopft, die dann sämtliche darin befindliche Post inklusive des Schecks mit der Jahresgratifikation vollkommen durchweicht und unwiderbringlich  zerstört hat.


----------



## coolian (6. Okt 2019)

Meniskusschaden hat gesagt.:


> Wahrscheinlich hat ihm jemand am letzten starken Regentag eine unerwünschte Zeitung in den Briefkasten gestopft, die dann sämtliche darin befindliche Post inklusive des Schecks mit der Jahresgratifikation vollkommen durchweicht und unwiderbringlich  zerstört hat.


kann sein ich wars aber höchst warscheinlich nicht


----------



## mihe7 (6. Okt 2019)

Meniskusschaden hat gesagt.:


> Wahrscheinlich hat ihm jemand am letzten starken Regentag eine unerwünschte Zeitung in den Briefkasten gestopft, die dann sämtliche darin befindliche Post inklusive des Schecks mit der Jahresgratifikation vollkommen durchweicht und unwiderbringlich  zerstört hat.


Da spricht jemand aus Erfahrung - die Frage ist nur... auf welcher Seite des Briefkastens? 



coolian hat gesagt.:


> kann sein ich wars aber höchst warscheinlich nicht


Pfff... erst Wochenblatt austragen und dann alles abstreiten. Unfassbar.


----------



## coolian (6. Okt 2019)

mihe7 hat gesagt.:


> Da spricht jemand aus Erfahrung - die Frage ist nur... auf welcher Seite des Briefkastens?
> 
> 
> Pfff... erst Wochenblatt austragen und dann alles abstreiten. Unfassbar.


ich streite nicht ab das ich wochen blatt austrage oder so allerdings trage ich nicht in ganz deutschland aus also außer du wohnst in helmsdorf war ich es nicht


----------



## httpdigest (6. Okt 2019)

coolian hat gesagt.:


> bin wieder da und immer noch nichts hilfreiches


Vielleicht hilft ja wieder etwas Rubber Duck Debugging. Schreib hier einfach weiter, welche Gedanken/Ideen du zur Problemlösung entwickelst, und was nicht klappt, bis es dann hoffentlich klappt. Viel Spaß!


----------



## httpdigest (6. Okt 2019)

coolian hat gesagt.:


> außer du wohnst in helmsdorf


Genau da wohnt er! 
Junge... er zieht dich doch nur auf.  Da muss man mit Humor gegen halten.


----------



## mihe7 (6. Okt 2019)

httpdigest hat gesagt.:


> Genau da wohnt er!


Da und nur da  

@coolian sorry, aber der Vorlage mit dem Wochenblatt konnte ich nicht widerstehen.


----------



## coolian (7. Okt 2019)

nach rum probieren und debuggen hab ich rausgefunden das  wenn ich in scale als x koordinate 100 geb und dies dann normalisiere mit der funktion die in der vector klasse ist das x falsch ist nämlich ist x 0.8944272 aber da von wo  das ausgeht ist der mittel punkt des bildschirms was heist das maximal 0,5 möglich ist ich muss also mal gucken ob ich meine eigene funktion nutzen kann


----------



## coolian (7. Okt 2019)

geil kann mir irgendjemend mal eine funktion geben die ein vector zwischen -0.5f und 0.5f normalisirt


----------



## httpdigest (7. Okt 2019)

Es ist unklar/ungenau, was du mit "einem Vektor zwischen -0.5 und 0.5" meinst.
Ein Skalar kann zwischen diesen beiden Werten sein, aber bei einem Vektor ist das mehrdeutig.
Meinst du damit jede einzelne Komponente dieses Vektors? Oder nur eine bestimmte Komponente? Oder meinst du damit die Länge (bzw. die euklid'sche Norm) dieses Vektors?
Wenn du nur eine Komponente meinst, die zwischen minimal -0.5 und maximal +0.5 sein kann und du möchtest diese Komponente von -0.5 auf -1.0 mappen und von +0.5 auf +1.0 (mit 0.0 -> 0.0), dann sieht die Rechnung denkbar einfach aus (7. Klasse Schule rationale Zahlen):
v' = v / 0.5


----------



## coolian (8. Okt 2019)

tut scale in matrix4f das objekt in alle richtungen größer machen oder nur in eine weil wenn eine dann ist 0,5 normalisieren nicht mehr richtig


----------

