Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig

Posted By: Schmerzmittel

Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 20:54

Hiho an alle,


ich habe wieder mal ein kleines Problem.


Für meine Speicherfresenden Grasmodelle dachte ich mir, dass ich die einfach, wenn ich weit genug weg bin, auf der z Achse um 10000 oder so nach oben setze, damit sie nicht gerendert werden.

Code:
void GrassLod()
{

	while(Hero == 0)
	{
		wait(1);
	}
	
	set(my, PASSABLE);

	
	while(1)
	{
		if ((vec_dist(Hero->x, my.x) >= 5000) && (vec_dist(Hero->z, my.z) <5000))  
		{

		my.z += 40000;

		}
		else 
		{
			if ((vec_dist(Hero->z, my.z) >5000) && (vec_dist(Hero.x, my.x) < 5000))
			{
				
			my.z -= 40000;
				
			}
		}
	
		wait(1);
		
	}		

	
} 



Das nach oben setzen funktioniert einwandfrei. Aber sobald ich wieder näher komme und die Pflanzen zurückkommen sollen, funktioniert das nur Sporadisch. Manchmal kommen sie, meisten jedoch nicht.

Woran kann das liegen? Ich prüfe, ob ich weit genug weg bin, und ob die z Achse auch weit oben ist. Das müsste doch eigentlich gehen, oder?
Posted By: TechMuc

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:12

Ohje, okay mehrere Sachen.

1) Wenn ein Entity nicht mehr sichtbar ist (hinter clipfar) wird es eh nicht mehr gerendert.

2) Es reicht vollkommen aus die Entitiät auf unsichtbar zu setzten.

3) Wenn du sagen wir mal 500 Gras-Entitäten hast, wirst du jetzt 500 (!!!) mal dieses Script ausführen.. Jeden Frame. Du checkst also 500 mal pro Frame die Distanz (übrigens nicht der allerschnellste Befehl, da hier mit Quadraten und Wurzeln gearbeitet wird) zum Player. Allein das wird vermutlich schon 3-5 FPS kosten smile
Lösung davon: Verwalte Gras in Gruppen (also nur 40-50 Gras Gruppen die jeweils 10-100 Gras Entitiäten verwalten) und vor allem warte nicht einen Frame sondern z.B. 32-128 frames (je nachdem wie schnell du dich bewegen kannst). Prüfe überhaupt nicht, wenn die Kamera sich nicht bewegt.

4) vec_dist(Hero->z, my.z)
Dies hier ist ein riesen Unsinn, Achtung!!! Um dir mal die Wirkung von vec_dist zu zeigen:

