Jump to content
Unity Insider Forum

Gut aussehender Kreis aus Würfeln


MustafGames

Recommended Posts

Hallo,

 

ich habe das hier gefunden:

http://answers.unity...sing-cubes.html

 

unter der "Besten Antwort" steht ein Kommentar wo jemand meint das man die Fraktion von PI nehmen sollte damit der Kreis besser aussieht, welcher Wert sollte das sein?

 

Außerdem ist das ja wirklich nur ein Kreis der nicht gefällt ist, wie könnte man das den machen das es ihn auch füllt?

 

Mfg Mustaf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Damit meint er z.B:

float interval = Mathf.PI / 30.0f;

 

Also einen Bruch von PI, damit hast du auch gleichzeitig die Anzahl der Würfel, also in dem Fall 60 Stück:

 

float numCubes = 60.0f;
float interval = Mathf.PI / numCubes / 2.0f;

 

 

Dachte eigentlich die Anzahl wäre Length (Durchmesser)

 

x = (int)(length * Mathf.Cos (angle));
		 y = (int)(length * Mathf.Sin (angle));

 

PS: Hab meine Frage erweitert oben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für einen gefüllten Kreis eine dritte Schleife aufmachen und in dieser Schleife den Radius vom Maximalradius (length) zunehmend verkleinern. Dabei musst du aber bevor du einen Würfel setzt prüfen, ob der neue Würfel mit einem anderen zuvor gesetzten Würfel kollidieren könnte, oder du drehst solange an der Schrittweite bis es passt. Prinzipiell nimmst du für die Schrittweite dabei die Länge des Würfels.

 

Hier fehlt noch der "Überschneidungstest":

 

using UnityEngine;
using System.Collections;

public class CubeCircle : MonoBehaviour
{

   public GameObject center;
   public GameObject cube;

   void Start()
   {
       int x, y;
       int length = 50;
       float radius = length;
       float angle = 0.0f;
       float numCubes = 40;
       float interval = Mathf.PI / numCubes / 2.0f;
       float circle_interval = 2f;

       while (radius > 0)
       {
           angle = 0.0f;
           while (angle < 2 * Mathf.PI)
           {
               x = (int)(radius * Mathf.Cos(angle));
               y = (int)(radius     * Mathf.Sin(angle));
               Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity);
               angle += interval;
           }
           radius -= circle_interval;
           numCubes -= 1; // ANzahl der Würfel hier mal verkleinern damit es im inneren Bereich nicht zu viele werden
           interval = Mathf.PI / numCubes / 2.0f;
       }
   }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Stimmt, daher hier noch einmal eine Version mit einer vollkommen geschlossenen Kreisfläche.

Bei circle_interval = 1.0f (daher 0.4) gibt es zwar keine Überschneidungen, aber die Kreisfläche wird nicht vollkommengeschlossen. Auch bei einer Version mit den Koordinaten als int kann die Kreisfläche nicht geschlossen werden (und es gibt unschöne Rasterlöcher, ok man könnte diese Löcher nun mit "Zusatzcubes" stopfen, wenn man sie findet).

 

using UnityEngine;
using System.Collections;
public class CubeCircle : MonoBehaviour
{
public GameObject center;
public GameObject cube;
void Start()
{
	float x, y;
	float radius = 50;
	float angle = 0.0f;
	float interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius);
	//float circle_interval = 1f;
	float circle_interval = 0.4f;
	while (radius > 0)
	{
		angle = 0.0f;
		while (angle < 2 * Mathf.PI)
		{
			//x = Mathf.RoundToInt((radius * Mathf.Cos(angle)));
			//y = Mathf.RoundToInt((radius * Mathf.Sin(angle)));
			x = radius * Mathf.Cos(angle);
			y = radius * Mathf.Sin(angle);
			Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity);
			angle += interval;
		}
		radius -= circle_interval;
			interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius);
	}
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab ich hier irgendwas überlesen, oder habt ihr meinen Post überlesen? ^

 

