0
我對每個世界,視圖和投影轉換都有一個SlimDX矩陣。根據http://msdn.microsoft.com/en-gb/library/windows/desktop/bb147302(v=vs.85).aspx,投影變換離開(-1,1)^ 3立方體中的座標。如何將鼠標轉換爲世界座標?
我認爲通過將鼠標相對於渲染目標的位置轉換爲投影空間(即將其縮放到(-1,1)範圍內並將其固定在-1軸上),然後應用倒轉的worldview投射。
下面的代碼顯示了我的嘗試。我的測試是運行應用程序並使用鼠標滾輪放大和縮小,並查看打印的X座標是否改變,同時將鼠標光標放在窗口的左邊緣 - 它不會在某處出現錯誤。
form.MouseMove += (obj, eargs) =>
{
SlimDX.Matrix worldview = SlimDX.Matrix.Multiply(SlimDX.Matrix.Identity, viewMatrix);
SlimDX.Matrix worldviewprojection = SlimDX.Matrix.Multiply(worldview, projectionMatrix);
worldviewprojection.Invert();
var pointX = (float)((2.0 * ((float)eargs.Location.X)/(float)form.Width) - 1.0f);
var pointY = (float)((2.0 * (((float)eargs.Location.Y)/(float)form.Height)) - 1.0f) * -1.0f;
var mouseInProjectionSpace = new Vector4(pointX, pointY, -1.0f, 1.0f);
var mouseInWorldSpace = Vector4.Transform(mouseInProjectionSpace, worldviewprojection);
Console.WriteLine(mouseInWorldSpace);
};
form.MouseWheel += (_, __) =>
{
if (__.Delta > 0)
cam.Z /= 2.0f;
else
cam.Z *= 2.0f;
viewMatrix = GetView(cam);
Console.WriteLine("zzz="+cam.Z);
};
任何幫助表示讚賞
「mouseInWorldSpace」的例子是怎麼樣的?你是否用它的w分量來劃分它?你可以用z = 0而不是-1來試試嗎? – Gnietschow