Kamera

Aus Das Sopra Wiki
Wechseln zu: Navigation, Suche


Kameras in Computerspielen bestimmen aus welcher Sicht die Spieler die virtuelle Welt eines Spiels erleben. Sie entscheiden wie die Spielwelt auf den Monitor gerendert wird. Dazu gibt es eine ganze Reihe von verschiedenen Kameratypen und Verhaltensweisen die für verschiedene Arten von Spielen oder zum Erzeugen verschiedener Effekte verwendet werden. Neben der Betrachter-Perspektive gehört dazu unter anderem auch die Art und Weise wie die Kamera auf Benutzereingaben oder andere Spielelemente reagiert.

Bedeutung von Kameras

Die Darstellung des Geschehens durch die Kamera hat einen bedeutenden Einfluss auf das Spielerlebnis der Zuschauer. Ein schlecht implementiertes Kamerasystem kann Anwendungen derart verschlechtern, dass selbst eine exzellente Grafik oder eine herausragende Spielmechanik nicht ausreichen um dies auszugleichen. Häufige Probleme bei Kameras sind z.B. Clippingfehler (das Eindringen der Kamera in Umgebungsobjekte), eine umständliche Steuerung die vom Spieler ständig nachjustiert werden muss, oder auch ungünstig gewählte Bildausschnitte bei denen wichtige Bereiche der Spielwelt nicht einsehbar sind.

Die folgende Designphilosophie aus dem Buch "Real-Time Cameras: A Guide for Game Designers and Developers" von Mark Haigh-Hutchinson trifft diesen Aspekt sehr gut:

An ideal virtual camera system, regardless of the genre, is notable by the lack of attention given to it by the viewer.

Wenn die Kamera also in der Lage ist dem Spieler die virtuelle Welt so zu präsentieren, dass sie komplett darin eintauchen können, dann kann man das Kamerasystem als gelungen bezeichnen.

Aufgrund der Bedeutung des Kamerasystems für das Spielgefühl sollte ihm während der Entwicklung des Spiels durchgehend genug Aufmerksamkeit geschenkt werden, vor allem auch während der anfänglichen Planungsphase.

Das Kamerasystem

Der Begriff Kamerasystem bezieht sich auf mehrere unterschiedliche Elemente, die es dem Spiel in Zusammenarbeit erlauben zu steuern, wie dem Spieler die virtuelle Welt präsentiert wird. Das Kamerasystem ist ein bedeutender Teil einer Spieleengine. Dies sind die Hauptkomponenten eines Kamerasystems:

  • Verwaltung der aktiven Kameras und der Wechsel zwischen ihnen.
  • Anwendung von speziellen Verhaltensweisen, die die Positionierung, Bewegung und Orientierung der Kameras bestimmen.
  • Kontrolle über sich ändernde Kameraverhalten, abhängig von den Gameplay Anforderungen.
  • Erstellung der Informationen die von der Grafikengine zum Rendern der Ansichten der Spielwelt benötigt werden.

Die Rolle des Kamerasystems ist es, die Spielerfahrung der Betrachter durch die Handhabung der Positionen, Orientierungen und anderen Eigenschaften von Kameras in interaktiven Szenen zu verbessern und nicht-interaktive Szenen (z.B. Zwischensequenzen) so darzustellen wie es von den Entwicklern geplant ist. Man sollte beachten, dass bereits kleine Änderungen der Position oder Orientierung einer Kamera die Wahrnehmung des Betrachters der virtuellen Welt gravierend verändern kann, denn die relative Größe und Position von Charakteren oder Objekten in einer Szene beeinflusst für gewöhnlich die Bedeutung die der Betrachter ihnen zuteilt.

Aufbau einer Kamera

Kamera Aufbau

Eine typische Spielekamera setzt sich aus den folgenden Komponenten zusammen:

