Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  10 1519
Hvordan i satan setter jeg opp en haug med sylindre i trekant-mønster?

Det er ikke en geometrisk trekant, ettersom at toppen er flat.

Det skal være mulig å endre mellomrommet mellom sylindrene, og det skal være mulig å endre både den øvre flaten, bunnflaten og høyden - uavhengig av hverandre. (Altså endre intiliseringsverdiene, den ferdige trekanten m/sylindre er statisk).

Annenhver rad skal ha sylindrene forskjøvet slik at de får 45graders vinkel med sylindrene på raden over og under. Dermed vil også annenhver rad ha parallell plassering av sylindrene. Dette impliserer også at annenhver rad skal ha senter-sylinder langs y-aksen (oppover).

Så variablene er:

Øvre falte.
Nedre flate.
Høyde.
Sylinder-mellomrom.

Prøvde mekke en loop som beregnet bredden utifra bredde/hødeforholdet med spacing som variabel, men jeg er for dum i hodet til å få det til å funke.

Show me some magic.
m0b
m0b's Avatar
DonorAdministrator
For å ikke misforstå hvordan du ønsker å rendre sylindrene dine, kan ikke du tegne dette i et bilde fra et 2d-top perspektiv over scenen og legge det ut her?

Noe sier meg dog at instansiering av primitiver i en (3) loop hvor du interpolerer/legger til fast stigningstall mellom vertexenes posisjon i trekanten og bruker modulus for justering av spacing, vil kunne være en løsning. Men antar du ønsker en litt mer kode-spesifik løsning enn en forklaring?
Sist endret av m0b; 31. august 2015 kl. 19:20.
Sitat av |d13m0b Vis innlegg
For å ikke misforstå hvordan du ønsker å rendre sylindrene dine, kan ikke du tegne dette i et bilde fra et 2d-top perspektiv over scenen og legge det ut her?

Noe sier meg dog at instansiering av primitiver i en (3) loop hvor du interpolerer/legger til fast stigningstall mellom vertexenes posisjon i trekanten og bruker modulus for justering av spacing, vil kunne være en løsning. Men antar du ønsker en litt mer kode-spesifik løsning enn en forklaring?
Vis hele sitatet...
Ja jeg har masse ideer. Er kodingen det står på. Her er sånn ca det skal se ut.
Som du ser der er sylindrene laget uavhengig av trekanten, noe som suger balle og ser dust ut.

..Og hvis trekanten endres er jeg likelangt. Så ja. Show me some magic
Sist endret av Tøffetom; 31. august 2015 kl. 19:37.
Plankekjøring detta.
Seff null stress å mekke den stor heller. Faen så jævla fornøyd jeg er med meg selv nå.
Bra! Det er godt å få løst problemer selv også. Så ikke svaret ditt før nå. Hva ble til slutt fremgangsmåten din?
Sist endret av m0b; 2. september 2015 kl. 19:44.
Sitat av |d13m0b Vis innlegg
Bra! Det er godt å få løst problemer selv også. Så ikke svaret ditt før nå. Hva ble til slutt fremgangsmåten din?
Vis hele sitatet...
Først laget jeg et helvetes rot der jeg brukte to løkker, en for positive og en for negative x-verdier (sylindrene står i xy-planet);

Kode

int c_space = 5; //Distance between the cylincders aligned on the y = 0 axis. 
		int cyl_x = 1;
		int cyl_y = 1;
		int cyl_z = 1;
		//relationship between breadth and location along y-axis: 
		int b = 0; 
		int numCol = (box_w2) / c_space;
		for (int i = 0; i < numCol; i++) {
			
			//	if ((i%2) != 0){
			
			//	}
			
			float num_c0 = box_h / c_space - i / 2; 
			float yPos = -c_space / 2 - (c_space / 2) * i + box_h / 2;
			float xRowPos = c_space / 2 * i; 
			
			for (int c0_Num = 0; c0_Num < (num_c0); c0_Num++) {
				
				GameObject cylinders = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
				cylinders.transform.localScale = new Vector3 (cyl_x, cyl_y, cyl_z); 
				cylinders.transform.position = new Vector3 (xRowPos, yPos, 0);
				
				cylinders.transform.eulerAngles = new Vector3 (90, 0, 0); 
				
				
				yPos -= c_space; 
				
			}
			
		}
Det så jævlig ut, funket ikke særlig bra og ja. I stedet for å ha bredde, høyde og en felles "mellomrom"-parameter separerte jeg c_space til henholdsvis deltaX og deltaY og brukte antall rekker som dimensjoneringsparameter:

