fix: display.txt 缺少渲染参数导致盒子不透明

外部引擎(C/C++)直接写 display.txt 时只输出基础物理参数
(DT/NSTEP/method 等),缺少 alpha/ball_color/box_color
等渲染参数,draw.py 读取不到 alpha 回退默认 0.2。

修复:
1. param.json 新增渲染参数(alpha/ball_color/box_color/...)
2. C/C++ 引擎 SimParams 新增对应字段 & JSON 读取
3. C/C++ write_display_txt 写入所有渲染参数 header
4. param.json ball_color/box_color 用数组统一存储
This commit is contained in:
2026-06-12 15:05:46 +08:00
parent dc7bc00616
commit e40393d793
3 changed files with 102 additions and 1 deletions
+44
View File
@@ -39,6 +39,12 @@ typedef struct {
double gravity_strength; /* 万有引力强度 */
int driving_force; /* 驱动力开关 */
int save_trajectory; /* 是否保存完整轨迹文件 */
double alpha[6]; /* 盒子透明度 */
double ball_radius;
double ball_color[3];
double box_color[3];
int use_marker;
double camera_distance, camera_elevation, camera_azimuth;
} SimParams;
/* ========================================================================
@@ -271,6 +277,20 @@ static void json_read_double3(const char *json, const char *key, double out[3])
}
}
static void json_read_double6(const char *json, const char *key, double out[6]) {
char search[256];
snprintf(search, sizeof(search), "\"%s\"", key);
const char *p = strstr(json, search);
if (!p) { for (int i=0;i<6;i++) out[i]=0; return; }
p = strchr(p, '[');
if (!p) { for (int i=0;i<6;i++) out[i]=0; return; }
p++;
for (int i = 0; i < 6; i++) {
while (*p == ' ' || *p == '\t' || *p == '\n' || *p == ',' || *p == ']') p++;
out[i] = strtod(p, (char**)&p);
}
}
/* 读取 param.json */
static int g_gravity_field = 1;
static int g_gravity_interaction = 0;
@@ -306,6 +326,15 @@ static SimParams read_params(const char *path) {
p.gravity_strength = json_read_double(buf, "gravity_strength");
p.driving_force = json_read_int(buf, "driving_force");
p.save_trajectory = json_read_int(buf, "save_trajectory");
/* 渲染参数 */
json_read_double6(buf, "alpha", p.alpha);
p.ball_radius = json_read_double(buf, "ball_radius");
json_read_double3(buf, "ball_color", p.ball_color);
json_read_double3(buf, "box_color", p.box_color);
p.use_marker = json_read_int(buf, "use_marker");
p.camera_distance = json_read_double(buf, "camera_distance");
p.camera_elevation = json_read_double(buf, "camera_elevation");
p.camera_azimuth = json_read_double(buf, "camera_azimuth");
g_gravity_field = p.gravity_field;
g_gravity_interaction = p.gravity_interaction;
g_elastic_force = p.elastic_force;
@@ -880,6 +909,21 @@ static void write_display_txt(const char *path, const Trajectory *traj,
fprintf(f, "dynamic_steps: %d\n", dynamic_steps);
fprintf(f, "T_total: %.16g\n", T_total);
fprintf(f, "box_a: %.16g\n", params->box_a);
fprintf(f, "alpha: %.16g,%.16g,%.16g,%.16g,%.16g,%.16g\n",
params->alpha[0], params->alpha[1], params->alpha[2],
params->alpha[3], params->alpha[4], params->alpha[5]);
fprintf(f, "ball_radius: %.16g\n", params->ball_radius);
fprintf(f, "ball_color_r: %.16g\n", params->ball_color[0]);
fprintf(f, "ball_color_g: %.16g\n", params->ball_color[1]);
fprintf(f, "ball_color_b: %.16g\n", params->ball_color[2]);
fprintf(f, "box_color_r: %.16g\n", params->box_color[0]);
fprintf(f, "box_color_g: %.16g\n", params->box_color[1]);
fprintf(f, "box_color_b: %.16g\n", params->box_color[2]);
fprintf(f, "use_marker: %d\n", params->use_marker);
fprintf(f, "camera_distance: %.16g\n", params->camera_distance);
fprintf(f, "camera_elevation: %.16g\n", params->camera_elevation);
fprintf(f, "camera_azimuth: %.16g\n", params->camera_azimuth);
fprintf(f, "\n");
if (params->driving_force) {
fprintf(f, "driving_force: 1\n");