Мне кажется, это было бы что-то вроде этого:
Vector2 Convert(Vector3 pos, const Matrix& viewMatrix, const Matrix& projectionMatrix, int screenWidth, int screenHeight)
{
pos = Vector3::Transform(pos, viewMatrix);
pos = Vector3::Transform(pos, projectionMatrix);
pos.X = screenWidth*(pos.X + 1.0)/2.0;
pos.Y = screenHeight * (1.0 - ((pos.Y + 1.0) / 2.0));
return Vector2(pos.X, pos.Y);
}
Что мы здесь делаем, это просто передаем вектор через две матрицы преобразования: вид, затем проекция.После проекции вы получаете вектор с Y и X между -1 и 1. Мы делаем соответствующее преобразование, чтобы получить координаты реального пикселя и вернуть новый вектор Vector2.Обратите внимание, что компонент Z в 'pos' также хранит глубину точки в пространстве экрана в конце функции.
Вам нужна матрица 'view', потому что она определяет, где расположена камераи вращается.Проекция определяет только то, как 3D-пространство «сплющено» в 2D-пространстве.
Поле зрения не является farZ.Матрица проекции имеет несколько параметров, среди которых:
- поле зрения, FOV, то есть горизонтальный угол обзора, в радианах;
- дальняя плоскость или farZ:это определяет максимальное расстояние, на которое точка может быть от камеры;
- ближняя плоскость, nearZ: минимальное расстояние, на которое точка может быть от камеры.
Помимо математической задачи,вы можете использовать Vector2 вместо выделения кучи (возвращая указатель).Vector2 - это легкая структура, и в этом контексте очень вероятно, что указатели вызовут головные боли (где вы собираетесь ее удалить и так далее).Также обратите внимание, что я использовал ссылки 'const', поскольку мы не изменяем их, кроме вектора.Для этого нам нужна локальная копия, поэтому она вообще не является ссылкой.