Du möchtest doch einen Kreis ala Minecraft mit einem bestimmten Radius generieren, oder?

 

public GameObject Cube;

void GenerateCircle(Transform center, int r){
for(int x=0;x<r*2;x++){
 for(int y=0;y<r*2;<y++){
  float d = Mathf.Sqrt(Mathf.Pow(x-r,2)+Mathf.Pow(x-r,2));
  if(d<=r){
Instantiate(Cube, center.position + new Vector3(x-r,0,y-r), Quaternion.identity);
  }
 }
}
}

( nicht getestet.. )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ergibt bei mir irgendwie keinen schönen Kreis :/

https://donatstudios...CircleGenerator

Sollte eigentlich so aussehen.

 

Sieht für mich eher "unschön" aus und eher wie ein Quadrat (weil er sich eben dem Raster anpassen muss, aber warum?), aber dafür ist es natürlich 100% symmetrisch.Aber wenn sich die Würfel zwingend am Raster anpassen müssen, dann siehe der Tipp von Mark.

 

Also der Kreis sieht bei mir so aus:

circle.png

 

Ausgefüllter Kreis:

circle_full.png

 

Ok, ist nur zu 99% symmetrisch ;)

 

@Mr 3d:

Habe deine Skript auch gleich mal mitgetestet, da kam ein Rechteck aus Würfeln heraus.

 

PS:

Um mein Skript weiter zu verbessern (Symmetrie). Könnte man nur einen Quadranten (PI/2) berechnen und die anderen 3 Quadranten einfach spiegeln...

 

Gleich mal umgesetzt:

using UnityEngine;
using System.Collections;
public class CubeCircle : MonoBehaviour
{
public GameObject center;
public GameObject cube;
void Start()
{
	float x, y;
	float radius = 6;
	float angle = 0.0f;
	float interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius);
	float circle_interval = 0.4f;
	bool full_circle = false;
	int cnt = 0;
	while (radius > 0)
	{
		angle = 0.0f;
		while (angle < (Mathf.PI/2.0f + interval/2.0f) && (cnt <1 || full_circle))
		{
			x = radius * Mathf.Cos(angle);
			y = radius * Mathf.Sin(angle);
			Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity);
			Instantiate(cube, center.transform.position + new Vector3(-x, 0, y), Quaternion.identity);
			Instantiate(cube, center.transform.position + new Vector3(x, 0, -y), Quaternion.identity);
			Instantiate(cube, center.transform.position + new Vector3(-x, 0, -y), Quaternion.identity);
			angle += interval;
		}
		radius -= circle_interval;
		interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius);
		cnt++;
	}
}
}

 

Die ist ein kleiner Hack dabei, ab und an wird der Kreis nicht geschlossen, daher + interval/2.0f.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Zer0Cool:

Jo, der code war einfach so im Browser geschrieben, ohne ihn zu testen.. ich habe ein 'y' mit einem 'x' vertauscht..

 

Hier nochmal richtig ( + kleine Verbesserung ;) )

 

public GameObject Cube;
void GenerateCircle(Transform center, int r)
{
for (int x = 0; x < r * 2; x++)
{
  for (int y = 0; y < r * 2; y++)
  {
   float d = Mathf.Sqrt(Mathf.Pow( ( x + .5f ) - r, 2) + Mathf.Pow( ( y + .5f ) - r, 2));
   if (d <= r)
   {
    Instantiate(Cube, center.position + new Vector3(x - r, 0, y - r), Quaternion.identity);
   }
  }
}
}

 

post-2869-0-67122800-1488487174_thumb.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sieht ja alles sehr kompliziert aus ich als 3dler hätte da nen anderen Ansatz:

 

Den Cube mit Translation 0,0,0 in die Mitte des Kreises nun eine Instanz auf 100,0,0. Der Pivot auf Position 0,0,0 und das Objekt um die Y Achse drehen zb um 18 grad zb 360/18 = 20 mal also 20 mal um 18 grad instanzieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...