2015-06-02 5 views
0

Итак, я нашел эти методы/функции для создания BoundingBox для моей уменьшенной модели, и, видимо, мне пришлось бы масштабировать BoundingBox до того же масштаба. Я не очень хорошо знаком с использованием вершин, но я знаю, как масштабироваться с использованием матриц. Как я мог масштабировать BoundingBox в этом случае? Некоторое время я искал в Интернете, и мне еще предстоит найти решение.C# XNA шкала BoundingBox?

public Vector3[] GetVertexElement(ModelMeshPart meshPart, VertexElementUsage usage) 
{ 
    VertexDeclaration vd = meshPart.VertexBuffer.VertexDeclaration; 
    VertexElement[] elements = vd.GetVertexElements(); 

    Func<VertexElement, bool> elementPredicate = ve => ve.VertexElementUsage == usage && ve.VertexElementFormat == VertexElementFormat.Vector3; 
    if (!elements.Any(elementPredicate)) 
     return null; 

    VertexElement element = elements.First(elementPredicate); 

    Vector3[] vertexData = new Vector3[meshPart.NumVertices]; 
    meshPart.VertexBuffer.GetData((meshPart.VertexOffset * vd.VertexStride) + element.Offset, vertexData, 0, vertexData.Length, vd.VertexStride); 

    return vertexData; 
} 

public BoundingBox? GetBoundingBox(ModelMeshPart meshPart, Matrix transform) 
{ 
    if (meshPart.VertexBuffer == null) 
     return null; 

    Vector3[] positions = GetVertexElement(meshPart, VertexElementUsage.Position); 
    if (positions == null) 
     return null; 

    Vector3[] transformedPositions = new Vector3[positions.Length]; 
    Vector3.Transform(positions, ref transform, transformedPositions); 

    return BoundingBox.CreateFromPoints(transformedPositions); 
} 

public BoundingBox CreateBoundingBox(Model model) 
{ 
    Matrix[] boneTransforms = new Matrix[model.Bones.Count]; 
    model.CopyAbsoluteBoneTransformsTo(boneTransforms); 

    BoundingBox result = new BoundingBox(); 
    foreach (ModelMesh mesh in model.Meshes) 
    { 
     foreach (ModelMeshPart meshPart in mesh.MeshParts) 
     { 
      BoundingBox? meshPartBoundingBox = GetBoundingBox(meshPart, boneTransforms[mesh.ParentBone.Index]); 
      if (meshPartBoundingBox != null) 
      result = BoundingBox.CreateMerged(result, meshPartBoundingBox.Value); 
     } 
    } 
    return result; 
} 

ответ

0

Я не уверен, но я думаю, что tou должен сделать это самостоятельно, создав новый максимум и минимум. Также не уверен, что он работает, но я думаю, что это будет сделано.

private Vector3 Scale(float scale, BoundingBox b) 
{ 
    //Get delta values 
    float dx = Math.Abs(b.Max.X - b.Min.X); 
    float dy = Math.Abs(b.Max.Y - b.Min.Y); 
    float dz = Math.Abs(b.Max.Z - b.Min.Z); 

    //get new delta values 
    float newdx = dx * scale; 
    float newdy = dy * scale; 
    float newdz = dz * scale; 

    //new max vector 
    //oldvalue - removed delta, of course divided by 2(half for max and half for min). 
    Vecotr3 newMax = new Vecotr3(b.Max.X - ((dx-newdx)/2), 
           b.Max.Y - ((dy-newdy)/2), 
           b.Max.Z - ((dz-newdz)/2)); 

    //new min vector 
    //oldvalue + removed delta, of course divided by 2(half for max and half for min). 
    Vecotr3 newMin = new Vecotr3(b.Min.X + ((dx-newdx)/2), 
           b.Min.Y + ((dy-newdy)/2), 
           b.Min.Z + ((dz-newdz)/2)); 

    return new BoundingBox(newMin, mewMax); 
{