我正在寻找一种算法来适应视口内的边界框(在我的例子中是一个DirectX场景).我知道用于在正交相机中居中定界球的算法,但是对于边界框和透视相机需要相同的算法.我不能只改变视觉因为这个应用程序有FOV作为用户可编辑变量,所以它必须移动相机.
我有大部分数据:
我遇到的问题:
如何找到相机位置,使其尽可能完美地填充视口(例外情况是,如果宽高比远离1.0,它只需要填充其中一个屏幕轴)?
我尝试过其他一些东西:
请帮忙!
我在使用FieldOffset时遇到了一些问题.下面的代码是一个例子,它对我不起作用:
[StructLayout(LayoutKind.Explicit)]
public struct IndexStruct {
[FieldOffset(0)]
public byte[] data;
[FieldOffset(0)]
public short[] idx16;
[FieldOffset(0)]
public int[] idx32;
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我将名为"data"的数组设置为序列化字节数组,然后尝试使用"idx16"字段将数据检索为short,则索引仍然作为byte []对齐.这意味着idx16 1获取数据中的第二个字节,而不是第二个16位字(字节2和3).如果我执行逆I索引短路而不是字节,则意味着偏移对齐从源数据继承.我的问题是,有办法解决这个问题吗?我知道我可以通过乘以元素的大小来补偿索引值,但还有另一种方法吗?
这是我在StackOverflow上找到的答案,但在尝试该代码时,结果证明它无法正常工作.使用以下代码在VS中使用单元测试尝试使用它,但没有成功:
[TestMethod()]
public void SumTest() {
float[] fArr = {2.0f, 0.5f, 0.0f, 1.0f};
MemoryStream ms = new MemoryStream();
for (int i = 0; i < fArr.Length; i++) {
ms.Write(BitConverter.GetBytes(fArr[i]), 0, sizeof(float));
}
byte[] buff = ms.ToArray();
double expected = 3.5f;
double actual = Sum(buff);
Assert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢了!