Спрайты в Direct3D

Не по теме:

Согласно правилам форума, для каждого вопроса - следует создавать отдельную тему.

Перемещение - весьма простая операция, которая выполняется с помощью изменения матрицы объекта. А вот над получением координат придется немного подумать.

Исходные координаты (там, где находится объект персонажа) и так хранятся в какой-нибудь переменной, поэтому на этом заострять внимание не буду. Главное здесь разобраться с проверкой пересечения луча с объектом (некой плоскостью, по которой происходит передвижение Вашего персонажа).

Лучом в данном случае, является структура, состоящая из двух векторов. Положения и направления. В-первом - хранится информация о том, где находится камера, а во-втором - непосредственное направление луча (где находится курсор).

Для получения данного луча необходимы следующие данные: размеры окна (можно получить через ViewPort, если с этим есть трудности), положение курсора, матрица проекции, вида и мировая матрица объекта (

с которым необходимо проверить пересечение!

).

Подробности самой операции нахождения пересечения описывать не буду (всего не помню и боюсь сделать ошибку в деталях), но компетентных источников не мало. Советую прочитать про выбор объектов у Франка Луна. Или любой другой источник на тему пересечения (intersect) или выбора объектов (picking).

Если будут большие проблемы с поиском, то вот алгоритм преобразования экранных координат в луч (повторяю, всего не помню и где-то могу ошибаться; в последнем блоке умножение py может происходить на другой ряд, в зависимости от того, как представляются y, z):

float px =  ((2.0f * mouse.x / screen.x) - 1.0f) / m_proj._11;
float px = -((2.0f * mouse.y / screen.y) - 1.0f) / m_proj._22;

MATRIX m = MATRIX_INVERT(m_world * m_view);
VECTOR o = VECTOR(m._41,m._42,m._43);
VECTOR d;
d.x = px * m._11 + py * m._21 + m._31;
d.y = px * m._12 + py * m._22 + m._32;
d.z = px * m._13 + py * m._23 + m._33;

Только вместо пересечения луча и сферы/куба, здесь необходимо использовать стандартный метод библиотеки DirectX -

D3DXIntersect

. Это гораздо медленнее, но на первое время сойдет (ибо если будет происходить обработка ландшафта, а не обычной плоскости, то веселья будет не мало). Результатом выполнения метода, с использованием векторов луча и сетки (меша) плоскости - будет ответ, пересекает ли луч сетку и расстояние от

положения камеры

до пересечения.

Вот собственно и все, последний штрих - используя эти данные переместить объект. Альтернатива - это преобразование экранных координат в пространственные.