【发布时间】:2015-06-04 04:55:50
【问题描述】:
所以我找到了这些方法/函数来为我的缩小模型创建一个边界框,显然我必须将边界框缩放到相同的比例。我不太熟悉顶点的使用,但我知道如何使用矩阵进行缩放。在这种情况下,我如何缩放 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;
}
【问题讨论】:
标签: c# xna bounding-box