Hallo zusammen
Ich habe momentan ein merkwürdiges Problem was die Rückprojektion (Vector3.Unproject) der Mauskoordinaten in die Objektkoordinaten anbelangt.
Grundsätzlich habe ich dies schon diverse Male implementiert und auch nie Probleme damit gehabt, allerdings musste ich jetzt feststellen, dass etwas nicht ganz so läuft wie ich das gerne habe.
Folgender Code kümmert sich darum:
Mir ist bewusst, dass der letzte Parameter eigentlich world * view * proj wäre, allerdings ist bei mir world immer die Identitätsmatrix, daher lasse ich diese gleich weg.
Interessant ist nun das Verhalten, das ich in der Applikation feststelle:
1. Die Position der Maus ist immer leicht nach rechts und nach oben verschoben, das hängt allerdings ganz vom Winkel ab in dem ich auf das Terrain schaue. Trifft der "Strahl" der Maus praktisch senkrecht auf das Terrain auf passt es ziemlich gut, trifft er eher flach auf ist die Verschiebung grösser.
2. Bewege ich die Maus hoch und runter geht der Kreis flüssig mit, verschiebt sich also mit dem Mauszeiger. Bewege ich die Maus links und rechts ist es jedoch komplett anders. Der Kreis bleibt etwa 10 Pixel lang am gleichen Ort und hüpft dann an den neuen Ort. Dieses Verhalten ist mir absolut unerklärlich, denn ich konnte feststellen, dass die Position des Mauszeigers korrekt ist und auch richtig sich ändert, aber bei Unproject nur alle 10 Pixel ein neuer Wert produziert wird.
Hat jemand von euch eine Ahnung, woran das liegen könnte?
Gruss
Cromon
Ich habe momentan ein merkwürdiges Problem was die Rückprojektion (Vector3.Unproject) der Mauskoordinaten in die Objektkoordinaten anbelangt.
Grundsätzlich habe ich dies schon diverse Male implementiert und auch nie Probleme damit gehabt, allerdings musste ich jetzt feststellen, dass etwas nicht ganz so läuft wie ich das gerne habe.
Folgender Code kümmert sich darum:
C#:
public void UpdateMouseTerrainPos()
{
System.Drawing.Point pt = System.Windows.Forms.Cursor.Position;
pt = mRenderWindow.PointToClient(pt);
var ptNear = Vector3.Unproject(new Vector3(pt.X, pt.Y, 0), Device.Viewport.X, Device.Viewport.Y,
Device.Viewport.Width, Device.Viewport.Height, Device.Viewport.MinZ, Device.Viewport.MaxZ,
Device.GetTransform(TransformState.View) * Device.GetTransform(TransformState.Projection));
var ptFar = Vector3.Unproject(new Vector3(pt.X, pt.Y, 1), Device.Viewport.X, Device.Viewport.Y,
Device.Viewport.Width, Device.Viewport.Height, Device.Viewport.MinZ, Device.Viewport.MaxZ,
Device.GetTransform(TransformState.View) * Device.GetTransform(TransformState.Projection));
Ray ray = new Ray(ptNear, Vector3.Normalize((ptFar - ptNear)));
float distance = 0;
bool hit = ADT.ADTManager.Intersect(ray, ref distance);
ShaderCollection.TerrainShader.SetValue("DrawMouse", hit);
if (hit)
{
ShaderCollection.TerrainShader.SetValue("MousePosition", ray.Position + distance * ray.Direction);
}
}
Mir ist bewusst, dass der letzte Parameter eigentlich world * view * proj wäre, allerdings ist bei mir world immer die Identitätsmatrix, daher lasse ich diese gleich weg.
Interessant ist nun das Verhalten, das ich in der Applikation feststelle:
1. Die Position der Maus ist immer leicht nach rechts und nach oben verschoben, das hängt allerdings ganz vom Winkel ab in dem ich auf das Terrain schaue. Trifft der "Strahl" der Maus praktisch senkrecht auf das Terrain auf passt es ziemlich gut, trifft er eher flach auf ist die Verschiebung grösser.
2. Bewege ich die Maus hoch und runter geht der Kreis flüssig mit, verschiebt sich also mit dem Mauszeiger. Bewege ich die Maus links und rechts ist es jedoch komplett anders. Der Kreis bleibt etwa 10 Pixel lang am gleichen Ort und hüpft dann an den neuen Ort. Dieses Verhalten ist mir absolut unerklärlich, denn ich konnte feststellen, dass die Position des Mauszeigers korrekt ist und auch richtig sich ändert, aber bei Unproject nur alle 10 Pixel ein neuer Wert produziert wird.
Hat jemand von euch eine Ahnung, woran das liegen könnte?
Gruss
Cromon