Brauche Hilfe bei AttachObject Rotation

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • So sollte es eigentlich aussehen:




    Wenn ich nun jedes Objekt zu einem anderen Objekt attache ( mit der gleichen Rotation ), dann gibts diesen Fehler:


    Ich denke, das passiert, da man bei AttachObject den Unterschied zwischen den Rotationen angeben muss, also zwischen Objekt 1 und Objekt 2.
    Doch ich habe dem Mittelobjekt (hier Objekt 2) die Rotation (0, 0, 0) gegeben, dann dürfte dort kein Unterschied sein, warum wird es dennoch falsch dargestellt?


    Code
    SampObject object = SampObject.create(1253, new Location(player.getLocation().getX() + 10.0f, player.getLocation().getY(), player.getLocation().getZ() + 0.85f), new Vector3D(0, 0, 0));		houseData.getObjects().forEach((houseDataObject) -> {			float x1 = houseDataObject.getLocation().getX()-normalX;			float y1 = houseDataObject.getLocation().getY()-normalY;			float z1 = houseDataObject.getLocation().getZ()-normalZ;			float rX1 = houseDataObject.getRotation().getX();			float rY1 = houseDataObject.getRotation().getY(); 			float rZ1 = houseDataObject.getRotation().getZ();			houseDataObject.attach(object, x1, y1, z1, rX1, rY1, rZ1, true); //TRUE für ObjektRotation (hier steht es für 1)		});


    MfG Alf21 und Danke :)

  • Die Rotation von den Objekten variiert, es kann sein das Rotation 0 das Objekt auf der Seite stehen lässt.
    Am besten legst du für jedes Objekt das du benutzt ein Offset an, der angibt wie das Objekt richtig stehen würde (z.B. -35, oder 70 das wird dann später bei der Rotation addiert / subtrahiert)

  • Danke schonmal 123marvin123 und IPrototypeI :)
    Aber wie soll ich das anlegen? Ich lade die Objekte dynamisch, das ist ein Haussystem. Das heißt ich habe Dateien, in denen Objekte angegeben sind, die ich dynamisch lade und so initialisiere, dann habe ich ja die Daten in einem Array. Platzieren, speichern und laden geht ja, nun will ich aber die Rotation noch angeben... Damit es benutzerfreundlich ist, habe ich den GUI von editObject genommen, nun muss ich aber halt die Rotationsänderung iwie angeben, wenn ich die Objekte so an einen anderen Ort platziere, muss ich das nicht. Das wundert mich nämlich und da es dynamisch ist: wie kann ich das dynamisch machen und wie berechne ich das ? :/

  • Danke schonmal 123marvin123 und IPrototypeI :)
    Aber wie soll ich das anlegen? Ich lade die Objekte dynamisch, das ist ein Haussystem. Das heißt ich habe Dateien, in denen Objekte angegeben sind, die ich dynamisch lade und so initialisiere, dann habe ich ja die Daten in einem Array. Platzieren, speichern und laden geht ja, nun will ich aber die Rotation noch angeben... Damit es benutzerfreundlich ist, habe ich den GUI von editObject genommen, nun muss ich aber halt die Rotationsänderung iwie angeben, wenn ich die Objekte so an einen anderen Ort platziere, muss ich das nicht. Das wundert mich nämlich und da es dynamisch ist: wie kann ich das dynamisch machen und wie berechne ich das ? :/



    Wenn das ein Hausbausystem ist , wieso attache du die Objekte an einem anderen, welcher sinn steckt dahinter ?
    Du kannst die Objekte doch ganz einfach an den jeweiligen abgelegten Koordinaten ablegen.


    Also zusätzliche Hilfe kann ich dir mein AttachObjectToVehicleEditor empfehlen besser gesagt diesen Codeschnipsel davon:


    public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz){
    state _ALS_:hooked;
    switch(response){
    case EDIT_RESPONSE_CANCEL:{
    AttachDynamicObjectToVehicle(objectid, PlayerData[playerid][vCarID],PlayerData[playerid][voObjX],PlayerData[playerid][voObjY],PlayerData[playerid][voObjZ],PlayerData[playerid][voObjRx],PlayerData[playerid][voObjRy],PlayerData[playerid][voObjRz]);
    PlayerData[playerid][vObjID] = false;
    return 1;
    }
    case EDIT_RESPONSE_FINAL:{
    static Float:Pos[6];
    GetVehiclePos(PlayerData[playerid][vCarID],Pos[0],Pos[1],Pos[2]);
    GetVehicleZAngle(PlayerData[playerid][vCarID],Pos[3]);
    AttachDynamicObjectToVehicle(objectid, PlayerData[playerid][vCarID], ((x - Pos[0])*floatcos(Pos[3],degrees)+(y - Pos[1])*floatsin(Pos[3],degrees)), ((-(x - Pos[0]))*floatsin(Pos[3],degrees)+(y - Pos[1])*floatcos(Pos[3],degrees)), z-Pos[2], rx, ry, rz-Pos[3]);
    PlayerData[playerid][vObjID] = false;
    return SelectObject(playerid);
    }
    }
    return H_OnPlayerEditDynamicObject(playerid, objectid, response, x, y, z, rx, ry, rz);
    }


    AttachDynamicObjectToVehicle(objectid, PlayerData[playerid][vCarID], ((x - Pos[0])*floatcos(Pos[3],degrees)+(y - Pos[1])*floatsin(Pos[3],degrees)), ((-(x - Pos[0]))*floatsin(Pos[3],degrees)+(y - Pos[1])*floatcos(Pos[3],degrees)), z-Pos[2], rx, ry, rz-Pos[3]);


    damit bekommst du die Offset- Koordinaten raus von der normalen Position des Objektes in relation zu dem Fahrzeug, das geht bei Objekten ebenso

  • IPrototypeI : Danke, mal gucken was ich brauche :),
    Gerade da es ein Hausbausystem ist, muss ich es so machen :p
    Damit ich es nutzen kann, zB zum platzieren des Hauses? :D Es soll ja dynamisch sein, bis jetzt kann jeder Spieler ein Haus erstellen, das wird auch gebaut und ist immer da, man kann auch ein kaufbar machen, nur das Problem ist, dass ich die Rotationsberechnung brauche, nicht die Koordinaten der Location :/ Die habe ich, indem ich von jeder Achse (x,y,z) den Mittelpunkt ausrechne, den Unterschied von jedem Objekt berechne (einfache Subtraktion) und dann den Unterschied zu dem Objekt hinzufüge :o

  • Nee musst du nicht, du musst keine Objekte aneinander attachen. Das Streamer Plugin bietet die Funktionen um gewissen Bereich zu erstellen und darüber kannst du ganz einfach abfragen ob die Koordinaten sich noch innerhalb der Zone befinden.


    Dahet finde ich es extrem unnötig die Objekte aneinander zu attachen .

  • Ich attache sie aneinander, um den GUI der EditObject Funktion zu nutzen, um die Objekte beliebig zu verschieben und dann, wenn man speichert die Position zu speichern. Das ist also zum Verschieben gedacht (http://wiki.sa-mp.com/wiki/EditObject)


    (Davor habe ich die Objekte zum Objekt hinzuberechnet, aber so ists einfacher mit der Rotation und bessere Performance, da nicht immer noch extra was berechnet wird, sondern nur über den GUI)

  • Ich attache sie aneinander, um den GUI der EditObject Funktion zu nutzen, um die Objekte beliebig zu verschieben und dann, wenn man speichert die Position zu speichern. Das ist also zum Verschieben gedacht (http://wiki.sa-mp.com/wiki/EditObject)


    (Davor habe ich die Objekte zum Objekt hinzuberechnet, aber so ists einfacher mit der Rotation und bessere Performance, da nicht immer noch extra was berechnet wird, sondern nur über den GUI)


    Entweder reden wir aneinander vorbei oder du verstehst einfach nicht was ich meine.


    Zum einen würde ich den streamer dafür nutzen du kannst maximal 1000 Objekte global erstellen und zum anderen die Objekte müssen nicht aneinander attached werden um ein einzelnes zu bewegen oder
    geht es dir darum alle Objekte zu verschieben, wenn man die "Grundfläche" verschiebt falls ja kannst du von dir dieses filterskript anschauen und davon die berechnung übernehmen.


    http://forum.sa-mp.com/showthread.php?t=506610

  • Ja genau das aus dem Filterscript suche ich, wie man die Objekte einfach richtig ausgerichtet an ein anderes Objekt zu attachen, damit man so "ein Haus" zu moven, also in ein Objekt, was alle anderen Objekte an sich attached hat, sodass es so aussieht, als würde man das ganze Haus verschieben ^^ Danke, mal gucken obs klappt :))