Kode

	public int dX = 4; 
	public int dY = 4; 
	public int n = 20; 
	public int cyl_scale = 1; 
	public int sysBreadth = 2; 
	public float spawnY = 20;

	void Start() {

		// Generating cylinders. 

		// Dependent on deltaX / dX
		// Dependent on deltaY / dY
		// Dependent on numberRows / n
		// Dependent on scale of cylincers, cyl_scale
		// Dependent on breadth of system, sysZ; 



		// Geometry of system defined by dX, dY and n

		// Origo set at center height of system. 
		// Top -> Height = deltaY * numberRows. 
		//               = 0.5*(dY * n)

		int y;
		int x = 0; 
		int z = 0; 
	

	
		for (int i = 0; i < n; i++) {
			y = (dY * (n - 1)) / 2 - (1 / 2) * dY - i * dY; 


			for (int j = 0; j < (i+1); j++) {
				x = - dX / 2 * i + dX * j; 
				GameObject cylinders = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
				cylinders.transform.position = new Vector3 (x, y, z);
				cylinders.transform.localScale = new Vector3 (cyl_scale, cyl_scale, cyl_scale);
				cylinders.transform.eulerAngles = new Vector3 (90, 0, 0);

			}
		}
Veggene var det jo så bare å dimensjonere i henhold til disse igjen. Ble visst mye enklere når jeg ryddet litt i strkturen:

Kode

// From this we know that a triangle ABC(counterclockwise, starting bottom left) is formed with coordinates intersecting outer cylinder-centre: 

		// A(bottom left)  = (-dX/2)*(n-1);
		// B(bottom right) = (dX/2)*(n-1); 
		// C(top) 		   = dY(n-1)/2;	
																						
		// Based on this we want to determine the angle and length of the side walls. 

		// PYTHAGORAS: Height and width of side triangle squared, added and squarerooted. 
		//			   Divided into parts for readability. 

		// Dimensions (sides of triangle): 
		float height = dY * (n - 1); 
		float halfTriangleWidth = (dX / 2) * (n - 1); 

		// Squaring of sides: 
		float heightSquared = Mathf.Pow (height, 2); 
		float halfTriangleWidthSquared = Mathf.Pow (halfTriangleWidth, 2); 

		// SquareRoot for finding Hypotenuse:
		float lengthWalls = Mathf.Sqrt (heightSquared + halfTriangleWidthSquared);

		// ANGLE: ArcSin on opposite side (height) and hypthenus (length of sideWalls), followed by conversion to degrees. 
		float radiansWalls = Mathf.Asin (height / lengthWalls); 
		float angleWalls = 360 - (radiansWalls * Mathf.Rad2Deg);


		// Positioning of walls. Triangle centered about Y = 0, making the position of the walls the same as triangle-width/2: 
		int xPosRightWall = ((dX / 4) * (n + 1));
		int xPosLeftWall = xPosRightWall * (-1);

Er egentlig første dings jeg programmerer selv, tror nesten jeg hadde det litt gøy underveis. Jævla nørdete.

...Hvis du lurer på hvorfor jeg deklarerer public så er det for å kunne endre på "brettet" uten å gå inn i scriptet.

Når jeg først har min egen tråd her; er det noen måte å speede frames på? Det skal dette baller ned fra toppen, som igjen (i teorien) skal normalfordeles. For at det skal skje må de selvsagt ikke spawne så tett at de kolliderer, noe som igjen gjør at en simulering tar en times tid.

Kan jeg få ballene til å dette fortere uten å påvirke fysikkens "lover" i programmet? Fast-forward kinda.
Sist endret av Tøffetom; 2. september 2015 kl. 21:47. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
2d (veggene har 0 i størrelse og er dermed usynlige)
Det er en stund siden jeg selv lekte i Unity, bruker UnrealEngine for de grafiske prosjektene mine. Som du sikkert selv har skjønt så vil det ikke nytte å øke framerate, da fysikksimuleringen i motoren er tidsavhengig og ikke framerate-avhengig. Det man vanligvis gjør i slike tilfeller er å endre timestep eller skala, med de effektene dette vil kunne ha for simuleringen.

Ta en titt på dokumentasjonen om TimeManager i Unity her, jeg antar at dette hjelper deg i riktig retning? http://docs.unity3d.com/Manual/class-TimeManager.html

Aktuell parameter: http://docs.unity3d.com/ScriptRefere...timeScale.html

Ja, det er nørdete. Det er gøy. Det er lærerikt,! Jeg er ganske sikker på at timene brukt i nådeløs tastaturhamring tar fokuset bort fra helt andre ting!
Sist endret av m0b; 2. september 2015 kl. 23:06.
Sitat av |d13m0b Vis innlegg
Det er en stund siden jeg selv lekte i Unity, bruker UnrealEngine for de grafiske prosjektene mine. Som du sikkert selv har skjønt så vil det ikke nytte å øke framerate, da fysikksimuleringen i motoren er tidsavhengig og ikke framerate-avhengig. Det man vanligvis gjør i slike tilfeller er å endre timestep eller skala, med de effektene dette vil kunne ha for simuleringen.

Ta en titt på dokumentasjonen om TimeManager i Unity her, jeg antar at dette hjelper deg i riktig retning? http://docs.unity3d.com/Manual/class-TimeManager.html

Aktuell parameter: http://docs.unity3d.com/ScriptRefere...timeScale.html

Ja, det er nørdete. Det er gøy. Det er lærerikt,! Jeg er ganske sikker på at timene brukt i nådeløs tastaturhamring tar fokuset bort fra helt andre ting!
Vis hele sitatet...
Ja det har du faen meg rett i.

Tusen takk for hjelpen kompis, garantert ikke siste gang du får æren ;D