Unity 相机剪辑问题
Unity Camera Clipping Issue
我的相机出现问题,它正在剪裁我的一个 3D 模型(参见下图)。
我的相机 Near Clipping Planes 已经处于最低值,我所有的着色器都有不透明渲染模式。
它只对我使用 Fuse CC 生成的 3D 模型执行此操作。我用 Blender 做的那个不剪辑!有任何想法吗?谢谢!
感谢 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);
}
将此脚本放在导致问题的游戏对象上。
注意:将 SkinnedMeshRenderer 替换为您的游戏对象拥有的网格渲染器类型。
实际问题似乎是您的模型边界不正确。
Frustrum 剔除允许您的 GPU 通过针对相机平截头体测试边界来跳过视线之外的渲染模型。如果您想要良好的渲染性能,这一点很重要。所以禁用它不是最好的主意,如果它只是解决一个简单的问题,比如不正确的边界。
如果您 select 场景中的网格渲染器,您应该会看到它被线框立方体包围。该立方体可视化您的网格边界。您应该会发现它们非常适合您的 Blender 模型,而与您的 Fuse CC 模型相去甚远。
一旦您确认您的 Fuse CC 模型的边界已关闭,您可以尝试手动或通过更改导入设置来修复它们。
边界可以关闭的原因:
- 您正在导入没有动画的模型。如果 Unity 不知道模型将如何动画,它很可能会将边界设置得太紧
- 您使用的顶点着色器扭曲了模型,使其超出了边界
- 您在运行时通过 IK、Ragdolls 或类似方式以编程方式四处移动骨骼
所有这些都可以通过在编辑器中调整网格的边界来解决,以便它们为您的运行时留出足够的空间animations/modifications。
当满足以下所有条件时,边界选择得很好:
- 网格永远不会越界(如线框立方体所示)
- 在不违反第一条规则的情况下,边界越小越好
我的相机出现问题,它正在剪裁我的一个 3D 模型(参见下图)。
我的相机 Near Clipping Planes 已经处于最低值,我所有的着色器都有不透明渲染模式。
它只对我使用 Fuse CC 生成的 3D 模型执行此操作。我用 Blender 做的那个不剪辑!有任何想法吗?谢谢!
感谢 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);
}
将此脚本放在导致问题的游戏对象上。
注意:将 SkinnedMeshRenderer 替换为您的游戏对象拥有的网格渲染器类型。
实际问题似乎是您的模型边界不正确。 Frustrum 剔除允许您的 GPU 通过针对相机平截头体测试边界来跳过视线之外的渲染模型。如果您想要良好的渲染性能,这一点很重要。所以禁用它不是最好的主意,如果它只是解决一个简单的问题,比如不正确的边界。
如果您 select 场景中的网格渲染器,您应该会看到它被线框立方体包围。该立方体可视化您的网格边界。您应该会发现它们非常适合您的 Blender 模型,而与您的 Fuse CC 模型相去甚远。
一旦您确认您的 Fuse CC 模型的边界已关闭,您可以尝试手动或通过更改导入设置来修复它们。
边界可以关闭的原因:
- 您正在导入没有动画的模型。如果 Unity 不知道模型将如何动画,它很可能会将边界设置得太紧
- 您使用的顶点着色器扭曲了模型,使其超出了边界
- 您在运行时通过 IK、Ragdolls 或类似方式以编程方式四处移动骨骼
所有这些都可以通过在编辑器中调整网格的边界来解决,以便它们为您的运行时留出足够的空间animations/modifications。
当满足以下所有条件时,边界选择得很好:
- 网格永远不会越界(如线框立方体所示)
- 在不违反第一条规则的情况下,边界越小越好