World3DModel Modell zum plazieren anzeigen ?

  • Ich komme aus der .NET ecke und habe mit Java (+ RW api) nicht wirklich viel gemacht.


    nu meine Frage
    Ist es möglich ein eigenes Modell (World3DModel) in eine Werkbank oder "in der Hand" (zwecks platzieren) anzeigen zu lassen ?


    hier geht es lang zum [Plugin] UserObjectLoader

    Es wird alles gut :) früher oder später :D meistens später :nerd: ... ich wandle Kaffee in Quelltext um.

    Und besucht die Rising World Wiki

    Edited once, last by Kryssi_79 ().

  • Ist es möglich ein eigenes Modell (World3DModel) in eine Werkbank oder "in der Hand" (zwecks platzieren) anzeigen zu lassen ?

    Also direkt in der Hand anzeigen lassen (so wie bspw. die Spitzhacke) kannst du das Modell nur bedingt, du könntest es einfach vor den Spieler packen und mitbewegen, aber das ist eher eine suboptimale Lösung ^^ Wenn es allerdings darum geht, für das Modell eine "Platziervorschau" zu haben (so wie bspw. die derzeitigen Objekte, Blöcke, Bauelemente etc), dann ist das auf jeden Fall möglich. Wie im von @lenko zitierten Post kannst du dafür die raycast() Methode des Spielers verwenden: Bspw. mit einem Timer im kleinen Intervall (nicht zu klein [wegen der Performance], aber auch nicht zu groß [sonst wirds zu träge]) die raycast() Methode aufrufen und den Kollisionspunkt ermitteln. Das Modell anschließend einfach immer mit der moveTo() Methode zum Kollisionspunkt hinbewegen ;)

  • danke schön für die Antworten :-):thumbsup: ...
    @red51 Eine "Platziervorschau" wie bei Blöcke ist am besten :thumbup:



    Muss mir noch überlegen / herausfinden wie ich signalisieren kann, dass (und welches) Objekt gerade bewegt wird.


    Ich glaube an Alpha oder Beleuchtung für bestimmte Objekte komme ich noch nicht ran

    Es wird alles gut :) früher oder später :D meistens später :nerd: ... ich wandle Kaffee in Quelltext um.

    Und besucht die Rising World Wiki

  • @red51
    Ich glaube möglich API Fehler gefunden zu haben:
    Code Ausschnitt:

    Java
    viewDir = player.getViewDirection();
    Vector3f playerPos = player.getPosition();
    Vector3f previewPos = playerPos.addLocal( (viewDir.getX()*3), (viewDir.getY()*3), (viewDir.getZ()*3) );
    float fDistance = previewPos.distance(playerPos);
    player.sendTextMessage( ""+ Math.round(fDistance) +" / " +fDistance );
    previewModel.moveTo(previewPos, 0.95f);

    1) Zeile 5: fDistance ist immer 0 ... sollte aber Abstand zw. previewPos und playerPos sein
    Zeile 6: Ausgabe 0 / 0.0
    2) Zeile 8: Wenn ich meine Maus nicht bewege fängt mein previewModel noch vorne zu springen und wieder zurück
    und wenn ich die Maus bewege follgt er wie erwartet



    Die Sache mit Kollision habe ich nicht umgesetzt.

    ... kannst du dafür die raycast() Methode des Spielers verwenden ...

    weil ich ermittle damit den Kollisionspunkt für das Kreuz und nicht für mein Objekt.

    Es wird alles gut :) früher oder später :D meistens später :nerd: ... ich wandle Kaffee in Quelltext um.

    Und besucht die Rising World Wiki

  • Vector3f previewPos = playerPos.addLocal( (viewDir.getX()*3), (viewDir.getY()*3), (viewDir.getZ()*3) );

    Das Problem ist, dass addLocal() den bestehenden Vektor verändert. Mit dieser Fkt werden nämlich die angegebenen Werte beim angegebenen Vektor hinzuaddiert und der gleiche Vektor zurückgegeben, d.h. du addierst in dem Fall die Werte bei playerPos hinzu und weist eine Referenz auf "playerPos" der Variable "previewPos" hinzu. Mit anderen Worten verweisen "previewPos" und "playerPos" dann auf dasselbe Objekt. Wir werden vll der Einfachheit halber zusätzlich noch add() (und analog dazu subtract(), mult() etc) mit dem nächsten Update einführen (welche dann direkt einen neuen Vektor erstellt und direkt mit diesem arbeitet).
    Als Lösung könntest du aber einen neuen Vektor erstellen:

    Java
    Vector3f playerPos = player.getPosition();
    Vector3f previewPos = new Vector3f(playerPos).addLocal((viewDir.getX()*3), (viewDir.getY()*3), (viewDir.getZ()*3));

    weil ich ermittle damit den Kollisionspunkt für das Kreuz und nicht für mein Objekt.

    Das ist richtig, die raycast() Methode führt die Kollisionsprüfung von der Spielerposition aus (oder eher gesagt von der Kameraposition). Grundsätzlich ist es schwierig, eine Kollisionsprüfung unabhängig vom Spieler durchzuführen, da serverseitig kein genaues Abbild der Welt vorhanden ist, d.h. es muss immer auf einen Spieler zurückgegriffen werden. Das ist zwar prinzipiell kein Problem, aber funktioniert natürlich nur, wenn der zu prüfende Bereich beim Spieler auch vorhanden/generiert ist (wenn also das Objekt nicht in der Nähe des Spielers ist würde das nicht funktionieren).
    Wenn es aber um das Platzieren von Objekten geht ist ein Raycast von der Spieler-/Kameraposition aus aber gar nicht verkehrt (so würdest du die Koordinaten des Punktes ermitteln, welchen der Spieler gerade betrachtet, und könntest die Vorschau dort platzieren) ;)

  • danke schön für deine Antwort und Tipps :-)
    hab es geändert und es funktioniert :thumbsup:


    Kaum macht man´s richtig schon funktioniert :thumbup:


    fDistance ist wie erwartet 3
    und Modell zappelt nicht mehr

    Es wird alles gut :) früher oder später :D meistens später :nerd: ... ich wandle Kaffee in Quelltext um.

    Und besucht die Rising World Wiki

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!