opengl von scale in breite und höhe konvertieren

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.
 
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
 
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.
 
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.
 
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
 
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.
 
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:
Java:
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();
    }
    
}
 
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? 😛

kann sein ich wars aber höchst warscheinlich nicht
Pfff... erst Wochenblatt austragen und dann alles abstreiten. Unfassbar.
 
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
 
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
 
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
 
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
 

Neue Themen


Zurück
Oben