|
|
Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
#247070
01/18/09 20:54
01/18/09 20:54
|
Joined: Aug 2005
Posts: 512 Bayern
Schmerzmittel
OP
User
|
OP
User
Joined: Aug 2005
Posts: 512
Bayern
|
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. 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?
Last edited by Schmerzmittel; 01/18/09 20:55.
A7 Com V7.80
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: Schmerzmittel]
#247073
01/18/09 21:12
01/18/09 21:12
|
Joined: Jul 2008
Posts: 894
TechMuc
User
|
User
Joined: Jul 2008
Posts: 894
|
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  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)
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);
}
}
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: TechMuc]
#247076
01/18/09 21:31
01/18/09 21:31
|
Joined: Aug 2005
Posts: 512 Bayern
Schmerzmittel
OP
User
|
OP
User
Joined: Aug 2005
Posts: 512
Bayern
|
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.
A7 Com V7.80
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: Schmerzmittel]
#247077
01/18/09 21:35
01/18/09 21:35
|
Joined: Aug 2005
Posts: 512 Bayern
Schmerzmittel
OP
User
|
OP
User
Joined: Aug 2005
Posts: 512
Bayern
|
Nope.
Geht immer noch nicht.
Die Entitys werden nach oben gesetzt, kommen aber nicht mehr runter. Das kann doch nicht so schwer sein?
Last edited by Schmerzmittel; 01/18/09 21:39.
A7 Com V7.80
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: Schmerzmittel]
#247079
01/18/09 21:41
01/18/09 21:41
|
Joined: Jul 2008
Posts: 894
TechMuc
User
|
User
Joined: Jul 2008
Posts: 894
|
Hmm entschuldige..war zu faul zum erklären..
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:
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  ==> 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 
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: TechMuc]
#247081
01/18/09 21:48
01/18/09 21:48
|
Joined: Aug 2005
Posts: 512 Bayern
Schmerzmittel
OP
User
|
OP
User
Joined: Aug 2005
Posts: 512
Bayern
|
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 
Last edited by Schmerzmittel; 01/18/09 22:37.
A7 Com V7.80
|
|
|
Re: Simples Lodsystem. Z-Verschiebung funktioniert nicht richtig
[Re: Schmerzmittel]
#247714
01/22/09 08:56
01/22/09 08:56
|
Joined: Jul 2008
Posts: 894
TechMuc
User
|
User
Joined: Jul 2008
Posts: 894
|
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  lösung:
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".
|
|
|
|