.| Autor | Beitrag |
|---|---|
|
000 05.10.2002, 23:33 the_viking |
Kann mir irgendjemand mit meinem Beamtree helfen?? Anscheinend gibt es auf der ganzen Welt keine einziges Beamtree-Tutorial. Was ein Beamtree ist, weiß ich: Mein Beamtree benutzt nur Volumes für Triangles, also 4 Ebenen, da ich keinen BSP Benutze: 3DPlane p1,p2,p3,zNear 3DPlane: Einfügen eines Volumes: [code] CCamera* c = (CCamera*)GetPointerToCamera(); BeamTreeEntry* bte = (BeamTreeEntry*)malloc(sizeof(BeamTreeEntry)); Triangle faketriangle; // Volume 1 faketriangle.v[0].x = t->v[0].x; faketriangle.v[1].x = t->v[1].x; faketriangle.v[2].x = ursprung.x; bte->volume[0].normal = CalcNormal(&faketriangle); // Volume 2 faketriangle.v[0].x = t->v[1].x; faketriangle.v[1].x = t->v[2].x; faketriangle.v[2].x = ursprung.x; bte->volume[1].normal = CalcNormal(&faketriangle); // Volume 3 faketriangle.v[0].x = t->v[2].x; faketriangle.v[1].x = t->v[0].x; faketriangle.v[2].x = ursprung.x; bte->volume[2].normal = CalcNormal(&faketriangle); // Ok, now just the zNear Plane haves to be calculated. Very easy... bte->znear.point.x = t->v[0].x; bte->znear.normal = t->normal; if(!m_first) BeamTreeEntry* p = m_first; while(p->pNext) p->pNext = bte; // That was it! Das Überprüfen eines Dreieckes geht so von statten: [code] BeamTreeEntry* p = m_first; while(p) p = p->pNext; return false; } bool CBeamtree::TestTria(BeamTreeEntry* bte,Vertex3D *p) int eld = 0; for(int i=0;i<3;i++) if(PointIsFrontOfPlane(&pl,&vec) == BACK) if(eld >= 3) return false; Triangle: Aber irgendwie funktioniert das nicht!! thx, cu, MfG the_viking (( My =]=H=O=M=E=> Page! )) Dieser Beitrag wurde am 05.10.2002 um 23:33 von the_viking bearbeitet. |
|
Profil || Suche |
|
001 06.10.2002, 00:35 Prefect |
Hmm, ein _Baum_, der in einer _Liste_ gespeichert ist? Ehrlich gesagt habe ich keine Ahnung von Beamtrees. Aber ich brainstorme einfach mal. Da sie anscheinend zum Clippen von Shadowvolumes verwendet werden ist es wohl eine Art BSP-Tree auf einer Kugel. Statt Subdivision-Planes hat man Subdivision-Kreise auf einer Kugeloberfläche. Es ist letztendlich ein zweidimensionaler BSP-Tree auf einer Kugelebene. [edit] cu, Widelands - Gemütliche Aufbaustrategie, Free Software Dieser Beitrag wurde am 06.10.2002 um 00:52 von Prefect bearbeitet. |
|
Profil || Suche |
|
002 06.10.2002, 00:40 the_viking |
?? Nichs verstanden, Prefect. Also ein Beamtree ist kein Tree AFAIK, sondern eine Liste mit 3D-Volumen. thx, cu, MfG the_viking (( My =]=H=O=M=E=> Page! )) |
|
Profil || Suche |
|
003 06.10.2002, 00:57 Prefect |
Bah, mein Edit kam etwas zu spät. Wie gesagt, Beamtrees sollten schon Trees sein, und bis jetzt spricht alles, was ich zum Thema gefunden habe, dafür. Nur mit einer Liste kriegst du sowieso Probleme. Sagen wir, alle Punkte, die hinter einer Ebene liegen, werden beleuchtet. Das geht solange gut, bis du ein zweites Dreieck einfügst, dann liegen nämlich _alle_ Punkte hinter irgendeiner Ebene und werden damit beleuchtet. Wenn du die Liste in einzelne Dreiecke aufteilst und _jedes_ Dreieck prüfst hast du ganz offensichtlich einen O(n)-Algorithmus, und das scalet bestimmt nicht gut auf komplexe Szenen. Ein Binary Tree hat zwar immer noch ein worst case von O(n), aber der Durchschnitt dürfte einiges besser sein. cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
004 07.10.2002, 20:21 Nicemice Moderator |
Der BeamTree wurde unteranderem von j. carmack während der Entwicklung von Quake1 implementiert. Der BeamTree enthält im Gegensatz zum BSPTree NUR die aktuell zu zeichnenden Polygone. Das heißt er muß bei jedem Frame neu berechnet werden. Das ist natürlich deutlich zeitintensiver, als die Visibility Information vorzuberechnen und dann jedes Leaf dranzuhängen. So hab ichs zumindest verstanden, weiß nicht ob es richtig ist. --www.d3opencoop.com - A Doom3 Cooperative Mod |
|
Profil || Suche |
|
005 08.10.2002, 00:10 the_viking |
In Ureal machen die heftig gebrauch davon.. In Quake haben die ja ihre PVS... --thx, cu, MfG the_viking (( My =]=H=O=M=E=> Page! )) |
|
Profil || Suche |

