Мировая космическая координата в Direct3D

У меня есть фоновое изображение на холсте Direct3D. Я рисую круг в определенном месте на фоне. После масштабирования/панорамирования холста с помощью камеры (используя мир/вид/проекцию) фон обновляется.

Теперь проблема в том, что я не могу найти предыдущую позицию на изображении, чтобы перерисовать круг. Я использую следующую функцию (DirectX 11.1), чтобы найти координату. Но это не работает.

XMVECTOR Camera::Unproject(Windows::Foundation::Rect viewPort, Windows::Foundation::Point location)
{
XMFLOAT3 worldPosition(location.X, location.Y, 0.0f);
XMVECTOR worldVector = XMLoadFloat3(&worldPosition);
return XMVector3Unproject(worldVector, viewPort.X, viewPort.Y, viewPort.Width, viewPort.Height, 0.0f, 1.0f, this->Projection(), this->View(), this->World());   
}

Я даже пробовал с XMMatrixIdentity в качестве мира. Но никакого успеха. Кто-нибудь может мне помочь, пожалуйста!


person Liton    schedule 17.10.2012    source источник
comment
Зачем нужно перерисовывать круг? как вы сказали, фон будет обновляться в зависимости от движения камеры, поэтому круг на фоне будет обновляться (увеличиваться/уменьшаться) автоматически.   -  person zdd    schedule 17.10.2012
comment
@zdd Цвет и текстура круга должны быть изменены с новым коэффициентом масштабирования.   -  person Liton    schedule 17.10.2012
comment
затем просто нарисуйте его там, где он был раньше, и измените цвет и текстуру, так как вы двигаете камеру, камера меняет только ваш вид, она не меняет ориентацию круга. вам не нужно вычислять для него новый центр.   -  person zdd    schedule 17.10.2012


Ответы (1)


Это нетривиальная проблема с предоставленной вами информацией.

2D-точка на экране не может быть сопоставлена ​​с одной 3D-точкой в ​​сцене. Каждая 2D-точка соответствует целому лучу. Поэтому, если вы рисуете круг в определенной 2D-позиции, круг можно разместить в разных позициях сцены. Вероятно, поэтому вы получаете странные результаты.

Если вы переместите камеру, луч, вероятно, станет «более видимым». т.е. он будет отображаться не в одну 2D-точку, а в 2D-луч. И ваш круг находится где-то на этом луче. Видите ли, нет никакого способа получить новое положение круга с предоставленной информацией. Можно только сказать, что оно находится где-то на определенном луче.

Но, возможно, вы можете указать положение круга. Может быть, он размещен на объекте, на виртуальной плоскости или что-то в этом роде. Тогда эта проблема решаема.

Во-первых, вам нужно найти 3D-позицию круга. Используйте XMVector3Unproject дважды. Один раз с координатой z 0 и один раз с 1. Это даст вам точку, очень близкую к камере, и точку, которая находится далеко. Это твой луч. Затем вам нужно вычислить положение круга на этом луче. Например. путем пересечения луча с плоскостью. Эта 3D-позиция может быть спроецирована обратно на экран (XMVector3Project) с новыми параметрами камеры и определяет новую позицию круга.

И да, вам, вероятно, следует определить матрицу идентичности как матрицу мира.

person Nico Schertler    schedule 22.10.2012