Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Использование ComputeBoundingBox. Проблемы


Автор: hazard 29.10.2009, 22:11
Написал простенькое приложение - управление трёхмерной моделью машинки на C# c использованием DirectX. Процесс отображения перемещения машины в пространстве работает замечательно - машина реально перемещается, но метод ComputeBoundingBox класса Geometry возвращает одни и те же координаты максимального и минимального вектора меша машинки - координаты первоначального помещения меша на карту. Что я делаю не так?

Метод отрисовки машинки:
 public Draw(Device device, float x, float y, float z, float rotAngle)
{
            device.SetTransform(TransformType.World, Microsoft.DirectX.Matrix.RotationY(rotAngle) * Microsoft.DirectX.Matrix.Translation(x, y, z));
            for (int i = 0; i < carMaterials.Length; i++)
            {
                device.Material = carMaterials[i];
                device.SetTexture(0, carTextures[i]);
                carMesh.DrawSubset(i);
            }
}

Код определения ограничивающих векторов:

       VertexBuffer vb = carMesh.VertexBuffer;
       GraphicsStream stm = vb.Lock(0, 0, LockFlags.None);
       Geometry.ComputeBoundingBox(stm, carMesh.NumberVertices, carMesh.VertexFormat, out v1, out v2);
       vb.Unlock();
       vb.Dispose();

      v1 и v2 каждый раз одинаковые

          
           

Автор: mr.DUDA 31.10.2009, 12:57
Дык Geometry.ComputeBoundingBox проходит по вертексам и возвращает min/max позиций из вертексов. Буфер не модифицируется, min и max остаются неизменными; машинка двигается мировой трансформацией (строка с TransformType.World в примере). Всё что нужно сделать чтобы бокс соответствовал ожидаемому, это применить ту же трансформацию к min и max векторам, умножив векторы на матрицу (Matrix.RotationY(rotAngle) * Matrix.Translation(x, y, z)).  Geometry. ComputeBoundingBox достаточно вызвать 1 раз.

Автор: hazard 1.11.2009, 20:44
Я додумался создать свои 4 точки вокруг машины и двигать их матрицами, но буду пробовать Ваш способ. Спасибо! smile

Автор: hazard 1.11.2009, 21:21
Если кому будет интересно - перемещение минимального и максимального вектора, ограничивающих меш:

Vector4[] newMinMaxArray = Vector3.Transform(arrayMinMax, Microsoft.DirectX.Matrix.RotationY(rotAngle) * Microsoft.DirectX.Matrix.Translation(x, y, z));

где, arrayMinMax - массив состоящий из минимального и максимального вектора, newMinMaxArray - массив изменённых векторов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)