Position
Die Position der Kamera in der Welt. Je nach Art der Kamera kann diese z.B. von der Position des Spielers abhängig sein.
Orientierung
Die Orientierung bestimmt die aktuelle Blickrichtung der Kamera. Es gibt verschiedene Möglichkeiten sie festzulegen, z.B. über eine Look-at Position oder über yaw, pitch und roll Rotationswerte oder auch über Up- und Forward-Vektoren.
Viewing Volume
Das Viewing Volume ist der Bereich den eine Kamera potentiell erfassen könnte. Für Spielekameras wird nur ein bestimmter Teil dieses Bereichs genutzt, das sogenannte View Frustum.
View Frustum
Das View Frustum bestimmt den Bereich der durch eine Spielekamera sichtbar gemacht werden kann. Das View Frustum setzt sich aus der Position und Orientierung der Kamera, dem Viewport und dem Field of View zusammen.
Viewport
Das Viewport ist in Spielen eine Datenstruktur, die einem Teil des Anzeigegeräts, welches zur Darstellung der Spielwelt wie sie aus einer bestimmten Kamera gesehen wird, entspricht. Viewports sind meist rechteckig, können in ihrer Größe variieren und sich auch gegenseitig überlappen (z.B. ein Rückspiegel in einem Rennspiel, der über das normale Spiel-Viewport gezeichnet wird). Eine klassische Anwendung für verschiedene Viewports ist z.B. auch ein Splitscreen Modus für Multiplayer Spiele an einem PC. Ein Viewport wird maßgeblich durch die folgenden Werte definiert:
Width
Die Breite des Viewports bzw Ergebnisbildes der Kamera (wird in Pixeln angegeben).
Height
Die Höhe des Viewports bzw Ergebnisbildes der Kamera (wird in Pixeln angegeben).
Aspect Ratio
Das Verhältnis zwischen der Breite und Höhe des Viewports. Für normale Standardgeräte beträgt dieser Wert für gewöhnlich 1.33, also ein Verhältnis von 4:3. Für Breitbildgeräte 1.78, also ein Verhältnis von 16:9. Es gibt aber auch andere Formate, z.B. in der Filmproduktion.
Near Plane
Die near plane wird durch einen Tiefenwert bestimmt, der der Entfernung des Anfangs des View Frustums von der Kameraposition entspricht.
Far Plane
Die far plane wird durch einen Tiefenwert bestimmt, der der Entfernung des Endes des View Frustums von der Kameraposition entspricht.
Field of View
Das field of View (kurz: FOV) bezieht sich auf den Winkel zwischen der oberen und unteren Grenze des View Frustums. Damit bestimmt es die Höhe der projizierten Sicht auf die Spielwelt.


Darstellungsarten

Ortographische Darstellung (2D-Kamera)

Typische Orthographische Kameradarstellung: Super Mario World von Nintendo

Der Name der 2D Darstellung kommt von der verwendeten Projektion beim Renderprozess, typischerweise eine parallele orthographische Projektion. Bei dieser Art der Projektion bleiben parallele Linien parallel, was bei einer perspektifischen Projektion nicht der Fall ist. Durch das Verwenden verschiedener Ebenen lässt sich auch hier ein Eindruck von Tiefe erzeugen.


Perspektivische Darstellung (3D-Kamera)

Typische dreidimensionale perspektifische Projektion

Die meisten Spiele verwenden eine Darstellungsart, die eine dreidimensionale Sicht der Spielwelt in einer Art simuliert, die der menschlichen optischen Wahrnehmung sehr ähnlich ist. Dies wird durch eine perspektivische Projektion ermöglicht, bei der parallele Linien so gerendert werden, dass sie in Fluchtpunkten zusammenlaufen. Diese Art der Projektion erzeugt beim Abbilden von Punkten der Spielwelt auf eine flache Ebene Verzerrungen die von der Position des Betrachters, also der Kamera, abhängig sind.


Hybride Darstellung (2.5D-Kamera)

Beispiel für eine isometrische 2.5D Darstellung: Diablo 2 von Blizzard

Der Unterschied in der Darstellung zu einem rein zweidimensionalen Ansatz ist der, dass einige Elemente eine dreidimensionale Ansicht simulieren, obwohl das Spiel hauptsächlich als eine orthographische Projektion dargestellt wird. Dies können Spielobjekte oder auch genauso Teile des Hintergrunds sein.

Die am häufigsten verwendete parallele Projektion zum Erzeugen von peuso-dreidimensionalen Ansichten ist die isometrische Projektion. Diese Projektion gibt eine pseudo 3D-Ansicht der Welt, wobei oft vorgerenderte Hintergrundgrafiken mit vorgerenderten oder dynamisch gerenderten Sprites kombiniert werden, welche zur selben Projektion passen. Die isometrische Projektion wird aufgrund dieser Illusion der Tiefe oft als 2.5D bezeichnet.


