2013-11-16 1 views
0

Я изучаю DirectX 11 и добрался до точки, где у меня квадрат. Мои 4 вершины определяются как:DirectX 11 Перемещение моего квадрата

VertexPos vertices[] = 
{ 
    XMFLOAT3(-0.2f, 0.2f, 0.2f), 
    XMFLOAT3(0.2f, 0.2f, 0.2f), 
    XMFLOAT3(-0.2f, -0.2f, 0.2f), 
    XMFLOAT3(0.2f, -0.2f, 0.2f) 

}; 

Они затем пройти через необходимые этапы для визуализации на экране (как в привет мир программирования DirectX). Я объединил некоторый код из прямой входной демонстрации и хотел бы иметь возможность перемещать квадрат с помощью клавиш со стрелками. У меня до сих пор:

void SquareMove::Update(float dt) 
{  
    keyboardDevice_->GetDeviceState(sizeof(keyboardKeys_), (LPVOID)&keyboardKeys_); 

    // Button down event. 
    if (KEYDOWN(prevKeyboardKeys_, DIK_DOWN) && !KEYDOWN(keyboardKeys_, DIK_DOWN)) 
    { 
    PostQuitMessage(0); 
    } 

(Это было, чтобы проверить, что мой, например, стрелка вниз обратный вызов работает.). Я сейчас не понимаю, как реально реализовать шаги, необходимые для перемещения моей площади. Я понимаю, что это связано с D3DXMatrixTranslation, но я изо всех сил пытаюсь понять, как все они свернуты вместе, чтобы выполнить необходимые операции. Спасибо

+1

Вам было бы лучше, если бы вы сначала научились математике и начинали с 2D-наблюдения, так как ваша третья координата такая же. На самом деле, если бы я был вами, запустите DirectX3d и сделайте 2d-проводную фрейму, скажем, Paintbox. –

+0

Это звучит полезно. Я действительно уверен в матричной манипуляции (я много программирую в MATLAB), но просто пытаюсь найти примеры того, как все это объединяется в прямом X. Какая вещь Paintbox, о которой вы говорите? –

+0

Th оконный компонент PaintBox ... –

ответ

2

Я не совсем понимаю, действительно ли вы понимаете эффект матрицы перевода или нет. Есть много замечательных руководств, которые помогут вам описать детали реализации, поэтому я просто расскажу о том, что мне интересно, о том, как я сначала понял рендеринг.

Одним словом, вы должны научиться визуализировать влияние математики на свой объект. Вершины вашего квадрата в настоящее время находятся в так называемом «модельном» и «локальном» пространстве. То есть они просто дают информацию о форме и размере модели (относящейся к 0,0,0 мировым координатам). Теперь вы должны поместить его в свой «мир». Для этого вам нужно переместить («перевести») каждую из вершин вашего объекта на новое место, сохранив размер и форму, которые вы только что определили в пространстве модели, - чтобы перевести каждую из них с одинаковой длиной и в одном направлении , для слов с одним и тем же вектором, применить один и тот же расчет к каждой из вершин.

В рендеринге трансформации объекта осуществляется посредством матриц. Каждая матрица имеет значения в определенных положениях, которые при умножении на координаты объекта каким-то образом изменят ее. Их последующее применение в координатах объекта (посредством умножения) применяет последовательные преобразования - сначала объект может быть повернут - это повернет его вокруг центра вашего мира, то есть вокруг (0,0,0), затем переведет, а затем снова повернет. Это просто умножение на 3 матрицы.

Конкретная реализация может быть найдена в большом количестве мест: http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-5

+0

Это очень приятное описание спасибо. Теперь я понял, что не понял.Я недооценил, что нужно сделать, но эта ссылка очень полезна, я попытаюсь сейчас пробиться через нее. –

0

Просто для полноты это, как мне удалось это сделать. В функции визуализации я добавил следующую

XMMATRIX m_Translation = XMMatrixTranslation(0.0f, fY, 0.0f); 
XMMATRIX mvp = world*vpMatrix_*m_Translation; 

(Раньше это было просто world*viewPortMatrix)

где Fy контролировалась с помощью кнопки вниз событий

if (KEYDOWN(prevKeyboardKeys_, DIK_DOWN) && !KEYDOWN(keyboardKeys_, DIK_DOWN)) 
{ 
    fY -= 0.1f; 
} 

И при запуске приложения мой объект движется!