CtrEditor/Documentation/MemoriadeEvolucion.md

4.6 KiB

Aqui se mantiene la memoria de evolucion de las distintas decisiones que fueron tomadas y porque

BEPU.cs : SimulationManagerBEPU gestor de la simulacion con el motor BEPUphysics y punto de creacion y modificacion de los objetos dentro del mundo que se derivan des simBase

simBase : Clase base que da un marco a el resto de los objetos simBarrera : Simula una fotocelula con un espejo usando RayCast simBotella : Simula una botella que puede transitar por los transportes simTransporte o simCurve simCurve : Simula una curva o arco de curva de transporte simDescarte : Permite la eliminacion localizada de botellas en un punto del mundo simGuia : Es un box con el que las botellas pueden colisionar y cambiar de direccion. simTransporte : Es un box por donde las botellas pueden desplazarse usando un truco de aplicar la Velocity.Linear pero sin integrar esta velocidad para que no se mueva el objeto transporte.

  • Se usaron esferas en vez de cilindros para mejorar la eficiencia. En el Debug3D si se usan cilindros. Revertido: Se ha vuelto a usar Cylinder para las simBotella ya que el nuevo sistema de fricción debería prevenir la rotación indeseada que ocurría con los LinearAxisMotor.

  • Se reemplazó el sistema de LinearAxisMotor que actuaba sobre las simBotella por un sistema basado en fricción. Los transportes (simTransporte y simCurve) ahora son cuerpos cinemáticos que no se mueven de su sitio. Para lograr que arrastren a las botellas, se les asigna una velocidad (Velocity.Linear o Velocity.Angular) justo antes de que el solver se ejecute (en OnSubstepStarted) y se les quita justo después (en OnSubstepEnded). Esto permite que los cuerpos cinemáticos transmitan su velocidad a través de la fricción durante la simulación, pero evita que el PoseIntegrator los desplace de su posición original, ya que su velocidad es cero cuando se integra la pose.

  • Para aumentar la estabilidad de las simBotella y evitar que roten descontroladamente sobre su eje Z al ser arrastradas, se implementó un callback IntegrateVelocity personalizado. Este callback identifica las botellas durante la integración y les aplica un amortiguamiento angular (AngularDamping) adicional solo en el eje Z. Se descartó la idea inicial de modificar dinámicamente la masa de las botellas dentro de este callback, ya que la arquitectura de BEPUphysics no permite cambiar la masa o la inercia de un cuerpo durante la fase de integración de velocidad.

  • Originalmente se habia puesto todos los objetos en awaken para poder usar las colisiones constantemente incluso con objetos en modo sleep para que los simBarrera puedan detectar las colisiones. Ahora que se usar RayCast podemos dejar que las simBotellas se duerman

  • La unica clase que se ha terminado de refactorizar respecto a el cambio de coordenadas es simBarrera y ucPhotocell. El concepto es poder separar usando metodos de SimulationManagerBEPU y estructuras como BarreraData la conversion de coordenadas de WPF a coordenadas BEPU. Para esto se usa CoordinateConverter que permite bidireccionalmente convertir las coordenadas pero esto solo se debe usar en SimulationManagerBEPU las clases derivadas de osBase solo deben manejar coordenadas WPF, mientras que las clases dervadas de simBase solo deben almacenar y usar coordenadas BEPU. La z tambien es algo que se debe transferir a SimulationManagerBEPU ya que los objetos simBase deberian recibir tambien sus coordenadas de Z desde SimulationManagerBEPU y ser SimulationManagerBEPU el que gestione las Z.

  • Se ha implementado un sistema para evitar que las botellas (simBotella) "floten" o se eleven de manera irreal por la acumulación de presión en la simulación. Cada botella ahora registra si está en contacto con un transporte y almacena la última coordenada Z válida durante dicho contacto. Si la botella deja de tener contacto con transportes por varios frames consecutivos, se incrementa un contador de "presión". Al superar un umbral, el sistema reestablece la posición Z de la botella a su última altura conocida, previniendo la flotación. Este contador de presión se decrementa rápidamente al volver a hacer contacto con un transporte.

  • Cuando una botella (simBotella) entra en contacto con un transporte de frenado (simTransporte con isBrake = true), su posición se ajusta automáticamente para centrarla en el eje longitudinal del transporte. Esto se realiza una única vez, en el primer contacto, para asegurar un acoplamiento suave y predecible. La posición de la botella se proyecta sobre la línea central del transporte y su velocidad lateral se anula, evitando que la botella se desvíe mientras frena y se alinea con el flujo de salida.