Arten von Kameras

Cinematic Cameras

Als cinematic Kameras kann man alle Kameras bezeichnen, die eine nicht-interaktive Sicht auf die Spielwelt bieten. Eine cinematic Kamera kann genau die selbe Technologie wie andere Kameras nutzen. Der Hauptunterschied liegt darin, dass die präsentierte Sicht auf die Welt nicht der Kontrolle des Spielers unterliegt. Es ist allerdings trotzdem möglich dass eine cinematic Kamera auch eine first-person Perspektive haben kann, was in der Film-Industrie ebenfalls häufig eingesetzt wird.

Meistens wird die Aspect Ratio, die Größe des Viewports oder andere Eigenschaften die das Rendering beeinflussen bei der Verwendung von cinematic Kameras verändert, um dem Spieler klar zu zeigen dass es sich jetzt um eine nicht interaktive Sequenz handelt. Es können z.B. auch zusätzliche Filter verwendet werden um den Unterschied in der Darstellung zum gewöhnlichen Gameplay noch zu verstärken.

Anzumerken ist dass es auch möglich ist während des Spiels filmartige (Skript-)Ereignisse zu zeigen, bei denen der Spieler die Kontrolle behält. Das zählt allerdings nicht zu den cinematic Kameras und dies bringt auch eigene spezielle Probleme mit sich, wie z.B. das Sicherstellen dass der Spieler diese Ereignisse auch sieht.

First Person Cameras

Beispiel für eine First Person Kamera: Half-Life 2 von Valve Software

Eine First Person Kamera zeigt für gewöhnlich die Sicht auf die Spielwelt, wie sie durch die Augen des Protagonisten wahrgenommen wird. First Person Kameras erzeugen für den Spieler das beste Gefühl, sich wirklich in der Spielwelt zu befinden. Es gibt sogar ein eigenes Genre für Computerspiele die mit dieser Kameraart verbunden sind, die First Person Shooter.

Die Anwesenheit des Spielecharakters wird durch First Person Kameras hauptsächlich versteckt, was für das Eintauchen in die Spielwelt hinderlich sein kann. Es ist allerdings möglich dies durch das Hinzufügen von zusätzlichen visuellen Aspekten auszugleichen. Ein häufig verwendeter Ansatz ist es eine Waffe oder ein Teil des Körpers des Spielecharakters (z.B. einen Arm) zu zeigen, auch wenn die Positionierung dieser Elemente physikalisch nicht korrekt sein mag. Andere mögliche Aspekte könnten der Helm des Spielecharakters sein oder die Darstellung von Informationen in einer Form, die das Head-Up-Display repräsentieren. Andere häufig verwendete Ansätze sind z.B. die Simulation von Kopfbewegungen durch ein Wippen der Kameraposition beim Gehen oder ein Schütteln der Kamera als Antwort auf Spielereignisse und so weiter. Wenn der Spieler sich in einem Cockpit oder einer ähnlichen Umgebung befindet kann man durch das Anzeigen des Cockpits als Modell oder das Anzeigen von Displays die Position des Spielers innerhalb der Spielwelt weiter Unterstreichen. Dies wird z.B. in Rennspielen oder Flugsimulatoren für gewöhnlich gemacht. Auf ähnliche Art und Weise kann das Realismusgefühl z.B. auch durch Soundeffekte verstärkt werden, z.B. durch die Verwendung von Surround Soundeffekten oder Schrittgeräuschen.

First Person Kameras bringen allerdings auch Schwierigkeiten mit sich, so ist die dargebotene Sicht auf die Spielwelt für gewöhnlich eingeschränkter als die Sicht von Third Person Kameras. Das Sichtfeld ist beschränkend und es ist für den Spieler generell schwieriger die räumliche Beziehung zwischen der Position des Spielecharakters, der Kamera und Elementen der Spielumgebung zu verstehen. Das heisst dass es für den Spieler schwierig oder unmöglich ist Objekte in unmittelbarer Nähe des Spielecharakters zu sehen, ohne die Orientierung der Kamera oder des Spielecharakters zu verändern. Aus diesem Grund sind vor allem präzise Sprünge in vielen First Person Spielen eine schwierige Angelegenheit.


Third Person Cameras

