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