小编Bur*_*rre的帖子

移动相机以适应3D场景

我正在寻找一种算法来适应视口内的边界框(在我的例子中是一个DirectX场景).我知道用于在正交相机中居中定界球的算法,但是对于边界框和透视相机需要相同的算法.我不能只改变视觉因为这个应用程序有FOV作为用户可编辑变量,所以它必须移动相机.

我有大部分数据:

  • 我有相机的向上矢量
  • 我有边界框的中心点
  • 我有从相机点到盒子中心的观察矢量(方向和距离)
  • 我已经将这些点投影在垂直于相机的平面上,并检索了描述最大/最小X和Y坐标在观察平面内或外的程度的系数.

我遇到的问题:

如何找到相机位置,使其尽可能完美地填充视口(例外情况是,如果宽高比远离1.0,它只需要填充其中一个屏幕轴)?

我尝试过其他一些东西:

  • 使用边界球和切线来查找移动摄像机的比例因子.这不能很好地工作,因为它没有考虑透视投影,其次,球体是我使用的不良边界体积,因为我有很多扁平和长的几何形状.
  • 迭代调用函数以在摄像机位置获得越来越小的错误.这有点工作,但我有时会遇到奇怪的边缘情况,相机位置过冲太多,误差因子增加.此外,在执行此操作时,我没有根据边界矩形的位置重新定位模型.我无法找到一种可靠,可靠的方法来做到这一点.

请帮忙!

3d zoom perspective

23
推荐指数
3
解决办法
2万
查看次数

C#StructLayout/FieldOffset和数组索引

我在使用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)

提前谢谢了!

c# arrays indexing field alignment

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

3d ×1

alignment ×1

arrays ×1

c# ×1

field ×1

indexing ×1

perspective ×1

zoom ×1