Beispiel für eine Third Person Kamera: Tomb Raider Underworld von Crystal Dynamics

Viele 3D Spiele bieten eine Kamera bei der der Ausgangspunkt vom Spielercharakter getrennt ist, für gewöhnlich hinter und über ihm. Diese Art von Kamera wird typischerweise als Third Person Kamera bezeichnet, da die Sicht auf die Spielwelt von einer Position aus präsentiert wird, die ausserhalb der Repräsentation des Spielers in der Spielwelt liegt.

Diese Kameraart erzeugt meist kein so gutes Mittendrin-Gefühl wie First Person Kameras (was zum Teil daran liegt dass man sich selbst sieht), hat dafür aber andere Vorteile. Obwohl die relative Position und Orientierung der Kamera zum Spielercharakter beliebig variiert werden kann, sind Third Person Kameras für gewöhnlich dazu in der Lage die Beziehung zwischen dem Spielercharakter und der Spielwelt klarer zu zeigen, was die Interaktion zwischen beiden erleichtert.

Bei einer solchen Kameraart ist es oft möglich dass der Spieler dynamisch zwischen verschiedenen Perspektiven auswählen kann. So kann der Spieler seine bevorzugte Ansicht selber auswählen. Der Wechsel zwischen den Kameraansichten kann dabei entweder sofort oder interpoliert stattfinden, je nachdem wie es vom Entwickler gewünscht ist. Anstatt nur zwischen vordefinierten Kombinationen durchwechseln zu können, kann man dem Spieler zuzsätzlich auch die Möglichkeit geben die Kamera dynamisch, z.B. durch zoomen oder rotieren, zu verändern. Dies wird vor allem bei Charakter basierten Spielen wie Adventures oder Rollenspielen oft eingesetzt.

Third Person Kameras müssen sich nicht zwangsläufig an der Position und Orientierung des Spielercharakters orientieren, es gibt viele andere Möglichkeiten um die Position einer Third Person Kamera zu bestimmen. Typische Beispiele sind z.B. stationäre Kameras oder Kameras die sich auf vordefinierten Pfaden bewegen. Obwohl bevorzugterweise ein einziger konsistenter Kameraansatz gewählt wird, kann es für bestimmte Spielmomente (z.B. ein Bosskampf oder eine andere spezielle Situation) von Vorteil sein eine andere, von der gewöhnlichen Ansicht abweichende Kamerasicht zu verwenden.

Wie bereits erwähnt wurde bringen bestimmte Arten von Third Person Kameras auch spezielle Probleme mit sich. Die zwei größten Probleme sind die Navigation durch die Spielwelt und die Vermeidung von Kollisionen. Das bedeutet es einer Kamera zu ermöglichen dich durch eine komplexe und möglicherweise dynamisch verändernde Umgebung zu bewegen und dabei Kollisionen mit Spielobjekten oder der Weltgeometrie zu vermeiden. Zusätzlich muss die Kamera dabei in eine Lage bewegt werden, von der aus sie das Spielgeschehen in der gewünschten Form präsentiert. Diese Probleme werden durch die Bewegung des Spielecharakters, vor allem bei schnellen Bewegungen oder Sprüngen, noch weiter verschlimmert. Zwar könnten solche Probleme durch das Verwenden von vordefinierten Kamerapositionen oder Bewegungen vermieden werden, doch meist verlangen die Anforderungen des Gameplays dynamischere Lösungen. Ein sehr ähnliches Problem ist das der Verdeckung des Spielecharakters. In vielen Spielen ist es möglich die Spielfigur in eine Position zu bewegen in der er von der Umgebung verdeckt wird. Eine teilweise oder kurzzeitige Verdeckung ist meist kein Problem, längere komplette Verdeckungen führen aber leicht zu Situationen in denen der Spieler die Orientierung verliert. Gerade in Stresssituationen wie Kämpfen kann dies sehr kritisch sein.

Ein anderes erhebliches Problem bei Third Person Kameras ist das Zielen. Dies ist hauptsächlich ein Problem weil der Spieler für gewöhnlich nicht Entlang der Sichtlinie ihres Charakters schauen. Sichthilfen wie Fadenkreuze oder sichtbare Projektilspuren können dem Spieler daher eine große Hilfe sein. Auto-aiming, assisted-aiming oder auto-targeting sind Techniken die ebenfalls oft verwendet werden um den Zwang für präzise Zielkünste zu vermeiden.

