В отличие от трехмерных эквивалентов, преобразования текстур являются двухмерными и используют матрицы преобразования 3x3. Больше нет нужды перемещать по оси ъ и вращать по осям х и у. Остается перемещение по осям х/у (при этом ось у перевернута и направлена вниз) и вращение по оси ъ. Не беспокойтесь, потому что этого будет достаточно!
Самое простое преобразование текстуры, которое может быть выполнено, -это перемещение. Перемещения текстур в БкейЗБ задаются значениями, находящимися в диапазоне от 0 до 1, совсем как в текстурных координатах. Например, если ваша текстура имеет размер 256 пикселей, и вы хотите переместить ее на 64 пикселя вправо, задайте значение перемещения равным 0.25 (четверть размера текстуры, или 64 пикселя).
По умолчанию текстуры облегают многоугольник при любом преобразовании. Это означает, что если переместить текстуру на 64 пикселя вправо, последние 64 колонки пикселей переместятся в левую сторону текстуры. Это облегание текстур нас полностью устраивает, поэтому будем его использовать.
Замечание. DirectXпроверяет все значения, задаваемые к качестве перемещения текстур, чтобы они попадали в диапазон от 0 до 1, так что в этой части от вас не требуется никаких действий. Таким образом, вы можете все время увеличивать или уменьшать значения перемещения и быть уверенными, что они всегда будут лежать в диапазоне от 0 до 1.
Для упрощения вы можете использовать объекты матриц D3DX для создания преобразований текстур. Я знаю, я сказал, что преобразования текстур используют матрицу 3x3, но если вы ограничитесь использованием перемещения по осям х/у и вращением по оси z, вы можете с небольшими изменениями использовать матрицы D3DX 4x4, как показано в следующем разделе "Установка матриц преобразования текстур".
Имея возможность использовать матрицу D3DX, вы можете создать матрицу перемещения так:
// Прототип функции D3DXMatrixTranslation из DX SDK D3DXMATRIX *D3DXMatrixTranslation(D3DXMATRIX *pOut, FLOAT x, FLOAT у, FLOAT z) ;
D3DXMATRIX matTranslation;
D3DXMatrixTranslation(&matTranslation, 0.5f, 0.5f, 0.0f);
В этом коде приведен прототип D3DXMatrixTranslation, которая будет вами использоваться, и небольшая иллюстрация установки преобразования, перемещающего текстуру влево и вверх на половину ширины и высоты текстуры (в пикселях). Заметьте, что перемещение по z равно 0.0, каким оно и должно быть для всех преобразований текстур.
Вспомните, я говорил, что перемещение зависит от размера текстуры. Хотя задаваемые значения и представляют собой процентные соотношения размеров текстуры, на которые необходимо ее переместить (при этом 0 означает 0%, а 1.0 - 100%), если вам нужна абсолютная точность, необходимо работать с пикселями. Например, если вы применяете преобразования, приведенные выше (значение 0.5, которое означает половину размеров текстуры по осям х и у), для текстуры размером 256x128 она переместиться на 128 пикселей влево и 64 пикселя вправо. Если вы запомните принцип работы значений перемещения, то все будет нормально.
Для вращательных преобразований текстуры вы можете использовать функцию D3DXMatrixRotationZ. Помните, что текстуры могут вращаться только относительно оси z. As long as you keep to the z-axis, вы можете использовать матрицу 4x4. Вот пример использования функции D3DXMatrixRotationZ для вращения текстуры на 1.57 радиан.
// Прототип функции D3DXMatrixRotationZ
D3DXMATRIX *D3DXMatrixRotationZ(D3DXMATRIX *pOut, FLOAT Angle); D3DXMATRIX matRotation;
D3DXMatrixRotationZ(&matRotation, 1.57f) ;
Вращение происходит относительно центра координат текстуры, который находится в ее левом верхнем углу. Если вы хотите повернуть текстуру относительно другой точки, необходимо преобразовать текстуру, повернуть ее и снова преобразовать в начальное положение. Вот пример вращения текстуры относительно ее центра на 0.47 радиан:
D3DXMATRIX matTransl, matTrans2, matRotation; D3DXMatrixTranslation(&matTrans1, -0.5f, -0.5f, 0.0f); D3DXMatrixTranslation(&matTrans2, 0.5f, 0.5f, 0.0f); D3DXMatrixRotationZ(&matRotation, 0.47f);
// Скомбинировать матрицы в одно преобразование D3DXMATRIX matTransformation;
matTransformation = matTransl * matRotation * matTrans2;
Как вы можете видеть из кода примера, возможно комбинировать любое число матриц для получения результирующей матрицы преобразования. После того как вы получили ее, необходимо передать ее Direct3D и визуализировать текстуру.
⇐Работа с преобразованиями текстур || Оглавление || Установка матриц преобразования текстуры⇒