【问题标题】:(UE4) Is there a method of getting all actors in camera view?(UE4) 有没有一种方法可以让所有演员都进入摄像机视野?
【发布时间】:2015-11-11 23:17:07
【问题描述】:

正如标题所说,我希望能够在虚幻引擎 4 中获取摄像机视图内的所有演员。

我已经想到了两种方法可以做到这一点:1)使用“boxtracebyobject”形式的形状跟踪,它可以工作,但有时会出现故障,并且难以识别多个重叠的演员。 2)使用“BoxOverlappingActors”,虽然我还没有完全弄清楚如何使用它。

如果有人知道让演员进入摄像机视图的正确方法,我会竖起耳朵!

【问题讨论】:

    标签: trace unreal-engine4


    【解决方案1】:

    更新

    A much better answer has been posted on Unreal Answers by Rama

    使用AActor::GetLastRenderTime() 找出每个actor 的最后绘制时间,或使用UPrimitiveComponent::LastRenderTime 找出基元本身。他的回答解释了如何使用它。

    原答案:

    正如您所建议的,当 Unreal 必须检查以进行剔除时,您必须对碰撞体积做一些事情似乎很奇怪,因此我找到了以下方法来查询该信息:

    首先我们必须从相机创建一个FSceneViewThis code is taken from the UE Answers question.

    APlayerCameraManager* Manager = World->GetFirstPlayerController()->PlayerCameraManager;
    ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController();
    
    FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(
        LocalPlayer->ViewportClient->Viewport,
        World->Scene,
        LocalPlayer->ViewportClient->EngineShowFlags)
        .SetRealtimeUpdate(true));
    
    FVector ViewLocation;
    FRotator ViewRotation;
    FSceneView* SceneView = LocalPlayer->CalcSceneView(&ViewFamily, /*out*/ ViewLocation, /*out*/ ViewRotation, LocalPlayer->ViewportClient->Viewport);
    

    一旦我们创建了视图,我们就可以遍历所有原始组件(包括网格),然后我们可以使用静态网格的SceneProxy 的边界和视图的边界进行我们自己的剔除。

    for (TObjectIterator<UPrimitiveComponent> ScenePrimitsItr; ScenePrimitsItr; ++ScenePrimitsItr)
    {
        // Using the Object iterator so we have to skip objects not in the 
        // relevant world
        if (ScenePrimitsItr->GetWorld() == World)
        {
            FPrimitiveSceneProxy* Proxy = ScenePrimitsItr->SceneProxy;
            if (Proxy)
            {
                bool bIsShown = 
                    SceneView->ViewFrustum.IntersectSphere(Proxy->GetBounds().Origin, Proxy->GetBounds().SphereRadius)||
                    SceneView->ViewFrustum.IntersectBox(Proxy->GetBounds().Origin, Proxy->GetBounds().BoxExtent);
            }
        }
    }
    

    截锥体检查来自方法FrustumCull 中的SceneVisibility.cpp 此方法并不理想,因为a) 涉及复制该检查并且b) 执行两次测试。但是,我找不到实际查询结果的方法。它似乎存储在FViewInfo 的位数组中。不幸的是,这个信息没有暴露在渲染器模块之外。

    【讨论】:

      【解决方案2】:

      你可以试试这个来创建一个演员数组:

      但我不知道如果你想要的班级演员太多,表演是否明智。

      【讨论】:

      • 这可能是答案,但是,有没有办法将获取类的所有参与者仅限于该类的参与者和相机的视图?
      猜你喜欢
      • 2016-04-24
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多