Also hier ist, wie es geht.
Zuerst müssen Sie die acht Punkte in jeder Bounding Box in einer vorhersagbaren Weise speichern, zum Beispiel jedes Bit in einer Ganzzahl, die seine Position um die Mitte der Box darstellt. Was Sie tun können, ist 0x4 zu verwenden, um EAST (+ x) zu repräsentieren (Null in diesem Bit bedeutet WEST) 0x2, um NORTH darzustellen (Null in diesem Bit bedeutet SOUTH) und 0x1, um TOP darzustellen (Null in diesem Bit bedeutet BOTTOM). Jetzt können Sie universell auf alle Punkte in der gleichen Position des Begrenzungsrahmens zugreifen, indem Sie eine Positionsnummer angeben. (Alle Null-Bit-Zahlen sind nur Null Java warnt davor, dass diese Zuordnungen bedeutungslos sind, aber sie helfen mit Ablesbarkeit..)
den Begrenzungsrahmen einrichten: (tun dies für jeden Begrenzungskasten)
pointList = new Point3d[8];
pointList[WEST|SOUTH|BOTTOM] = new Point3d(x0,y0,z0);
pointList[WEST|SOUTH|TOP] = new Point3d(x0,y0,z1);
pointList[WEST|NORTH|BOTTOM] = new Point3d(x0,y1,z0);
pointList[WEST|NORTH|TOP] = new Point3d(x0,y1,z1);
pointList[EAST|SOUTH|BOTTOM] = new Point3d(x1,y0,z0);
pointList[EAST|SOUTH|TOP] = new Point3d(x1,y0,z1);
pointList[EAST|NORTH|BOTTOM] = new Point3d(x1,y1,z0);
pointList[EAST|NORTH|TOP] = new Point3d(x1,y1,z1);
Weiter Berechnen Sie die Normale aus Ihrem Blickwinkel. (Yaw ist links/rechts Rotation, Tonhöhe nach oben/unten Rotation)
float nx = -(float)Math.cos(yaw);
float ny = (float)Math.sin(yaw);
float nz = (float)Math.sin(pitch);
Ich denke, das negative richtig ist, aber wenn alles auf der einen Seite nicht sichtbar ist, ist es gerade umgekehrt :)
Berechnen Sie die Charakteristik Punkt, der nur der Index ist, dass Sie in jedem Begrenzungskasten überprüfen gehen, weil es den Punkt in jedem Feld darstellt, die am nächsten zu der Ebene, auf der unsichtbaren Seite sein:
int characteristicPoint = (nx<0?WEST:EAST)|
(ny<0?SOUTH:NORTH)|
(nz<0?BOTTOM:TOP);
Vergewissern Sie sich, dass jeder Begrenzungs Box ist so eingerichtet, dass x, y, z etwas kleiner sind nx, y, z prime (x0 = x aught, x1 = x prime)
Dann sammeln Sie Ihre charakteristischen ('check') Punkt, Ihre Gruppe von Normalen ('Kaugummi') und Ihre Kameraposition (x, y z), und dies mit jeder Bounding-Box:
float checkA = ((bounds.pointList[check].x-position.x)*frustrum.x) +
((bounds.pointList[check].y-position.y)*frustrum.y);
float checkB = ((bounds.pointList[check].x-position.x)*frustrum.x) +
((bounds.pointList[check].z-position.z)*frustrum.z);
if(checkB>=0&&checkA>=0) {
visible = true;
return;
} else if(checkB<0&&checkA<0) {
visible = false;
return;
} else {
float checkC = ((bounds.pointList[check].y-position.y)*frustrum.y) +
((bounds.pointList[check].z-position.z)*frustrum.z);
if(checkC>=0) {
visible = true;
return;
} else {
visible = false;
return;
}
}
Dies ist eine einfache lineare Algebra (IMO), und die Logik ist wie folgt: Wenn der Punkt auf der positiven Seite von zwei oder mehr der Linien repräsentieren die Flugzeug, es ist sichtbar. Wenn es sich um die negative Seite des Kabels oder um mehrere der Linien handelt, die die Ebene darstellen, ist es unsichtbar. Sie berechnen die ersten beiden, und wenn sie unterschiedlich sind (eine negative, eine positive), überprüfen Sie die dritte und nehmen Sie diesen Wert.
Es ist wichtig, die folgende Eigenschaft zu beachten, wenn Linien als Gleichungen Behandlung:
-x-y = p != x+y = p
Die Linie ist die gleiche, aber die implizit ‚‘ zugewandte inverse.
Ich hoffe, das hilft jemand anderen mit dieser Frage. Es war schwer, aber angenehm, um es herauszufinden.
Diese effizienter gestaltet werden könnte durch die erste Hälfte des Checka speichern, nehme ich an :)
ich zu einem besseren Ort für diese Frage vermuten in http://math.stackexchange.com würde (Math Forum) oder alternativ http://cs.stackexchange.com (CompSci forum) –
Vielleicht, obwohl dies keine theoretische Frage ist, sondern eine praktische Frage. Es ist also keine mathematische Frage oder eine Frage der Informatik, sondern eine Java-Frage. Weil das Problem in Java gelöst werden muss! Ich habe es nur allgemein formuliert, um sicherzustellen, dass ich nicht die Antwort bekomme: "Sie repräsentieren diese auf die falsche Art und Weise ..." –
Ein guter Punkt, aber wenn ein Algorithmus mathematisch definiert ist, dann können Sie ihn implementieren es in jeder Sprache, die Sie mögen. (Übrigens habe ich meinen Master-Abschluss in Computergrafik - vor 15 Jahren - aber kann mich an nichts Nützliches trotzdem erinnern :)) –