portal_x
pnormal_x
Zusätzliche Clip-Ebene zur Verwendung für Spiegel und ähnliche
Effekte. Alles, was sich ausserhalb der Ebene befindet, wird in der
Ansicht nicht
gerendert. Die Ebene ist durch einen Punkt und einen Normalen-Vektor
definiert. Die Parameter portal_x, portal_y und portal_z
sind die Koordinaten des Punktes, die Parameter pnormal_x, pnormal_y and pnormal_z die
Richtung der Normalen. Ihre Default-Werte definieren eine horizontale
Ebene durch den Levelursprung.
Bemerkungen:
- Damit die Clip-Ebene aktiv werden kann, muss das Flag PORTALCLIP gesetzt
sein.
- Um den View als Spiegel verwenden zu können, rendern Sie ihn zu
einer target bmap und wenden Sie diese
Bitmap auf das Spiegelobjekt an.
- Legen Sie einen Spiegel-View auf einen negativen Layer damit er
vor dem Kamera-View gerendert wird und 'trailing'-Artifakte vermieden
werden. Aus demselben Grund verwenden Sie proc_late() zum
Bewegen des Views.
- Ist die Spiegeloberfläche sichtbar, setzt in A6 der
Spiegel (Mirror)-Flag
der Oberfläche automatisch die Vektoren portal_x and pnormal_x des
gegenwärtigen Views. Dieses automatische Feature wird von künftigen
Versionen, die Levels aus Meshes und nicht aus Oberflächen rendern
nicht mehr verwendet werden.
- Microsoft gibt zur Verwendung von Clip-Ebenen in DirectX den folgenden
Kommentar: "When the fixed function
pipeline is used the plane equations are assumed to be in world space.
When the programmable
pipeline is used the plane equations are assumed to be in the clipping
space." Dieser Euphenismus drückt aus, dass
Clip-Ebenen bei Shadern sowie bei BEAM- und STREAK-Partikeln nicht funktionieren. Die Engine
löst dies für sämtliche Objekte über- und
unterhalb der Clip-Ebene. Lediglich dann, wenn Objekte
mit Shadern in die Clip-Ebene eindringen, können Probleme entstehen.
Verwenden Sie daher entweder die Flags NOSHADER und NOPARTICLE,
um das Rendern von in in einen Spiegel-View eindringenden Shadern
zu unterdrücken, oder Sie implementieren über vecPortal einen Clipping-Algorithmus im Shader.
- Von einigen alten 3D-Karten (GeForce4 oder niedriger) werden Clip-Ebenen
nicht unterstützt. Auf solchen Karten wird das Clipping von
der Software ausgeführt. Software-Clipping kann jedoch keine
Meshes aufsplitten. Daher werden bei alten 3D-Karten auf Spiegelebenen
keine Meshes geclippt; dies führt zu Spiegelfehlern, wenn
Meshes in die Spiegelebene eindringen.
Typ:
VECTOR
Edition:
A6 P
A7 C P
Beispiel:
// Code to emulate a horizontal mirror by generating a mirrored camera view
VIEW view_mirror { layer = -1; };
function mfx_mirror()
{
// do nothing if mirror is already running
if (view_mirror.visible == on) { return; }
view_mirror.visible = on;
view_mirror.noshadow = on; // suppress shadows in the mirror
view_mirror.nocull = on; // view through walls
view_mirror.portalclip = on; // clip at portal plane
vec_set(view_mirror.portal_x,vector(0,0,my.z + my.max_z)); // at top entity position
vec_set(view_mirror.pnormal_x,vector(0,0,1.0)); // horizontal plane
while (view_mirror.visible == on)
{
proc_late(); // place it at the end of the function list - the camera must be moved before
view_mirror.genius = camera.genius;
view_mirror.aspect = camera.aspect;
view_mirror.arc = camera.arc;
view_mirror.fog_start = camera.fog_start;
view_mirror.fog_end = camera.fog_end;
view_mirror.clip_far = camera.clip_far * 0.5;
view_mirror.clip_near = camera.clip_near * 2;
view_mirror.x = camera.x;
view_mirror.y = camera.y;
view_mirror.z = 2*view_mirror.portal_z-camera.z; // move the camera at its mirror position
view_mirror.pan = camera.pan;
view_mirror.tilt = -camera.tilt; // flip the vertical camera angle
view_mirror.roll = -camera.roll;
wait(1);
}
}
Siehe auch:
VIEW, layer, pos_x, pos_y, x, y, z, flags, vecPortal
► Aktuelle Version Online