Unity Camera剪辑问题

时间:2017-05-01 15:32:16

标签: unity3d clipping

我的相机存在问题,它正在剪切我的3D模型之一(参见下图)。

enter image description here enter image description here

我的相机近剪裁平面已经处于最低值,我的所有着色器都有不透明的渲染模式。

只有我用Fuse CC生成的3D模型才能做到这一点。我用Blender做的那个不剪辑!有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:4)

实际问题似乎是你的模型的界限不正确。 Frustrum剔除允许您的GPU通过测试相机截头的边界来跳过不可见的渲染模型。如果您想要良好的渲染性能,这一点很重要。因此,如果只是解决一个像错误边界这样的简单问题,那么禁用它并不是最好的主意。

如果在场景中选择网格渲染器,则应该看到它被线框立方体包围。该立方体可视化您的网格边界。您应该看到它们在您的Blender型号上非常适合,并且可以在您的Fuse CC型号上使用。

一旦您确认Fuse CC型号的边界已关闭,您可以手动或通过更改导入设置来尝试修复它们。

可以关闭边界的原因:

  • 您正在导入没有动画的模型。如果Unity不知道模型将如何设置动画,则很可能将界限设置得太紧
  • 您使用的顶点着色器会使模型以超出界限的方式扭曲模型
  • 您可以通过IK,Ragdolls或类似的方式在运行时以编程方式移动骨骼

所有这些都可以通过在编辑器中调整网格上的边界来修复,这样它们就可以为运行时动画/修改留下足够的空间。

当满足以下所有条件时,选择的界限很好:

  • 网格永远不会超出界限(由线框立方体可视化)
  • 在不违反第一条规则的情况下,界限尽可能紧。

答案 1 :(得分:1)

感谢Draco18s带领我进行了截头剔除。我发现this post演示了如何停用特定游戏对象上的截头剔除,我的问题就解决了!该脚本有点过时,所以这里是更新版本。

// Update is called once per frame
void Update () {
    // boundsTarget is the center of the camera's frustum, in world coordinates:
    Vector3 camPosition = Camera.main.transform.position;
    Vector3 normCamForward = Vector3.Normalize(Camera.main.transform.forward);
    float boundsDistance = (Camera.main.farClipPlane - Camera.main.nearClipPlane) / 2 + Camera.main.nearClipPlane;
    Vector3 boundsTarget = camPosition + (normCamForward * boundsDistance);

    // The game object's transform will be applied to the mesh's bounds for frustum culling checking.
    // We need to "undo" this transform by making the boundsTarget relative to the game object's transform:
    Vector3 realtiveBoundsTarget = this.transform.InverseTransformPoint(boundsTarget);

    // Set the bounds of the mesh to be a 1x1x1 cube (actually doesn't matter what the size is)
    SkinnedMeshRenderer mesh = this.GetComponent<SkinnedMeshRenderer>();
    mesh.localBounds = new Bounds(realtiveBoundsTarget, Vector3.one);
}

将此脚本放在导致问题的GameObject上。

注意:用游戏对象所具有的网格渲染器类型替换SkinnedMeshRenderer。