Bei der Wahl einer Third Person Kamera sollte allerdings auch bedacht werden dass sie die Umsetzung angemessener Animationen für jede potentielle Aktivität des Spielers erfordern.

Third Person Kamera ist der Oberbegriff für die Mehrheit der in Spielen oder Filmsequenzen verwendeten Kameras. Sie bieten daher eine Vielfalt an unterschiedlichen Positionierungs- und Orientierungsverhalten. Es folgt eine Übersicht über verbreitete Implementierungen:

  • Hinter dem Charakter: Die Position der Kamera ist mit der Orientierung des Spielecharakters verknüpft (meist über und hinter dem Charakter um zu verhindern dass er die Sicht auf die Spielwelt verdeckt).
  • Über der Schulter: Die Kamera wird so positioniert dass sie eine Sicht über die Schulter des Spielecharakters zeigt, meist mit geringer oder gar keiner Verzögerung bei der Orientierung. Dieser Ansatz wird oft in hybriden first person/third person Präsentationsarten verwendet um beim Zielen zu helfen.
  • Sichtbare Füße: Die Kamera wird so weit vom Spielecharakter entfernt dass die Animationen noch gut sichtbar sind und gleichzeitig eine gute Sicht auf die Umgebung gegeben ist. Dies schließt die Möglichkeit ein die Füße des Charakters sehen zu können, was oft wichtig ist um Sprünge oder andere Positionierungen einschätzen zu können. Dies ist prinzipiell ein Spezialfall der "Hinter dem Charakter" Kamera.
  • Weite Entfernung: Die Kamera befindet sich weit hinter dem Spielcharakter. Dieser Ansatz ist stark von der Spielumgebung abhängig, da Verdeckungen für gewöhnlich vermieden werden sollen, und ist eine gängige Lösung für Rennspiele. Die Orientierung der Kamera ist gegenüber der Bewegung des Spielers oft stark verzögert um rasche Neuausrichtungen zu vermeiden und um es zu Ermöglichen den Charakter als dreidimensional zu sehen.
  • Charakter Bezogen: Die Kamera behält ihre Position relativ zu der des Spielcharakters. Wird oft für Replay-Kameras verwendet. Beispiele sind nach Hinten oder zur Seite gerichtete Kameras (bei Flugsimulatoren) oder Stoßstangenkameras (bei Rennspielen).
  • Stationär: Die Kamera ist an einem günstigen (meist hohen) Ausgangspunkt positioniert und unbeweglich. Um den Spielecharakter oder andere Zielobjekte in der Sicht zu behalten wird lediglich die Orientierung angepasst.
  • Pfad-basiert: Die Kamera ist darauf beschränkt einem vordefinierten Pfad durch die Umgebung zu folgen.


Hybrid Cameras

Beispiel für eine Hybride Kamera: Dead Space von EA Redwood Shores

Manche Spiele versuchen die ästhetischen Qualitäten von First Person Kameras zu verbessern, indem sie den Charakter von einer externen Position zeigen, dabei aber die Kontrolle und die Bestimmung der Orientierung von First Person Kameras beibehalten. Meist wird die Kamera dazu nahe der Schultern des Protagonisten positioniert, die exakte Position kann aber abhängig von den Anforderungen des Spiels auch variieren. Manche Spiele verwenden auch eine gewöhnliche Third Person Kamera bis der Spieler eine Waffe zieht oder in einen "Zielmodus" wechselt, erst dann wird die Kamera näher an den Spielecharakter bewegt. Die Kamerasicht könnte genauso auch verändert werden um dem Spieler eine Interaktion mit Elementen der Spielwelt zu ermöglichen. Eine ähnliche Positionsänderung (oder sogar der Wechsel in eine First Person Kamera) kann bei Third Person Kameras auch verwendet werden wenn der Spieler rückwärts mit einem Teil der Spielwelt kollidiert. Dadurch kann das Eindringen der Kamera in andere Objekte vermieden werden und auch das Gameplay verbessert werden.

