В моей программе у меня есть вход и выход. Ввод представляет собой 2D-позицию, которая может варьироваться от (0,0) до (240,360). Мой вывод - трехмерный мир, созданный в XNA.
Однако я не смог понять, как перевести точки из 2D-сетки в 3D. Я хочу иметь возможность переводить точки так, чтобы (0,0) приводил к XNA, показывающему точку в работе в верхнем левом углу того, что может видеть камера. Кроме того, я хочу, чтобы точка (240 360) отображалась в нижнем правом углу того, что может видеть камера. Значение Z будет равно нулю (оно изменится, но это выходит за рамки этого вопроса).
Как я могу определить, где находятся углы обзора моей камеры?
Вот как я рисую свои объекты в трехмерном мире.
Vector3 camPos = new Vector3(0.0f, 0.0f, 500.0f);
Matrix view = Matrix.CreateLookAt(camPos, Vector3.Zero, Vector3.Up);
Matrix proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, GraphicsDevice.DisplayMode.AspectRatio, 1, 10000);
Matrix ballWorld = Matrix.Identity;
//rotate it so that it is always facing foward
ballWorld.Forward = direction;
ballWorld.Up = Vector3.Up;
ballWorld.Right = Vector3.Cross(direction, Vector3.Up);
foreach (SphereObject so in blobs) {
Matrix sphereWorld = ballWorld;
sphereWorld *= Matrix.CreateTranslation(so.Position);
sphereWorld *= Matrix.CreateScale(so.Scale);
so.SphereModel.Draw(sphereWorld, view, proj);
}
И вот где я получаю точки из 2D-плоскости и создаю объект SphereObject
public void CreateNewBlob(System.Drawing.Point p) {
Random rand = new Random();
SphereObject so = new SphereObject(model, new Vector3(p.X, p.Y, 0));
so.SetColor(new Color((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble()));
blobs.Add(so);
}