Ist es möglich drei Positionen nur mit Matrix-Transformation frei zu positionieren?


  • Gesperrt

    Hallo,

    bei einer Linie mit Linienbreite (einem Rechteck) fand ich eine Lösung.
    Berechnung der Matrix:

    mat4 GetTransform(const vec3& p0, const vec3& p1, float width)
    {
    	auto dirvec = p1 - p0;
    	auto length = glm::length(dirvec);
    	auto angle = glm::angle(vec3(1.f, 0.f, 0.f), glm::normalize(dirvec));
    
    	auto translated = glm::translate(mat4(1.f), p0);
    	auto rotated = glm::rotate(translated, angle, vec3(0, 0, 1.f)); 
    	auto scaled = glm::scale(rotated, vec3(length, width, 1.f));
    
    	return scaled;
    }
    

    Also die Funktion ist noch nicht fertig geschrieben bzw. ist noch provisorisch.

    Wären es nur zwei Positionen und kein Rechteck, könnte ich glaube ich glm::rotate() sparen, wenn ich die zwei Punkte vec2(0.f, 0.f)und vec2(1.f, 1.f)im Vertex Buffer hätte.

    War dies jetzt eine Zeit lang mit einem Dreieck am versuchen, aber der dritte Punkt lässt sich nicht immer positionieren. Frage mich ob es überhaupt möglich ist?

    Edit: Wenn ich mir die Frage selbst nochmals stelle und auf Polygone erweitere, kann ich mir keine Möglichkeit mehr vorstellen, wie dies möglich sein sollte. 😬



  • Was heißt für dich "frei positionieren".

    Ich habe von Spieleentwicklung zwar keine Ahnung, habe mich aber mehrere Jahre mit verschiedenen Matrixtransformationen rumgeschlagen. Du kannst eine Transformation natürlich auf beliebige Punkte anwenden. Du transformierst dann halt jeden Punkt wie durch die Matrix beschrieben.

    Vielleicht hilft dir das Stichwort "Affine Abbildung" (https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations) weiter.



  • @titan99_ sagte in Ist es möglich drei Positionen nur mit Matrix-Transformation frei zu positionieren?:

    Edit: Wenn ich mir die Frage selbst nochmals stelle und auf Polygone erweitere, kann ich mir keine Möglichkeit mehr vorstellen, wie dies möglich sein sollte.

    Ich sehe nicht warum das nicht möglich sein sollte. Die drei untransformierten Punkte bekommen die Koordinaten:

    p1 = (1, 0, 0)
    p2 = (0, 1, 0)
    p3 = (0, 0, 1)
    

    Dann brauchst du bloss eine 3x3 Matrix um diese drei Punkte frei zu positionieren:

         | x1 x2 x3 |
    m =  | y1 y2 y3 |
         | z1 z2 z3 |
    

    Die Achsen haben nach der Transformation natürlich keine rechten Winkel mehr und sind auch nicht mehr gleich skaliert (ausser natürlich es ergibt sich zufällig so). Was aber nicht gefordert war.


  • Gesperrt

    Hey, echt vielen Dank für die Antworten und Lösung.

    Habe jetzt glm::mat4 entsprechend initialisiert. (Edit: bei der Eingabe transponiert)

    m=(x1y1z10x2y2z20x3y3z300001) m= \begin{pmatrix} x_1 & y_1 & z_1 & 0 \\ x_2 & y_2 & z_2 & 0 \\ x_3 & y_3 & z_3 & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}\

    und beim Code unten zuerst noch transponiert (row und col ist glaube ich noch verwechselt und ich weiss (noch) nicht wie der Konstruktor die Vektoren übernimmt). Die derzeitige Memberfunktion sieht jetzt so aus:

    mat4 Triangle::GetTransform(const vec3& p0, const vec3& p1, const vec3& p2)
    {
    	glm::vec4 col0(p0.x, p1.x, p2.x, 0.f);
    	glm::vec4 col1(p0.y, p1.y, p2.y, 0.f);
    	glm::vec4 col2(p0.z, p1.z, p2.z, 0.f);
    	glm::vec4 col3(0.f, 0.f, 0.f, 1.f);
    
    	glm::mat4 matrix(col0, col1, col2, col3);
    	glm::mat4 transposedmatrix = glm::transpose(matrix);
    
    	return transposedmatrix ;
    }
    

    Screenshot Rotiert habe ich es auch noch kurz und die Flächennormale sollte demnach parallel zur z-Achse sein.

    @schlangenmensch sagte in Ist es möglich drei Positionen nur mit Matrix-Transformation frei zu positionieren?:

    Ich habe von Spieleentwicklung zwar keine Ahnung, habe mich aber mehrere Jahre mit verschiedenen Matrixtransformationen rumgeschlagen.

    Das Framework soll nicht auf Spiele beschränkt sein. Es ist noch ein Screenshot, weil ich "RenderToTexture" mit mehr Pixeln für den Viewport noch nicht implementiert habe. Ich lerne autodidaktisch.

    @hustbaer sagte in Ist es möglich drei Positionen nur mit Matrix-Transformation frei zu positionieren?:

    Ich sehe nicht warum das nicht möglich sein sollte. Die drei untransformierten Punkte bekommen die Koordinaten:

    Habe die Matrixtransformation noch nicht (detailliert) nachvollzogen. Kannte zuvor für "model" nur translate, rotate, scale und shear. Und die von physx und bulletphysics.

    Nochmals vielen Dank. Finde es toll, dass man im Forum kompetente Antworten bekommt, die den eigenen Stand erweitern.



  • Man braucht nur eine Matrix.


Anmelden zum Antworten