Jump to content
Unity Insider Forum

MaZy's Blog

  • Einträge
    14
  • Kommentare
    32
  • Aufrufe
    46.232

Nervig! Der Nullpunkt ist nicht in der Mitte vom Model. Lösung!


MaZy

1.119 Aufrufe

Ich hatte mal lust ein "Demo" zu machen, wo man einfach mit ner Flugzeug rumfliegen kann. Ich habe dazu einen kostenlosen Flugzeugmodel runtergeladen.

Ich habe aber gemerkt, dass viele Nullpunkte nicht mittig sind. Sie sind sogar manchmal außerhalb. Zum Beispiel: Die Turbinen können nicht rotiert werden. Warum? Da der Nullpunkt nicht in der Mitte sind könnte sie falsch rotiert werden oder in einer Eierorbit oder so.

Jetzt könnte ich das Problem lösen, in dem ich neues GameObject nehme und sie dann in die Mitte schiebe. Und dann schiebe ich die Turbine in das GameObject. Sagen wir es heißt TurbinenRotierer. Jetzt sagen wir mal ich habe, aber 10-100 kleine Models die sowas benötigen. Man hätte kein bock darauf alles zu machen. Tatsächlich war es wirklich so, dass da jede Menge dinge waren die mich gestört haben. Also habe ich einen kleinen Script geschrieben.

[b]Collider [/b]und [b]Renderer [/b]haben eine coole Funktionen die sich [b]Bounds [/b]nennt. Dadurch kann man nämlich die Mitte herauskriegen in dem man [b]center [/b]benutzt. Und die habe ich genutzt.

[CODE]
void RotateCenter(GameObject rotatingObject, Vector3 eulerAngle) {
if(!rotatingObject.renderer) {
return;
}

GameObject theRotator = GameObject.Find("Center_" + rotatingObject.gameObject.name);

if(!theRotator) {
theRotator = new GameObject();
theRotator.name = "Center_" + rotatingObject.name;
theRotator.transform.position = rotatingObject.renderer.bounds.center;
theRotator.transform.parent = rotatingObject.transform.parent;
rotatingObject.transform.parent = theRotator.transform;
}

theRotator.transform.Rotate(eulerAngle);
}
[/CODE]

Hier rufe ich einfach die Methode [b]RotateCenter [/b]aufund gibt an welchen GameObject man rotieren will und dazu die eulerAngle , um die Turbinen zu rotieren. Also funktioniert eigentlich wie Rotate(). Der Script lässt einfach einen GameObject erstellen falls es noch nicht existiert und benennt sie um und parented das auch um.

[CODE]
RotateCenter(TurbineLeft,new Vector3(0,0,-throttle));
RotateCenter(TurbineRight,new Vector3(0,0,throttle));
[/CODE]

Joa das wars erst mal :)

[b]NACHTRAG (13.08.2014):[/b]
[b]NACHTRAG #2:[/b] Paar Fehler behoben.

Ein Hinweis von Sascha. Man kann das natürlich als Extension machen.
Ein Beispiel wie es es aussehen könnte[CODE]
using UnityEngine;
using System.Collections;
// Das hier sollte static sein.
public static class TransformExtensions {

/*
Was tut sie?
Wenn ein Model mal nicht mittig ist, kann man die Funktion verwenden.
Im Endeffekt wird ein Hilfsobjekt erstellt und zentriert. Das alte Objekt wird dann zu ihm parented.
Danach rotieren wir eigentlich nur den Hilfsobjekt. Je nach Situation kann das behilflich sein.
*/
public static void RotateCenter(this Transform t, Vector3 eulerAngle) {

// Hat as render (mesh?)
if(!t.renderer) {
// Wenn nicht, abbrechen.
return;
}

// Den "Hilfsobjekt" bzw. den "Drehobjekt" ermitteln
GameObject theRotator = GameObject.Find("Center_" + t.gameObject.name);

// Existiert dieses Hilfsobjekt?
if(!theRotator) {

// Wenn nein dann erstellen wir sie.
theRotator = new GameObject();
theRotator.name = "Center_" + t.name;

// Ermittle die Mitte
theRotator.transform.position = t.renderer.bounds.center;

// Diesen Objekt den gleichen Parent zuweisen
theRotator.transform.parent = t.transform.parent;

// Nun den alten Objekt parent durch "Hilfsobjekt" zuweisen.
t.transform.parent = theRotator.transform;

}

// schließlich den Rotor drehen.
theRotator.transform.Rotate(eulerAngle);
}

}
[/CODE]
Nun sollte man sie so verwenden können: transform.RotateCenter(new Vector3(0,0,1));
Hab leider jetzt nicht testen können, aber sollte eigentlich funktionieren.

4 Kommentare


Recommended Comments

Gast
Kommentar schreiben...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...