Paso 5: Gestionar selección en la ventanilla - LumberyardGuía de usuario de

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Paso 5: Gestionar selección en la ventanilla

En el procedimiento siguiente, realice cambios en el código de modo que pueda acceder a Modo de componente haciendo doble clic en el componente en la ventanilla.

En Modo de componente, puede modificar las dimensiones del componente Point Light (Luz puntual) directamente en la ventanilla.

Para gestionar la selección en la ventanilla

  1. Abra el archivo EditorPointLightComponent.h en un editor de texto.

  2. Para el último parámetro, añada EditorComponentSelectionRequestsBus::Handler.

    class EditorPointLightComponent : public EditorLightComponent , private AzToolsFramework::EditorComponentSelectionRequestsBus::Handler
  3. Para implementar EditorComponentSelectionRequests, anule las siguientes cuatro funciones:

    1. GetEditorSelectionBoundsViewport –: devuelve un AABB que engloba las extensiones visibles de su componente

    2. EditorSelectionIntersectRayViewport – dónde se implementa la selección del componente

    3. SupportsEditorRayIntersect – : anule esta función y devuelva true si ha implementado EditorSelectionIntersectRayViewport

    4. GetBoundingBoxDisplayType: – se utiliza para depurar para garantizar que el AABB sea la opción correcta. Este ejemplo establece la función en NoBoundingBox

    // EditorComponentSelectionRequests AZ::Aabb GetEditorSelectionBoundsViewport( const AzFramework::ViewportInfo& viewportInfo) override; bool EditorSelectionIntersectRayViewport( const AzFramework::ViewportInfo& viewportInfo, const AZ::Vector3& src, const AZ::Vector3& dir, AZ::VectorFloat& distance) override; bool SupportsEditorRayIntersect() override; AZ::u32 GetBoundingBoxDisplayType() override;
  4. Guarde el archivo.

  5. Abra el archivo EditorPointLightComponent.cpp en un editor de texto.

  6. Conectar y desconectar del EditorComponentSelectionRequestsBus en las funciones Activate y Deactivate del componente.

    void EditorPointLightComponent::Activate() { ... AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(GetEntityId()); ... } void EditorPointLightComponent::Deactivate() { ... AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect(); ... }
  7. Añada los siguientes cambios a su código:

    • Añada una implementación de SupportsEditorRayIntersect para devolver true. De forma predeterminada, esta función devuelve false.

    • Añada una implementación de GetBoundingBoxDisplayType para devolver AzToolsFramework::EditorComponentSelectionRequests::BoundingBoxDisplay::NoBoundingBox.

    bool EditorPointLightComponent::SupportsEditorRayIntersect() { return true; } AZ::u32 EditorPointLightComponent::GetBoundingBoxDisplayType() { return AzToolsFramework::EditorComponentSelectionRequests::BoundingBoxDisplay::NoBoundingBox;}
    nota

    Es posible devolver en su lugar el AzToolsFramework::EditorComponentSelectionRequests::BoundingBoxDisplay:BoundingBox para depuración, pero no debería dejarlo habilitado.

    Las dos funciones siguientes muestran cómo implementar la recogida y soporte de selección.

  8. Añada la implementación para la función GetEditorSelectionBoundsViewport.

  9. Crear un AABB centrado en torno al componente que cubre su extensión. En este caso, obtenga la posición en el espacio del mundo de la entidad y cree un AABB con el radio de la luz puntual. Dado que la luz puntual se representa como una esfera, utilice la función GetPointMaxDistance.

    ejemplo

    El código debería tener el siguiente aspecto.

    AZ::Aabb EditorPointLightComponent::GetEditorSelectionBoundsViewport( const AzFramework::ViewportInfo& viewportInfo) { AZ::Vector3 worldTranslation = AZ::Vector3::CreateZero(); AZ::TransformBus::EventResult( worldTranslation, GetEntityId(), &AZ::TransformInterface::GetWorldTranslation); return AZ::Aabb::CreateCenterRadius(worldTranslation, GetPointMaxDistance()); }

    En el paso siguiente, realizar cambios en la función EditorSelectionIntersectRayViewport.

    ejemplo

    // top of file <AzToolsFramework/Picking/Manipulators/ManipulatorBounds.h> ... bool EditorPointLightComponent::EditorSelectionIntersectRayViewport( const AzFramework::ViewportInfo& viewportInfo, const AZ::Vector3& src, const AZ::Vector3& dir, AZ::VectorFloat& distance) { AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult( worldFromLocal, GetEntityId(), &AZ::TransformInterface::GetWorldTM); const float minorRadius = 0.1f; const float majorRadius = GetPointMaxDistance(); const AZ::Vector3 axes[] = { AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY(), AZ::Vector3::CreateAxisZ() }; enum { AxisCount = 3 }; float distances[AxisCount] = { FLT_MAX, FLT_MAX, FLT_MAX }; bool intersection = false; for (size_t axisIndex = 0; axisIndex < AxisCount; ++axisIndex) { intersection = intersection || AzToolsFramework::Picking::IntersectHollowCylinder( src, dir, worldFromLocal.GetTranslation(), axes[axisIndex], minorRadius, majorRadius, distances[axisIndex]); } distance = AZ::GetMin(AZ::GetMin(distances[0], distances[1]), distances[2]); return intersection; }
  10. Obtenga la posición de la entidad en el espacio del mundo y aproxime un cilindro hueco o un toro plana para representar los anillos del componente Point Light (Luz puntual). El radio menor se corresponde con la parte de tubo del toro, que es su grosor.

    const float minorRadius = 0.1f; const float majorRadius = GetPointMaxDistance();
  11. Desea un radio que tenga un tamaño razonable para que pueda seleccionarlo fácilmente en la ventanilla. El radio principal es la distancia desde el centro del toro al centro del tubo. Dado que tiene un anillo para cada eje, compruebe que cada uno de ellos utilice la función IntersectHollowCylinder, que básicamente se aproxima a un toro.

  12. Pruebe un anillo para cada eje y almacene las distancias de intersección para encontrar la intersección más próxima.

    { intersection = intersection || AzToolsFramework::Picking::IntersectHollowCylinder( src, dir, worldFromLocal.GetTranslation(), axes[axisIndex], minorRadius, majorRadius, distances[axisIndex]); }

    Si se ha producido una intersección correcta, se devuelve la distancia más corta.

  13. Guarde el archivo.