Complete 3axis tutorial native and Web/WASM parity tools

This commit is contained in:
2026-08-24 14:01:30 +08:00
parent 938654b19d
commit 7e90142b63
147 changed files with 17639 additions and 557 deletions

View File

@@ -54,6 +54,27 @@ static double segment_length(const sim_posemath_segment *segment) {
const double dy = segment->end.tran.y - segment->start.tran.y;
const double dz = segment->end.tran.z - segment->start.tran.z;
double value = dx * dx + dy * dy + dz * dz;
if (segment->motion_type == SIM_POSEMATH_CIRCULAR) {
const double sx = segment->start.tran.x - segment->center.x;
const double sy = segment->start.tran.y - segment->center.y;
const double sz = segment->start.tran.z - segment->center.z;
const double ex = segment->end.tran.x - segment->center.x;
const double ey = segment->end.tran.y - segment->center.y;
const double ez = segment->end.tran.z - segment->center.z;
const double radius = sqrt(sx * sx + sy * sy + sz * sz);
const double dot = sx * ex + sy * ey + sz * ez;
const double cross_x = sy * ez - sz * ey;
const double cross_y = sz * ex - sx * ez;
const double cross_z = sx * ey - sy * ex;
const double normal_length = sqrt(segment->normal.x * segment->normal.x + segment->normal.y * segment->normal.y + segment->normal.z * segment->normal.z);
double angle;
if (!isfinite(radius) || radius <= 1e-12 || !isfinite(normal_length) || normal_length <= 1e-12) return 0.0;
angle = atan2((segment->normal.x * cross_x + segment->normal.y * cross_y + segment->normal.z * cross_z) / normal_length, dot);
if (angle < 0.0) angle = -angle;
if (angle <= 1e-12) angle = 2.0 * M_PI;
if (segment->turn > 1 || segment->turn < -1) angle += 2.0 * M_PI * (fabs((double)segment->turn) - 1.0);
return isfinite(radius * angle) && radius * angle > 0.0 ? radius * angle : 0.0;
}
return isfinite(value) && value > 0.0 ? sqrt(value) : 0.0;
}
@@ -94,6 +115,10 @@ int sim_motion_init(sim_motion_queue *queue, double cycle_time, double velocity_
return sim_motion_reset(queue);
}
uint32_t sim_motion_size(void) { return (uint32_t)sizeof(sim_motion_queue); }
uint32_t sim_motion_command_size(void) { return (uint32_t)sizeof(sim_motion_command); }
uint32_t sim_motion_state_size(void) { return (uint32_t)sizeof(sim_motion_state); }
int sim_motion_set_profile(sim_motion_queue *queue, int profile) {
motion_meta *meta = meta_for(queue, 1);
if (meta == NULL || (profile != SIM_MOTION_PROFILE_BLEND && profile != SIM_MOTION_PROFILE_EXACT_STOP)) return SIM_MOTION_ERR_ARGUMENT;
@@ -120,6 +145,11 @@ int sim_motion_set_paused(sim_motion_queue *queue, uint32_t paused) {
motion_meta *meta = meta_for(queue, 1);
if (meta == NULL || paused > 1u) return SIM_MOTION_ERR_ARGUMENT;
meta->paused = paused;
if (paused != 0u) {
meta->current_velocity = 0.0;
meta->current_acceleration = 0.0;
queue->state.velocity = 0.0;
}
return SIM_MOTION_OK;
}