Triangle Intersection: Unterschied zwischen den Versionen
Aus Das Sopra Wiki
| Zeile 262: | Zeile 262: | ||
==== Transformation des Rays in den Object Space ==== | ==== Transformation des Rays in den Object Space ==== | ||
Da sich die Mesh Daten im Object Space befinden müsste man jedesmal bevor man einen Schnittpunkt mit dem Mesh berechnen kann den kompletten Triangle Mesh (also jeden einzelnen Vertice davon) zuvor in den World Space transformieren, also mit der World Matrix multiplizieren. Da ein Mesh für gewöhnlich aus vielen Vertices besteht würde das jedesmal eine Vielzahl an Operationen bedeuten was die Performance extrem belasten würde da dies komplett auf der CPU berechnet werden würde. (Anmerkung: Zum zeichnen der Welt wird dies von der GPU gemacht.) | |||
Anstatt nun also jedesmal den kompletten Mesh in den World Space zu transformieren kann man auch einfach den umgekehrten Weg nehmen und den einzelnen Strahl vom World Space in den Object Space des Objekts transformieren. Dazu muss man den Strahl lediglich mit der inversen World Matrix des Models multiplizieren. Wie in den Kommentaren der Intersect()-Methode der <tt>MeshTriangleData</tt> Klasse bereits steht muss dies mit dem Strahl gemacht werden bevor er dieser Methode übergeben wird damit das richtige Ergebnis zurückgegeben wird. Im Code könnte dies wie folgt aussehen: | |||
<source lang="CSharp"> | |||
//we have | |||
GameObject object; //some object which uses a model which we want to check for a ray intersection | |||
Ray ray; //the intersecting ray, as usual in the world space | |||
//now we transform the ray into object space: | |||
Ray objectRay = new Ray(); | |||
//1) calculate the inverse world matrix of the object | |||
Matrix worldMatrix = object.WorldMatrix; //(the world matrix is just the combined scale, orientation and translation matrix) | |||
Matrix objectSpaceMatrix; | |||
Matrix.Invert(ref worldMatrix, out objectSpaceMatrix); | |||
//2) transform the position and direction with the inverse world | |||
Vector3.Transform(ref ray.Position, ref objectSpaceMatrix, out objectRay.Position); | |||
Vector3.TransformNormal(ref ray.Direction, ref objectSpaceMatrix, out objectRay.Direction); | |||
objectRay.Direction.Normalize(); | |||
//we then have objectRay which is the original ray transformed from world space to the object's space | |||
</source> | |||
[[Kategorie:Code-Beispiele]] | [[Kategorie:Code-Beispiele]] | ||
