Se añadió una nueva librería para la simulación y se realizaron mejoras en la gestión de motores en simTransporte y simCurve. Se unificaron métodos para la creación de motores lineales y angulares, optimizando la lógica de detección de colisiones y la visualización de triángulos en 3D. Además, se corrigieron errores en la extracción de triángulos de BEPU, asegurando que se utilicen coordenadas locales para evitar transformaciones duplicadas. Se implementaron métodos para activar y desactivar el modo de depuración de triángulos, mejorando la experiencia de visualización.

This commit is contained in:
Miguel 2025-07-03 11:47:09 +02:00
parent 501f0ffb9b
commit c1584e8d55
3 changed files with 304 additions and 622 deletions

View File

@ -5,6 +5,9 @@
}, },
{ {
"path": "../Libraries/LibS7Adv" "path": "../Libraries/LibS7Adv"
},
{
"path": "../Librerias/bepuphysics2-master"
} }
], ],
"settings": {} "settings": {}

File diff suppressed because it is too large Load Diff

View File

@ -71,7 +71,7 @@ namespace CtrEditor.Simulacion
private Dictionary<simBase, ModelVisual3D> simBaseToModelMap; private Dictionary<simBase, ModelVisual3D> simBaseToModelMap;
private Dictionary<simBase, ShapeDimensions> lastKnownDimensions; private Dictionary<simBase, ShapeDimensions> lastKnownDimensions;
// ✅ NUEVO: Flag de debug para mostrar triángulos individuales de curvas // ✅ CORREGIDO: Flag de debug para mostrar triángulos individuales de curvas (true temporalmente para verificar)
public static bool DebugShowIndividualTriangles { get; set; } = true; public static bool DebugShowIndividualTriangles { get; set; } = true;
public HelixViewport3D Viewport3D public HelixViewport3D Viewport3D
@ -386,103 +386,85 @@ namespace CtrEditor.Simulacion
} }
/// <summary> /// <summary>
/// ✅ NUEVO: Crea mesh directamente desde los triángulos reales de BEPU /// ✅ CORREGIDO: Crea mesh desde los triángulos locales de BEPU
/// Extrae la geometría exacta que está almacenada en la simulación física /// Extrae la geometría exacta en coordenadas locales para evitar transformación duplicada
/// </summary> /// </summary>
private void CreateCurveMeshFromBEPUTriangles(MeshBuilder meshBuilder, simCurve curve) private void CreateCurveMeshFromBEPUTriangles(MeshBuilder meshBuilder, simCurve curve)
{ {
try try
{ {
// ✅ EXTRAER TRIÁNGULOS REALES DE BEPU // ✅ EXTRAER TRIÁNGULOS LOCALES DE BEPU (sin transformación duplicada)
var realTriangles = curve.GetRealBEPUTriangles(); var localTriangles = curve.GetRealBEPUTriangles();
if (realTriangles.Length == 0) if (localTriangles.Length == 0)
{ {
System.Diagnostics.Debug.WriteLine($"[3D BEPU] WARNING: No se pudieron extraer triángulos reales, usando fallback"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] WARNING: No se pudieron extraer triángulos locales, usando fallback");
CreateCurveMeshFallback(meshBuilder, curve); CreateCurveMeshFallback(meshBuilder, curve);
return; return;
} }
System.Diagnostics.Debug.WriteLine($"[3D BEPU] Creando mesh desde {realTriangles.Length} triángulos reales de BEPU"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] Creando mesh desde {localTriangles.Length} triángulos locales de BEPU");
// ✅ USAR TRIÁNGULOS EXACTOS DE BEPU // ✅ USAR TRIÁNGULOS LOCALES DE BEPU (la transformación se aplicará automáticamente en UpdateVisualization)
foreach (var triangle in realTriangles) foreach (var triangle in localTriangles)
{ {
// Convertir triángulos de BEPU a puntos 3D de Helix // Convertir triángulos de BEPU a puntos 3D de Helix
var pointA = new Point3D(triangle.A.X, triangle.A.Y, triangle.A.Z); var pointA = new Point3D(triangle.A.X, triangle.A.Y, triangle.A.Z);
var pointB = new Point3D(triangle.B.X, triangle.B.Y, triangle.B.Z); var pointB = new Point3D(triangle.B.X, triangle.B.Y, triangle.B.Z);
var pointC = new Point3D(triangle.C.X, triangle.C.Y, triangle.C.Z); var pointC = new Point3D(triangle.C.X, triangle.C.Y, triangle.C.Z);
// Agregar triángulo exacto al mesh // Agregar triángulo en coordenadas locales al mesh
meshBuilder.AddTriangle(pointA, pointB, pointC); meshBuilder.AddTriangle(pointA, pointB, pointC);
} }
System.Diagnostics.Debug.WriteLine($"[3D BEPU] ✅ Mesh creado usando triángulos reales de BEPU"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] ✅ Mesh creado usando triángulos locales de BEPU (transformación aplicada automáticamente)");
} }
catch (Exception ex) catch (Exception ex)
{ {
System.Diagnostics.Debug.WriteLine($"[3D BEPU] ERROR extrayendo triángulos reales: {ex.Message}"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] ERROR extrayendo triángulos locales: {ex.Message}");
System.Diagnostics.Debug.WriteLine($"[3D BEPU] Fallback a geometría recreada"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] Fallback a geometría recreada");
CreateCurveMeshFallback(meshBuilder, curve); CreateCurveMeshFallback(meshBuilder, curve);
} }
} }
/// <summary> /// <summary>
/// ✅ NUEVO: Función de debug que muestra triángulos individuales reales de BEPU /// ✅ CORREGIDO: Función de debug que muestra triángulos reales de BEPU sin offset artificial
/// Cada triángulo se renderiza de manera separada con offset para poder hacer debug visual /// Los triángulos se muestran exactamente como están en la física (planos, sin separación)
/// </summary> /// </summary>
private void CreateCurveDebugMeshWithIndividualTriangles(MeshBuilder meshBuilder, simCurve curve) private void CreateCurveDebugMeshWithIndividualTriangles(MeshBuilder meshBuilder, simCurve curve)
{ {
try try
{ {
// ✅ EXTRAER TRIÁNGULOS REALES DE BEPU PARA DEBUG // ✅ EXTRAER TRIÁNGULOS LOCALES DE BEPU PARA DEBUG
var realTriangles = curve.GetRealBEPUTriangles(); var localTriangles = curve.GetRealBEPUTriangles();
if (realTriangles.Length == 0) if (localTriangles.Length == 0)
{ {
System.Diagnostics.Debug.WriteLine($"[3D Debug] WARNING: No hay triángulos reales para debug, usando fallback"); System.Diagnostics.Debug.WriteLine($"[3D Debug] WARNING: No hay triángulos locales para debug, usando fallback");
CreateCurveMeshFallback(meshBuilder, curve); CreateCurveMeshFallback(meshBuilder, curve);
return; return;
} }
System.Diagnostics.Debug.WriteLine($"[3D Debug] Creando debug de {realTriangles.Length} triángulos reales individuales"); System.Diagnostics.Debug.WriteLine($"[3D Debug] Creando debug de {localTriangles.Length} triángulos reales planos");
// ✅ MOSTRAR CADA TRIÁNGULO SEPARADO CON OFFSET PARA DEBUG // ✅ MOSTRAR TRIÁNGULOS REALES SIN OFFSET ARTIFICIAL
float triangleSeparation = 0.02f; // Separación entre triángulos para debug visual for (int i = 0; i < localTriangles.Length; i++)
for (int i = 0; i < realTriangles.Length; i++)
{ {
var triangle = realTriangles[i]; var triangle = localTriangles[i];
// Calcular centroide del triángulo // ✅ USAR TRIÁNGULOS EXACTOS SIN MODIFICACIÓN
var centroid = (triangle.A + triangle.B + triangle.C) / 3f; var pointA = new Point3D(triangle.A.X, triangle.A.Y, triangle.A.Z);
var pointB = new Point3D(triangle.B.X, triangle.B.Y, triangle.B.Z);
var pointC = new Point3D(triangle.C.X, triangle.C.Y, triangle.C.Z);
// Calcular normal del triángulo // Agregar triángulo real sin modificaciones
var edge1 = triangle.B - triangle.A;
var edge2 = triangle.C - triangle.A;
var normal = Vector3.Normalize(Vector3.Cross(edge1, edge2));
// Offset hacia arriba para separar triángulos visualmente
var offset = normal * triangleSeparation * (i + 1);
// Aplicar offset a todos los vértices
var offsetA = triangle.A + offset;
var offsetB = triangle.B + offset;
var offsetC = triangle.C + offset;
// Convertir a puntos 3D de Helix
var pointA = new Point3D(offsetA.X, offsetA.Y, offsetA.Z);
var pointB = new Point3D(offsetB.X, offsetB.Y, offsetB.Z);
var pointC = new Point3D(offsetC.X, offsetC.Y, offsetC.Z);
// Agregar triángulo separado
meshBuilder.AddTriangle(pointA, pointB, pointC); meshBuilder.AddTriangle(pointA, pointB, pointC);
// ✅ DEBUG: Agregar bordes para visualizar mejor cada triángulo // ✅ DEBUG: Agregar bordes delgados para visualizar límites entre triángulos
AddDebugTriangleEdges(meshBuilder, pointA, pointB, pointC, 0.005f); AddDebugTriangleEdges(meshBuilder, pointA, pointB, pointC, 0.002f);
} }
System.Diagnostics.Debug.WriteLine($"[3D Debug] ✅ Debug mesh creado con triángulos reales separados"); System.Diagnostics.Debug.WriteLine($"[3D Debug] ✅ Debug mesh creado con triángulos reales planos (sin offset artificial)");
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -985,16 +967,26 @@ namespace CtrEditor.Simulacion
} }
/// <summary> /// <summary>
/// ✅ NUEVO: Activa o desactiva el modo debug para mostrar triángulos individuales de curvas /// ✅ MODO DEBUG DE TRIÁNGULOS DE CURVAS:
///
/// TRUE (Debug Mode): Muestra triángulos individuales reales de BEPU con bordes visibles
/// FALSE (Normal Mode): Muestra superficie continua suave
///
/// Uso desde código:
/// // Activar modo debug para ver triángulos reales
/// visualizationManager.ShowRealTriangles();
///
/// // Desactivar para ver superficie continua
/// visualizationManager.ShowContinuousSurface();
/// </summary> /// </summary>
/// <param name="enableDebug">True para activar debug, false para modo normal</param> /// <param name="enableDebug">True para mostrar triángulos reales, false para superficie continua</param>
/// <param name="forceRefresh">True para forzar actualización inmediata de todas las curvas</param> /// <param name="forceRefresh">True para forzar actualización inmediata de todas las curvas</param>
public void SetDebugTrianglesMode(bool enableDebug, bool forceRefresh = true) public void SetDebugTrianglesMode(bool enableDebug, bool forceRefresh = true)
{ {
bool wasChanged = DebugShowIndividualTriangles != enableDebug; bool wasChanged = DebugShowIndividualTriangles != enableDebug;
DebugShowIndividualTriangles = enableDebug; DebugShowIndividualTriangles = enableDebug;
System.Diagnostics.Debug.WriteLine($"[3D Debug] Debug triangles mode: {(enableDebug ? "ENABLED" : "DISABLED")}"); System.Diagnostics.Debug.WriteLine($"[3D Debug] Modo triángulos reales: {(enableDebug ? "ACTIVADO (triángulos individuales)" : "DESACTIVADO (superficie continua)")}");
if (wasChanged && forceRefresh) if (wasChanged && forceRefresh)
{ {
@ -1002,6 +994,22 @@ namespace CtrEditor.Simulacion
} }
} }
/// <summary>
/// ✅ NUEVO: Método simple para activar el modo debug - muestra triángulos reales planos
/// </summary>
public void ShowRealTriangles()
{
SetDebugTrianglesMode(true);
}
/// <summary>
/// ✅ NUEVO: Método simple para activar el modo superficie continua
/// </summary>
public void ShowContinuousSurface()
{
SetDebugTrianglesMode(false);
}
/// <summary> /// <summary>
/// ✅ NUEVO: Fuerza la regeneración de todas las visualizaciones de curvas /// ✅ NUEVO: Fuerza la regeneración de todas las visualizaciones de curvas
/// Útil cuando se cambia el modo debug /// Útil cuando se cambia el modo debug
@ -1077,17 +1085,17 @@ namespace CtrEditor.Simulacion
debugInfo.AppendLine(meshInfo); debugInfo.AppendLine(meshInfo);
debugInfo.AppendLine($""); debugInfo.AppendLine($"");
// ✅ EXTRAER Y MOSTRAR TRIÁNGULOS REALES // ✅ EXTRAER Y MOSTRAR TRIÁNGULOS REALES (LOCALES)
var realTriangles = curve.GetRealBEPUTriangles(); var localTriangles = curve.GetRealBEPUTriangles();
debugInfo.AppendLine($"TRIÁNGULOS REALES EXTRAÍDOS: {realTriangles.Length}"); debugInfo.AppendLine($"TRIÁNGULOS REALES EXTRAÍDOS (LOCALES): {localTriangles.Length}");
debugInfo.AppendLine($""); debugInfo.AppendLine($"");
// Mostrar los primeros triángulos con detalles completos // Mostrar los primeros triángulos locales con detalles completos
int maxToShow = Math.Min(10, realTriangles.Length); int maxToShow = Math.Min(5, localTriangles.Length);
for (int i = 0; i < maxToShow; i++) for (int i = 0; i < maxToShow; i++)
{ {
var triangle = realTriangles[i]; var triangle = localTriangles[i];
debugInfo.AppendLine($"Triángulo {i + 1}:"); debugInfo.AppendLine($"Triángulo LOCAL {i + 1}:");
debugInfo.AppendLine($" A: ({triangle.A.X:F4}, {triangle.A.Y:F4}, {triangle.A.Z:F4})"); debugInfo.AppendLine($" A: ({triangle.A.X:F4}, {triangle.A.Y:F4}, {triangle.A.Z:F4})");
debugInfo.AppendLine($" B: ({triangle.B.X:F4}, {triangle.B.Y:F4}, {triangle.B.Z:F4})"); debugInfo.AppendLine($" B: ({triangle.B.X:F4}, {triangle.B.Y:F4}, {triangle.B.Z:F4})");
debugInfo.AppendLine($" C: ({triangle.C.X:F4}, {triangle.C.Y:F4}, {triangle.C.Z:F4})"); debugInfo.AppendLine($" C: ({triangle.C.X:F4}, {triangle.C.Y:F4}, {triangle.C.Z:F4})");
@ -1101,9 +1109,24 @@ namespace CtrEditor.Simulacion
debugInfo.AppendLine($""); debugInfo.AppendLine($"");
} }
if (realTriangles.Length > maxToShow) // ✅ NUEVO: Mostrar también algunos triángulos en coordenadas mundiales
var worldTriangles = curve.GetWorldBEPUTriangles();
debugInfo.AppendLine($"TRIÁNGULOS REALES EXTRAÍDOS (MUNDIALES): {worldTriangles.Length}");
debugInfo.AppendLine($"");
for (int i = 0; i < Math.Min(3, worldTriangles.Length); i++)
{ {
debugInfo.AppendLine($"... y {realTriangles.Length - maxToShow} triángulos más"); var triangle = worldTriangles[i];
debugInfo.AppendLine($"Triángulo MUNDIAL {i + 1}:");
debugInfo.AppendLine($" A: ({triangle.A.X:F4}, {triangle.A.Y:F4}, {triangle.A.Z:F4})");
debugInfo.AppendLine($" B: ({triangle.B.X:F4}, {triangle.B.Y:F4}, {triangle.B.Z:F4})");
debugInfo.AppendLine($" C: ({triangle.C.X:F4}, {triangle.C.Y:F4}, {triangle.C.Z:F4})");
debugInfo.AppendLine($"");
}
if (localTriangles.Length > maxToShow)
{
debugInfo.AppendLine($"... y {localTriangles.Length - maxToShow} triángulos locales más");
} }
debugInfo.AppendLine($""); debugInfo.AppendLine($"");
@ -1118,18 +1141,18 @@ namespace CtrEditor.Simulacion
} }
/// <summary> /// <summary>
/// ✅ NUEVO: Activa la visualización de triángulos reales de BEPU /// ✅ CORREGIDO: Activa la visualización de triángulos locales de BEPU
/// Muestra los triángulos exactos extraídos de la simulación física /// Muestra los triángulos exactos extraídos de la simulación física en coordenadas locales
/// </summary> /// </summary>
/// <param name="enable">True para mostrar triángulos reales, false para superficie normal</param> /// <param name="enable">True para mostrar triángulos locales, false para superficie normal</param>
public void SetRealBEPUTrianglesMode(bool enable) public void SetRealBEPUTrianglesMode(bool enable)
{ {
SetDebugTrianglesMode(enable); SetDebugTrianglesMode(enable);
System.Diagnostics.Debug.WriteLine($"[3D BEPU] Modo triángulos reales: {(enable ? "ACTIVADO" : "DESACTIVADO")}"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] Modo triángulos locales: {(enable ? "ACTIVADO" : "DESACTIVADO")}");
} }
/// <summary> /// <summary>
/// ✅ NUEVO: Verifica si una curva tiene triángulos válidos en BEPU /// ✅ CORREGIDO: Verifica si una curva tiene triángulos válidos en BEPU
/// </summary> /// </summary>
/// <param name="curve">Curva a verificar</param> /// <param name="curve">Curva a verificar</param>
/// <returns>True si tiene triángulos válidos</returns> /// <returns>True si tiene triángulos válidos</returns>
@ -1139,7 +1162,7 @@ namespace CtrEditor.Simulacion
try try
{ {
var triangles = curve.GetRealBEPUTriangles(); var triangles = curve.GetRealBEPUTriangles(); // Obtiene triángulos locales
bool hasTriangles = triangles.Length > 0; bool hasTriangles = triangles.Length > 0;
System.Diagnostics.Debug.WriteLine($"[3D BEPU] Curva tiene {triangles.Length} triángulos válidos: {hasTriangles}"); System.Diagnostics.Debug.WriteLine($"[3D BEPU] Curva tiene {triangles.Length} triángulos válidos: {hasTriangles}");