Hallo!
Hab jetzt was gefunden:
http://www.toymaker.info/Games/html/picking.html
Habe dies nach C# umgewandelt:
Variablen:
private static Microsoft.DirectX.Direct3D.Device device;
private static Microsoft.DirectX.Vector3 mouseVector;
private static Microsoft.DirectX.Matrix projMatrix;
private static Microsoft.DirectX.Matrix viewMatrix;
private static Microsoft.DirectX.Vector3 rayDir;
private static Microsoft.DirectX.Vector3 rayOrigin;
private static int width;
private static int height;
private static int posX;
private static int posY;
Funktion:
public static void getRay(Device device, int xPos, int yPos)
{
CMousePicking.device = device;
projMatrix = device.GetTransform(TransformType.Projection);
viewMatrix = device.GetTransform(TransformType.View);
height = device.Viewport.Height;
width = device.Viewport.Width;
posX = xPos;
posY = yPos;
mouseVector.X = ( ( ( 2.0f * posX ) / width ) - 1 ) / projMatrix.M11;
mouseVector.Y = -( ( ( 2.0f * posY ) / height ) - 1 ) / projMatrix.M22;
mouseVector.Z = 1.0f;
Microsoft.DirectX.Matrix invertedViewMatrix = Microsoft.DirectX.Matrix.Invert(viewMatrix);
// Transform the screen space pick ray into 3D space
rayDir.X = mouseVector.X*invertedViewMatrix.M11 + mouseVector.Y*invertedViewMatrix.M21 + mouseVector.Z*invertedViewMatrix.M31;
rayDir.Y = mouseVector.X*invertedViewMatrix.M12 + mouseVector.Y*invertedViewMatrix.M22 + mouseVector.Z*invertedViewMatrix.M32;
rayDir.Z = mouseVector.X*invertedViewMatrix.M13 + mouseVector.Y*invertedViewMatrix.M23 + mouseVector.Z*invertedViewMatrix.M33;
rayOrigin.X = invertedViewMatrix.M41;
rayOrigin.Y = invertedViewMatrix.M42;
rayOrigin.Z = invertedViewMatrix.M43;
}
Das kann man jetzt so verwenden:
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
CMousePicking.getRay(device, e.X, e.Y);
Microsoft.DirectX.Direct3D.IntersectInformation tempInfo;
Microsoft.DirectX.Direct3D.IntersectInformation[] tempInfo2;
// Use inverse of matrix
Microsoft.DirectX.Matrix matInverse = Matrix.Invert(device.GetTransform(TransformType.World));
// Transform ray origin and direction by inv matrix
Microsoft.DirectX.Vector3 rayObjOrigin,rayObjDirection;
rayObjOrigin = Vector3.TransformCoordinate(CMousePicking.RayOrigin, matInverse);
rayObjDirection = Vector3.TransformNormal(CMousePicking.RayDirection,matInverse);
rayObjDirection = Vector3.Normalize(rayObjDirection);
if (myMesh.Intersect(rayObjOrigin, rayObjDirection, out tempInfo, out tempInfo2))
{
// Mesh wurde angeklickt
}
}
Hab das probiert und es funktioniert! Die Klasse CMousePicking sollte dann auch noch
das mit rayObjOrigin usw. erledigen, hab die Klasse jetzt aber nur schnell hingeschrieben,
um zu testen, ob die Transformation 2D -> 3D funktioniert! Würde mich noch über andere
Lösungsvorschläge freuen ;-)
MFG Willi