我目前正在开发屏幕上有模型的应用程序,需要了解如何缩放到模型(当屏幕上的几何图形占据尽可能多的位置时,可以使用技巧)。
我的矩阵相当简单。我从鼠标输入中获取_xrot
、_yrot
和_scale
。
var projectionMatrix = Matrix4.CreateOrthographic(_viewportSize.Width, _viewportSize.Height, 10000f, -10000f);
var viewMatrix = Matrix4.CreateRotationY((float)(_xrot)) *
Matrix4.CreateRotationX((float)(_yrot)) *
Matrix4.CreateScale((float)_scale);
var modelMatrix = Matrix4.Identity;
然后我将这些矩阵与坐标相乘,得到渲染的几何体。
此外,我有边界框的点(最大值和最小值X、Y和Z)。我试图自己解决这一切,但我的努力失败了。
var maxPoint = new Vector3(_maxX, _maxY, _maxZ);
var minPoint = new Vector3(_minX, _minY, _minZ);
var pToProject = maxPoint.Length > minPoint.Length ? maxPoint : minPoint;
var projectedPoint =
Vector3.TransformPerspective(pToProject, modelMatrix * viewMatrix * projectionMatrix); //transform max point to NDC
var minP = Math.Min(projectedPoint.X, Math.Min(projectedPoint.Y, projectedPoint.Z));
_scale = 1/Math.Abs(minP);
有什么建议吗?
我找到了解决方案。首先,我收集了边界框的所有角点,然后将它们与MVP矩阵相乘。之后,我将1/X
和1/Y
进行除法,并查找最小反推,将_scale
与该值相乘,得到新的viewMatrix
。