2017-08-23 3 views
1

Ich versuche eine kleine Demo für eine Simulation zu machen und ich dachte dieser Teil wird einfach sein. Junge, ich habe mich geirrt und jetzt bin ich total festgefahren. Hier ist mein Problem.Unity3D Rotation verhält sich nicht wie erwartet

Ich versuche, mit Drehung und für dieses Problem arbeiten wir mit einem Winkel von 30 Grad arbeiten, die unten gezeigt wird:

The green ray is -15 degrees, red is 0 degrees and blue is +15 degrees for a total of 30 degrees.

Der grüne Strahl -15 Grad, rot 0 Grad und Blau ist +15 Grad für insgesamt 30 Grad.

Jetzt möchte ich diese 30 Grad in gleiche Teile teilen, also wäre die erste gute Zahl 10. Das bedeutet, dass ich alle 3 Grad einen Strahl zeichnen kann, bis ich mein Maximum erreiche, was in diesem Fall +15 Grad ist.

Looks good! There is a small amount of space that is off and if anyone knows why that is please let me know.

Sieht gut aus: Das kann weiter unten sehen! Es gibt eine kleine Menge an Speicherplatz, und wenn jemand weiß, warum das ist, lass es mich wissen.

Jetzt brauche ich eine große Menge an Strahlen, also werden wir um einen Faktor von 10 steigen und die Anzahl der Unterteilungen auf 100 erhöhen, die unten zu sehen sind. Auch ich muss imgur verwenden, da hier nur zwei Bilder erlaubt sind also bitte mit mir und danke.

https://imgur.com/a/cWDdj

Das erste Bild ist mit 100 Stücken und wie Sie die Strahlen sind alle Guss nach links zu sehen. Das ist ein Problem.

Das zweite Bild ist mit den Divisionen auf 1000 erhöht. Noch schlimmer ist die Tatsache, dass das ganze um das Objekt bis auf eine 15-Grad-Bereich bekam.

Hier ist das Snippet, das dies tut.

if(testRotation) 
{ 
     //Sets the objects rotation to the starting rotation which is -15 degeres 
     this.transform.Rotate(this.transform.rotation.x, this.transform.rotation.y - 15.0f,   
      this.transform.rotation.z); 

     for (int i = 0; i <= 10; i++) 
     { 
      //Draws a ray at the current position and forwards relative to the objects transform 
      Debug.DrawRay(this.transform.position, 
      this.transform.forward * maxSightDistance, Color.cyan, 1000.0f); 

      //This advances the rotation by a factor of one chunk 
      //which in this case is 10 which seems to work 
      this.transform.Rotate(new Vector3(this.transform.rotation.x, 
      this.transform.rotation.y + (30/10), this.transform.rotation.z)); 
     } 

     //This makes it so it doesn't run forever 
     testRotation = false; 

} 

Die einzigen Orte, die in der for-Schleife ändern, in dem die bedingte überprüft wird, und auch der zweite Parameter der Funktion, die durch Drehen „ein chunk“ auf den aktuellen Drehwert hinzufügt.

Für 100 Stücke ändere ich die Stücke: for(int i = 0; i < 100; i++) und this.transform.rotation.y + (30/100)

Für 1000 Stücke ändere ich die Stücke: for(int i = 0; i < 1000; i++) und this.transform.rotation.y + (30/1000)

ich total stecken bin und weiß nicht, warum ist es das, was es geht. Auch wenn Sie etwas erklärt oder geklärt haben möchten, lassen Sie es mich wissen!

Antwort

2

Sie teilen eine Zahl durch eine ganze Zahl, die eine ganze Zahl zurückgibt. Sie müssen stattdessen durch einen Float dividieren, um eine Dezimalzahl zurückzugeben.
heißt

this.transform.rotation.y + (30/100f) 
this.transform.rotation.y + (30/1000f) 

Edit: statt ihres vorherigen Wertes Zusätzlich sollten die Komponenten von drehen 0 sein Anhäufung von Rotation zu vermeiden.

transform.Rotate(new Vector3(0, 30/10f, 0)); 
+0

So löst das Problem für 100 Segmente, sondern durch 1000 dividiert hat immer noch den Ring umschlingenden – Puddinglord

+0

ich völlig verstanden, was du gemeint und ich fügte hinzu, dass für beide Fälle, aber die 1000 Segmente auch in float Form noch den Ring gibe von Strahlen um das Objekt mit den fehlenden Strahlen an der Stelle, die sie zeigen sollten. – Puddinglord

+0

Was passiert, wenn Sie kleinere Zahlen wie 200 oder 500 eingeben? – ryeMoss

Verwandte Themen