Fehler bei der Positionierung?



  • Bis jetzt nehme ich ein Meshobjekt und lege es in der Struktur CustomVertex.PositionNormalColored ab. hier verändere ich die X,Y und Z Werte. dies funktioniert einwandfrei. Sobald ich aber Nx, Ny oder Nz verändere, sehe ich keine rotation um die demensprechende Achse. habe ich was vergessen zu includieren?

    Hier der Code der nicht funktioniert :

    for (int y = 1; y < 4; y++) 
                    {
                        VertexFormats format = VertexFormats.PositionNormal | VertexFormats.Diffuse;
    
                        Mesh newMesh = tubeMesh.Clone(MeshFlags.Managed, format, device);
    
                        CustomVertex.PositionNormalColored[] data = (CustomVertex.PositionNormalColored[])newMesh.VertexBuffer.Lock(0, typeof(CustomVertex.PositionNormalColored), LockFlags.None, tubeMesh.NumberVertices);
    
                        for (int i = 0; i < data.Length; i++)
                        {
    //                        if ( i % 5 == 0 )
    //                            data[i].Color = Color.Blue.ToArgb();
    
                            data[i].Nx += 0;
                            data[i].Ny += 1;
                            data[i].Nz += 0;
    
                            data[i].X += meshLocations[boxcounter].X;
                            data[i].Y += meshLocations[boxcounter].Y;
                            data[i].Z += meshLocations[boxcounter].Z;
    
                        }
    
                        newMesh.VertexBuffer.Unlock();
    
                        //tubeMesh = null;
                        mesharray[counter] = newMesh;
    
                        GraphicsStream vertexData =
                            mesharray[counter].VertexBuffer.Lock(0, 0, LockFlags.ReadOnly);
                        VertexBufferDescription description =
                        mesharray[counter].VertexBuffer.Description;
    
                        Geometry.ComputeBoundingBox(vertexData,
                        mesharray[counter].NumberVertices, description.VertexFormat,
                        out meshBoundingBoxMinValues[boxcounter],
                        out meshBoundingBoxMaxValues[boxcounter]);
    
                        mesharray[counter].VertexBuffer.Unlock();
    
                        boxcounter++;
                        counter++;
                    }
    

    Wäre um jeden tipp dankbar...

    Gruss Trider



  • Weißt du überhaupt, wofür ein Normalenvektor da ist?
    Sicherlich nicht, um irgendwas zu rotieren.

    Positionieren, Drehen, Skalieren etc. tut man normalerweise auch ganz einfach mit SetTransform.



  • ich weis das ich mit transform.world das ganze einfacher haben kann. ist aber leider nicht möglich in meinem fall. deswegen positionier ich den mesh mit dieser methode was bisher auch gut funktioniert. Ich schaffe es nur nicht ihn zu kippen, sprich also rotation um eine achse. Ist Nx, Ny und Nz nicht dafür da? zumindest steht das so in der MSDN.

    Gruss Trider



  • das is ein recht umständlicher weg, aber es funktioniert. Das einzigste problem ist das die position der objekte hierbei verändert wird :

    Matrix rotation_m = Matrix.Identity;
    rotation_m.RotateX( Geometry.DegreeToRadian( 45 ) );
    
    data[i].X += meshLocations[boxcounter].X;
    data[i].Y += meshLocations[boxcounter].Y;
    data[i].Z += meshLocations[boxcounter].Z;
    
    Vector3 v_temp = new Vector3(data[i].X, data[i].Y, data[i].Z);
    v_temp.TransformNormal(rotation_m);
    
    data[i].X = v_temp.X;
    data[i].Y = v_temp.Y;
    data[i].Z = v_temp.Z;
    

    gibt es nen einfacheren weg oder vielleicht eine andere reihenfolge?



  • Das einzigste problem ist das die position der objekte hierbei verändert wird

    erst rotieren, dann verschieben.
    oder pack deine translation gleich mit in die matrix.
    und mit 'ner vernuenftigen matrixklasse saehe der code auch weniger kryptisch aus.



  • Trider schrieb:

    Ich schaffe es nur nicht ihn zu kippen, sprich also rotation um eine achse. Ist Nx, Ny und Nz nicht dafür da? zumindest steht das so in der MSDN.

    Ganz sicher steht das nicht in der MSDN, weil es Unfug ist!



  • ich finde den gedankengang eigentlich recht amuesant:
    "wenn man die ausrichtung der objektoberflaeche dreht, muesste sich das objekt selbst ja mitdrehen"
    😃



  • @Trider: der Normalenvektor sagt aus, wo "oben" ist für den Vertex mal vereinfacht ausgedrückt. Das wird für die Lichtberechnung benötigt und hat garnix mit der Rotation zu tun. Die Rotation hat nur Auswirkungen auf den Normalenvektor.
    Und der sollte im Normalfall die Länge 1 haben, also ist aufaddieren von irgendwelchen Zahlen da auch nicht sehr zuträglich 🙂



  • mein problem hat sich gelöst vielen dank.

    @TomasRiker jo da hab ich mich vertan 🙂 denke das war eher wunschdenken das es auf diese weise gehen würde hehe

    trotzdem dank, hab auf jeden fall die Lösung gefunden...

    Gruss Trider


Anmelden zum Antworten