Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Программирование игр, графики и искусственного интеллекта > Использование 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 точки вокруг машины и двигать их матрицами, но буду пробовать Ваш способ. Спасибо! ![]() |
Автор: 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 - массив изменённых векторов |