var vec_dist(var* ps1,var* ps2)
{
return(sqrtv((ps1[0]-ps2[0])*(ps1[0]-ps2[0]) + (ps1[1]-ps2[1])*(ps1[1]-ps2[1]) + (ps1[2]-ps2[2])*(ps1[2]-ps2[2]))
}

(Gewissermaßen der 3D-Satz von Pythagoras.. (P1 ( x1,y1,z1 ), P2( x2,y2,z2),
d(P1,P2)² = (x1-x2)² + (y1-y2)² + (z1-z2)²)

Okay das war jetzt eine Recht lange Abschweifung. Warum ist also vec_dist(Hero->z, my.z) falsch? Ganz einfach, die ersten beiden Werte müssen sich immer auf den ->x wert beziehen.

Der "richtige" code (wie gesagt, Gruppenverwaltung ist besser)

Code:

void GrassLod()
{
	while(Hero == 0)
	{
		wait(1);
	}
	set(my, PASSABLE);
	
	while(1)
	{
		if ((vec_dist(Hero->x, my.x) >= 5000) && is(my,FLAG1) == false)  
		{
		   my.z += 40000;
                   set(my,FLAG1);
		}
		else 
		{
			if ((vec_dist(Hero->z, my.z) >5000) && is(my,FLAG1) == true)
			{
			   my.z -= 40000;
                           reset(my,FLAG1);
			}
		}
		wait(64);
	}		
} 

Posted By: Schmerzmittel

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:31

Ach herje.

Wo hast du denn diese Wahnsinnige formel her^^


Jetzt wollt ich gerade schreiben, warum ich die Z achse prüfen wollte. Habs aber vergessen.

Naja ich probier mal deinen Vorschlag aus. Danke scho mal.
Posted By: Schmerzmittel

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:35

Nope.

Geht immer noch nicht.

Die Entitys werden nach oben gesetzt, kommen aber nicht mehr runter.
Das kann doch nicht so schwer sein?
Posted By: TechMuc

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:41

Hmm entschuldige..war zu faul zum erklären..

Code:
A = Punkt A
B = Punkt B
X = freier Raum

AXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXB


So, was ist jetzt die Distanz zwischen diesen beiden Punkten? Dazu schaust du dir das als Dreieck an:

Code:
AXXXXXXXC
X       X
  X     X
    X   X
      X X
        B


==> Die Distanz zwischen A und B ist die länge der Hypotenuse im Dreieck ABC ==> s. Satz von Pythagoras. Genauso funzt des in 3D
Was ich dir damit eigentlich sagen will: vec_dist beinhaltet 3 mal quadrieren und einmal Wurzel ziehen ==> LANGSAM smile ==> Nicht 500 mal jeden Frame benutzen.


Warum du vec_dist(.z) genutzt hast, war, weil du überprüfen wolltest ob du die Pflanze bereits hochgesetzt hast. Da sind Flags aber effektiver und einfacher smile
Posted By: TechMuc

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:42

sorry, so stimmts.

Code:
void GrassLod()
{
	while(Hero == 0)
	{
		wait(1);
	}
	set(my, PASSABLE);
	
	while(1)
	{
		if ((vec_dist(Hero->x, my.x) >= 5000) && is(my,FLAG1) == false)  
		{
		   my.z += 40000;
                   set(my,FLAG1);
		}
                if(is(my,FLAG1) == true) && (vec_dist(Hero->x,my->x) < 5000))
                {
		   my.z -= 40000;
                   reset(my,FLAG1);
	        }
		wait(64);
	}		
} 

Posted By: Schmerzmittel

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/18/09 21:48

Danke für deine Hilfe TechMuc.


Aber das Problem besteht immer noch.


Die doofen Pflanzen wollen einfach nicht mehr auf den Boden klatschen.

Wie machen es denn die anderen?
Ich habs ja schon mit Alpha versucht, aber die werden ja dann trotzdem gerendert. Und mit ent_morph brauche ich dermaßen viele Pflanzenmodelle dass das auch nicht wirklich schön ist.

Trotzdem danke ^^



EDIT:
Ich korrigiere.
Mit einem Wert von 500 als Distanz, funktionierts. Kann es sein, dass bei 40000 die X Achse nicht mehr funktioniert zu prüfen?

EDIT2:
so nach einigem Testen weis ich jetzt worans liegt. Die entfernung x muss genau die selbe sein, wie die entferung z. Komisch oder?


Also es doch so. Wenn du über den Pythagoras gehst, muss du ja die z achse mitberechnen.
Probiers mal aus mit einem testlevel.

Die Achse X gilt in diesem fall nur, wenn du auf der selben höhe bist. Oder relativ auf der selben höhe.
Wenn du jetzt einen Block oder was auch immer auf z = 10000 setzt und die X achse prüfst, sagen wir mal mit 5000, dann funktioniert das nicht, weil sich der Orientpunkt der Entity auf eben die 10000 setzt.

Naja. Morgen mach ich weiter damit. Das muss doch zu lösen sein.

Trotzdem vielen dank für deine Hilfe. Jetzt hab ich wieder was über vec_dist gelernt laugh
Posted By: TechMuc

Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig - 01/22/09 08:56

Sorry hab ich net gelesen gehabt hier. Das Problem im Code ist ganz einfach. Wenn du das Entity um 50.000 auf der Z Achse erhöhst, steigt natürlich auch die distanz smile

lösung:

Code:
void GrassLod()
{
	while(Hero == 0)
	{
		wait(1);
	}
	set(my, PASSABLE);
	
	while(1)
	{
		if ((vec_dist(Hero->x, my.x) >= 5000) && is(my,FLAG1) == false)  
		{
		   my.z += 40000;
                   set(my,FLAG1);
		}
                if(is(my,FLAG1) == true) && (vec_dist(Hero->x,vector(my->x,my->x,my->z-40000)) < 5000))
                {
		   my.z -= 40000;
                   reset(my,FLAG1);
	        }
		wait(64);
	}		
} 


or just work with "invisible".
© 2023 lite-C Forums