Grundsätzlich ist das schon möglich, wenn auch nicht enorm schnell.
Was wichtig ist, du solltest wissen, was für Terrains nebeneinander gehören.
Der einfachste Weg (also einfach Rand-Vertics auf die gleiche Höhe bringen) ist nicht wirklich komplex.
Über eine Funktion einfach z.B. Rechte Seite von Terrain A mit der Linken Seite von Terrain B vergleichen und die Vertices auf den Mittelwert setzten.
Schwerer wird es wenn du wirklich einen sanften Übergang machen willst. Dann musst du halt auch die z.B. 5 äußersten Vertices statt nur den einen äußersten Untersuchen.
Ich habe da selber mal eine Funktion geschrieben. Kannst sie sicher nicht genau übernehmen.. Aber als Anhaltspunkt:
Code:
//jetzt randvertices verbinden..
GEdit_c = 0;
GEdit_d = 0;
GEdit_a = 0;
while(GEdit_d < GEdit_Abs_ters[1]) //abs_ters = wieviele Terrains gibt es in Y Richtung
{
while(GEdit_c < GEdit_Abs_ters[0]) //Terrains in X Richtung..
{
//entitys bekommen
GEdit_Terrain_Oben = GEdit_FindTerrain(GEdit_c+1,GEdit_d,GEdit_Abs_ters[0]); //Findet Pointer von dem Terrain drüber
GEdit_Terrain_Unten = GEdit_FindTerrain(GEdit_c-1,GEdit_d,GEdit_Abs_ters[0]); //findet Pointer von dem Terrain drunter
GEdit_Terrain_Links = GEdit_FindTerrain(GEdit_c,GEdit_d-1,GEdit_Abs_ters[0]); //Findet Pointer von dem Terrain Links
GEdit_Terrain_Rechts = GEdit_FindTerrain(GEdit_c,GEdit_d+1,GEdit_Abs_ters[0]); //terrain rechts von dem Terrain in der Mitte
GEdit_Terrain_Mitte = GEdit_FindTerrain(GEdit_c,GEdit_d,GEdit_Abs_ters[0]); //terrain in der Mitte
GEdit_Terrain_GetSize(GEdit_Terrain_Mitte,GEdit_Terrain_Info);
if(GEdit_Terrain_Oben != 0) //falls oben eins ist
{
GEdit_a = GEdit_verts[1]; GEdit_b = 1; //Verts = Vertices in X/Y Richtung
while(Gedit_a <= GEdit_verts[1]*GEdit_verts[0])
{
vec_for_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_for_mesh(GEdit_temp1.x,GEdit_Terrain_Oben,GEdit_b);
result=temp.z; result=GEdit_temp1.z;
temp.z = (temp.z+GEdit_temp1.z)/2; //mittelwert
vec_to_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_to_mesh(temp.x,GEdit_Terrain_Oben,GEdit_b);
GEdit_a += GEdit_verts[1]; //immer eine Reihe weiter springen, da nur vertics oben bearbeitet werden sollen
GEdit_b += GEdit_verts[1];
}
} //usw. jetzt nur unten
if(GEdit_Terrain_Unten != 0)
{
GEdit_a = 1; GEdit_b = GEdit_verts[1];
while(GEdit_b <= GEdit_verts[1]*GEdit_verts[0])
{
vec_for_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_for_mesh(GEdit_temp1.x,GEdit_Terrain_Unten,GEdit_b);
temp.z = (temp.z+GEdit_temp1.z)/2;
vec_to_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_to_mesh(temp.x,GEdit_Terrain_Unten,GEdit_b);
GEdit_a += GEdit_verts[1];
GEdit_b += GEdit_verts[1];
}
}
if(GEdit_Terrain_Links != 0)
{
GEdit_a = 1; GEdit_b = GEdit_verts[0]*(GEdit_verts[1]-1)+1;
while(GEdit_b <= GEdit_verts[1]*GEdit_verts[0])
{
vec_for_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_for_mesh(GEdit_temp1.x,GEdit_Terrain_Links,GEdit_b);
temp.z = (temp.z+GEdit_temp1.z)/2;
vec_to_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_to_mesh(temp.x,GEdit_Terrain_Links,GEdit_b);
GEdit_a += 1;
GEdit_b += 1;
}
}
if(GEdit_Terrain_Rechts != 0)
{
GEdit_a = GEdit_verts[0]*(GEdit_verts[1]-1)+1; GEdit_b = 1;
while(Gedit_a <= GEdit_verts[1]*GEdit_verts[0])
{
vec_for_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_for_mesh(GEdit_temp1.x,GEdit_Terrain_Rechts,GEdit_b);
temp.z = (temp.z+GEdit_temp1.z)/2;
vec_to_mesh(temp.x,GEdit_Terrain_Mitte,GEdit_a);
vec_to_mesh(temp.x,GEdit_Terrain_Rechts,GEdit_b);
GEdit_a += 1;
GEdit_b += 1;
}
}
GEdit_UserOutputUpdate(vector("Connecting Terrains..","Generating...",NULL),nullvector,vector(0,-1,GEdit_a));
GEdit_a += 1;
GEdit_c += 1;
wait(1);
}
GEdit_c = 0;
GEdit_d += 1;
}
Ich hoffe das kann halbwegs helfen,
mit freundlichen Grüßen,
Timo