Hybride Ansätze sind eine interessante Herangehensweise um das Problem von Interaktionen auf weite Distanzen, welches bei Third Person Kameras oft auftritt, zu lösen. Ein weiterer Vorteil ist dass sie das Eintauchen des Spielers in die Spielwelt verbessern, wenn auch nur bis zu einem bestimmten Grad da die Sicht immernoch ausserhalb des Spielecharakters liegt. Die Bewegung der Kamera ist im Gegensatz zu traditionellen Third Person Kameras ein kleineres Problem, vor allem wenn die Position der Kamera innerhalb des Kollisionsradius des Spielecharakters bleibt. Verzögerungen bei der Positionierung um den Spielecharakter und bei der Orientierung können weiterhin angewendet werden.


Die Bilderstellung

Der Prozess der Bilderstellung wird auch als "Rendering Pipeline" bezeichnet. Sie lässt sich grob in feste Schritte aufteilen. In Abhängigkeit von der verfügbaren Grafikhardware können manche dieser Schritte parallel zur regulären Spiellogik oder auch parallel auf der Grafikhardware selbst ausgeführt werden.

  1. Die Spiellogik aktualisiert den internen Zustand aller aktiven Speilobjekte. Dazu gehört die Bestimmung der Position, der Orientierung, von Animationen oder andere Informationen die zur Repräsentation des zu erstellenden Objekts gehören.
  2. Die Logiken der Spielkameras werden aktualisiert um sicherzustellen dass ihre Positionen, Orientierungen und anderen Eigenschaften die die Bilderstellung beeinflussen auf dem aktuellen Stand sind.
  3. Für jede zu generierende Sicht auf das Spiel:
    1. Bestimme die Position und Orientierung der erforderlichen Spielkamera.
    2. Bestimme den Anteil des Anzeigegeräts der die zu erstellende Ansicht beinhalten wird (dies entspricht dem Viewport).
    3. Bestimme das Sichtvolumen bzw. das View Frustum, welches den Anteil der Welt bestimmt der von der Kameraposition und Orientierung aus sichtbar ist.
    4. Bestimme, anhand des View Frustums, welche Spielobjekte oder Elemente beim Rendern einfach weggelassen werden können. Dieser Vorgang wird auch als Culling bezeichnet.
    5. Für jedes darzustellende Spielobjekt oder Weltelement:
      1. Transformiere das Spielmodel (also die geometrischen Primitive die seine Form bestimmen, bei Spielen meistens Dreiecke) bezüglich der Kamera Sicht (also vom Object-Space in den Camera-Space).
      2. Füge Licht- und Schatteneffekte hinzu.
      3. Projiziere die Primitive vom dreidimensionalen Raum auf eine zweidimensionale Fläche (die Bildebene der Kamera).
      4. Verwerfe (sog. Culling) alle projizierten Primitive die außerhalb des sichtbaren Bereichs liegen und schneide die die ihn überkreuzen zurecht (sog. Clipping).
      5. Zeichne die Primitive. Dies erfolgt bei aktuellen Grafikkarten mittels Rasterisierung.

Kameraberechnungen in XNA

Berechnung der View Matrix
Vector3 position;
Vector3 target;
Vector3 orientation;
Matrix orientationMatrix = Matrix.CreateFromYawPitchRoll(this.orientation.Y, this.orientation.X, this.orientation.Z);

//Berechnung der View Matrix für den Blick auf eine Zielposition
Matrix viewMatrix = Matrix.CreateLookAt(this.position, this.target, Vector3.Up);

//Oder alternativ Berechnung der View Matrix anhand der Orientierung der Kamera
Matrix viewMatrix = Matrix.CreateLookAt(this.position, this.position + this.orientationMatrix.Forward, Vector3.Up);
Berechnung der Projection Matrix
float fieldOfView;
float aspectRatio;
float nearPlane;
float farPlane;

Matrix projectionMatrix = Matrix.CreatePerspectiveFieldOfView(this.fieldOfView, this.aspectRatio, this.nearPlane, this.farPlane);
Berechnung des View Frustums, z.B. zum Cullen nicht sichtbarer Objekte
Matrix viewProjectionMatrix = this.viewMatrix * this.projectionMatrix;
BoundingFrustum viewFrustum = new BoundingFrustum(viewProjectionMatrix);

Referenzen

  1. Real-Time Cameras: A Guide for Game Designers and Developers von Mark Haigh-Hutchinson
  2. http://msdn.microsoft.com/en-us/library/bb975157.aspx