diff --git a/SparkClient.sln.DotSettings.user b/SparkClient.sln.DotSettings.user index 79d18e2..117353a 100644 --- a/SparkClient.sln.DotSettings.user +++ b/SparkClient.sln.DotSettings.user @@ -15,6 +15,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -28,6 +29,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -68,6 +70,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -77,6 +80,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/Views/UserControl/ViewportData/Helper/ObjExporter.cs b/Views/UserControl/ViewportData/Helper/ObjExporter.cs index 82417d2..91b7c64 100644 --- a/Views/UserControl/ViewportData/Helper/ObjExporter.cs +++ b/Views/UserControl/ViewportData/Helper/ObjExporter.cs @@ -47,7 +47,6 @@ public class ObjExporter } resultPoints.Add("yao", selFaceVector); - StringBuilder sb = new StringBuilder(); // 顶点列表 @@ -77,7 +76,7 @@ public class ObjExporter sb.AppendLine($"v {vertex.X} {vertex.Y} {vertex.Z}"); } - // 3. 写入每个面(f行) + // 3. 写入每个面(f行),包括正面和反面 foreach (var face in resultPoints) { sb.AppendLine($"# Face: {face.Key}"); @@ -85,20 +84,28 @@ public class ObjExporter // 获取面上的所有顶点并排序 List faceVertices = face.Value; // Vector3 center = GetCenterOfVertices(faceVertices); - // faceVertices.Sort((v1, v2) => v1.AngleWithCenter(center).CompareTo(v2.AngleWithCenter(center))); - // center - // 输出面 + // faceVertices.Sort((v1, v2) => GetAngle(v1, center).CompareTo(GetAngle(v2, center))); + + // 正面:按顺时针顺序输出 sb.Append("f"); foreach (var vertex in faceVertices) { - // 获取顶点的索引,OBJ格式从1开始 sb.Append($" {vertexIndexMap[vertex] + 1}"); } sb.AppendLine(); + + // 反面:按逆时针顺序输出(反转顶点顺序) + sb.Append("f"); + for (int i = faceVertices.Count - 1; i >= 0; i--) + { + sb.Append($" {vertexIndexMap[faceVertices[i]] + 1}"); + } + sb.AppendLine(); } // 4. 写入文件 File.WriteAllText(outputPath, sb.ToString()); + } // 计算一组顶点的中心点(用于排序) @@ -113,4 +120,21 @@ public class ObjExporter } return new Vector3(centerX / vertices.Count, centerY / vertices.Count, centerZ / vertices.Count); } + + private static float GetAngle(Vector3 vertex, Vector3 center) + { + // 计算顶点与中心的方向向量 + Vector3 direction = vertex - center; + + // 在XY平面上计算角度 + float angle = (float)Math.Atan2(direction.Y, direction.X); // 返回的是弧度,[-π, π] + + // 如果你想要角度范围 [0, 2π],可以做如下处理 + if (angle < 0) + { + angle += MathF.PI * 2; + } + + return angle; + } } \ No newline at end of file