SAT Problem



  • also du meinst das, oder?
    http://www.wynx.de/ButcherC/EuEHNF.htm

    Eine Viereckige Ebene, die Senkrecht zur eigentlichen fläche des Polyeders ist?



  • Hätte ich sie posten sollen?

    float ebenengleichung(Vector n,Vector q){
    	return n*q;
    }
    inline float operator * (const Vector &V)const	{return (x*V.x) + (y*V.y); }
    

  • Mod

    ich habe so meine zweifel dass das irgendwas mit ebenengleichung zu tun hat.

    versuch von einem dreieck, also aus 3 vertices im 3D raum (also x y und z) die ebene zu errechnen.



  • ich google jetzt schon seit einer ewigkeit.
    könntest du mir einen kleinen Tipp geben?



  • ich glaub ich habs fast,nur weiss ich nicht was hier s und t bedeuten.
    http://home.arcor.de/penneweb/Abi2004/Eb3Pkt.html



  • ich bin mir nicht sicher, aber meinst du das?:

    inline Vector operator - (const Vector &V)	const	{	return Vector(x-V.x, y-V.y); }
    inline Vector operator * (float  s)			const	{	return Vector(x*s, y*s); }
    
    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){
    
    vector retval;
    retval=a+r*(b-a)+s*(c-a);
    
    }
    

    Tut mir leid, dass ich so langsam bin, ich könnte den Teil von mir, der früher in Geometrie gepennt hat, den Schädel einschlagen.


  • Mod

    alterbro schrieb:

    ich google jetzt schon seit einer ewigkeit.
    könntest du mir einen kleinen Tipp geben?

    z.b. bei google "plane equation triangle"


  • Mod

    alterbro schrieb:

    ich bin mir nicht sicher, aber meinst du das?

    ebenengleichung ohne z? eine ebene existiert doch erst in 3d 😉

    Tut mir leid, dass ich so langsam bin, ich könnte den Teil von mir, der früher in Geometrie gepennt hat, den Schädel einschlagen.

    statt euch zu kloppen, solltet ihr kolaborieren, wenn du es erstmal kannst, werden beide teile deines schaedels lachen wie einfach es doch ist 😉

    wenn ich es nur vorsagen wuerde, waere ich jedoch nur kumpel von der schlaefrigen seite 😉



  • inline Vector operator - (const Vector &V) const { return Vector(x-V.x, y-V.y,z-V.z); }
    inline Vector operator * (float s) const { return Vector(x*s, y*s,z*s); }

    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){

    vector retval;
    retval=a+r*(b-a)+s*(c-a);

    }
    sorry, die Inlines waren aus versehen aus dem alten SAT2d Projekt,jetzt richtig?

    statt euch zu kloppen, solltet ihr kolaborieren, wenn du es erstmal kannst, werden beide teile deines schaedels lachen wie einfach es doch ist

    wollen wir das beste hoffen

    wenn ich es nur vorsagen wuerde, waere ich jedoch nur kumpel von der schlaefrigen seite

    Ohne Schleimen zu wollen...
    Es stimmt, ich hätts vermutlich nur gecopypastet, und mich dann darüber aufgeregt, weshalb es nicht funktioniert.
    Kann auch sein das ich das nie in der Schule gelernt hab.



  • ist es jetzt richtig?:

    inline Vector operator - (const Vector &V) const { return Vector(x-V.x, y-V.y,z-V.z); }
    inline Vector operator * (float s) const { return Vector(x*s, y*s,z*s); }
    
    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){
    
    vector retval;
    retval=a+r*(b-a)+s*(c-a);
    
    }
    

  • Mod

    das kompiliert?

    naja, probiere es aus, alle 3 punkte die du angibst sollten einen abstand von 0 zur ebene haben (die funktion brauchst du auch fuer den 3d SAT test).



  • ok, ich habe keine Ahnung wie ich das rausfinden soll, oder wie ich rausfinden soll, wie ich das rausfinden soll.

    ABer ich google mal.



  • was setzt ich nun für s und r ein?


  • Mod

    so sieht die declaration aus

    Plane ebengleichung(Vector Vertex0,Vector Vertex1,Vector Vertex2);
    

    so sieht die test funktions declaration aus

    float DistanzToPlane(Plane Ebene,Vector Punkt);
    

    so testest du ob es stimmt

    Plane TrianglePlane((Vector Vertex0,Vector Vertex1,Vector Vertex2)
    {
      const Plane P = ebengleichung(Vertex0,Vertex1,Vertex2);
      assert(fabsf(DistanzToPlane(P,Vertex0))<FLT_EPSILON);
      assert(fabsf(DistanzToPlane(P,Vertex1))<FLT_EPSILON);
      assert(fabsf(DistanzToPlane(P,Vertex2))<FLT_EPSILON);
      return P;
    }
    

    den rest musst du wohl mit deiner schlaefrigen haelfte und google ausmachen 🙂

    uebrigens, nur keine angst den editier button zu klicken, dafuer ist er da 😉



  • ...



  • ich glaub jjetzt hab ichs:

    class ebenengleichung{
    
    		Vector3d first;
    		Vector3d second;
    		Vector3d third;
    
    		char *getasstring(){
    			char string[128];
    			sprintf_s(string,"x=(%f%f%f)+s(%f%f%f)+r(%f%f%f)",first.x,first.y,first.z,second.x,second.y,second.z,third.x,third.y,third.z);
    
    return string;
    }
    
    		ebenengleichung(Vector3d A,Vector3d B,Vector3d C){
    
    			this->first=A;
    			this->second=B-A;
    			this->third=C-A;
    		}
    };
    


  • Ich hab mich ein wenig schlau gemacht.

    Muss ich etwa immer zuerst mit den 3 Punkten eine Parametergleichung erstellen, aus direser dann eine Koordinatengleichung, und aus der Koordinatengleichung eine hessische Normalform?

    Ist das für den Computer nicht etwas aufwendig?


  • Mod

    sollte nicht ueberhaupt erstmal etwas laufen, bevor du dir gedanken ueber performance machst?

    ich hatte dir gepostet wie du ueberpruefen kannst ob es funzt (die funktion mit den 3 asserts), wenn das geht, sehen wir weiter, bis dahin, sei fleissig 😉



  • also ich hab mich jetzt selbst ein weing umgesehen, und schon mal das Kreuzprodukt verwendet, um die EBenen-Normale zu finden:

    Getcross(PunktB-PunktA,PunktC-PunktA);

    Mein SAT Algorithmus (DIY) funktionier nun so:

    Für jedes Polyeder

    Ich habe für jede seite wie oben die Normale.
    Dann habe ich die Grösste und Kleinste Projektswerte für jedes Polyeder gesucht.
    Dann habe ich sie auf überlappung getgetestet.

    Nun erkennt der Algorithmus zwar jede Kollision, aber sie zeigt auch manchmal Kollisionen an, wenn keine existiieren, meist in unmittelbarer Nähe beide Polyedern.

    Hab ich was vergessen zu testen?


Anmelden zum Antworten