Прежде всего, вам нужно, чтобы ваша позиция вершины была равна Vector4
(перспективные проекции требуют использования однородных координат; установите W = 1
).Я предполагаю, что вы знаете, какую вершину вы хотите и как получить ее положение.Его положение будет в пространстве модели.
Теперь просто преобразуйте эту точку в пространство проекции.То есть - умножьте это на свою матрицу проекции мира.То есть:
Vector4 position = new Vector4(/* your position as a Vector3 */, 1);
IEffectMatrices e = /* a BasicEffect or whatever you are using to render with */
Matrix worldViewProjection = e.World * e.View * e.Projection;
Vector4 result = Vector4.Transform(position, worldViewProjection);
result /= result.W;
Теперь ваш результат будет в проекционном пространстве, которое (-1, -1) в левом нижнем углу экрана и (1,1) в верхнем правом углу,Если вы хотите получить свою позицию в клиентском пространстве (что и использует SpriteBatch
), просто преобразуйте ее, используя обратную матрицу, которая соответствует неявной матрице проекции вида, используемой SpriteBatch
.
Viewport vp = GraphicsDevice.Viewport;
Matrix invClient = Matrix.Invert(Matrix.CreateOrthographicOffCenter(0, vp.Width, vp.Height, 0, -1, 1));
Vector2 clientResult = Vector2.Transform(new Vector2(result.X, result.Y), invClient);
Отказ от ответственности: я не проверял ни один из этого кода.
(Очевидно, чтобы проверить, видима ли конкретная вершина или нет, просто проверьте, находится ли она в (-1, -1) для(1,1) диапазон в проекционном пространстве.)