载入中...
搜索中...
未找到
Joint3D.cpp
浏览该文件的文档.
1#include "physics/Joint3D.h"
2
3#include "physics/Body3D.h"
4#include "physics/World3D.h"
5#include "common/Exception.h"
6
7#include <box3d/box3d.h>
8
9#include <cmath>
10
11namespace eve::physics {
12namespace {
13
14void nonNegative(float value, const char *operation, const char *name) {
15 if (!std::isfinite(value) || value < 0.f)
16 throw eve::Exception("%s: %s must be finite and >= 0", operation, name);
17}
18
19void finite(float value, const char *operation, const char *name) {
20 if (!std::isfinite(value)) throw eve::Exception("%s: %s must be finite", operation, name);
21}
22
23} // namespace
24
25Joint3D::Joint3D(World3D *world, Body3D *bodyA, Body3D *bodyB, b3JointId jointId, PhysicsJointHandle runtimeHandle,
26 Kind kind, int id)
27 : world_(world),
28 bodyA_(bodyA),
29 bodyB_(bodyB),
30 jointId_(jointId),
31 runtimeHandle_(runtimeHandle),
32 kind_(kind),
33 id_(id) {}
34
36
37bool Joint3D::isValid() const { return b3Joint_IsValid(jointId_); }
38
40 if (world_) world_->forgetJoint(this);
41 jointId_ = {};
42 world_ = nullptr;
43 bodyA_ = nullptr;
44 bodyB_ = nullptr;
45 runtimeHandle_ = PhysicsJointHandle::invalid();
46}
47
49 if (isValid()) b3DestroyJoint(jointId_, true);
50 if (world_) world_->forgetJoint(this);
51 invalidate();
52}
53
54std::string Joint3D::getKind() const {
55 switch (kind_) {
56 case Kind::Distance: return "distance";
57 case Kind::Revolute: return "revolute";
58 case Kind::Prismatic: return "prismatic";
59 case Kind::Spherical: return "spherical";
60 case Kind::Wheel: return "wheel";
61 case Kind::Weld: return "weld";
62 case Kind::Motor: return "motor";
63 case Kind::Parallel: return "parallel";
64 case Kind::Filter: return "filter";
65 }
66 return "distance";
67}
68
69int Joint3D::getBodyAId() const { return bodyA_ ? bodyA_->getId() : -1; }
70int Joint3D::getBodyBId() const { return bodyB_ ? bodyB_->getId() : -1; }
71
72void Joint3D::setCollideConnected(bool collide) {
73 if (isValid()) b3Joint_SetCollideConnected(jointId_, collide);
74}
75
77 return isValid() ? b3Joint_GetCollideConnected(jointId_) : false;
78}
79
80void Joint3D::setForceThreshold(float threshold) {
81 if (!isValid()) return;
82 nonNegative(threshold, "Joint3D.setForceThreshold", "threshold");
83 b3Joint_SetForceThreshold(jointId_, threshold);
84}
86 return isValid() ? b3Joint_GetForceThreshold(jointId_) : 0.f;
87}
88void Joint3D::setTorqueThreshold(float threshold) {
89 if (!isValid()) return;
90 nonNegative(threshold, "Joint3D.setTorqueThreshold", "threshold");
91 b3Joint_SetTorqueThreshold(jointId_, threshold);
92}
94 return isValid() ? b3Joint_GetTorqueThreshold(jointId_) : 0.f;
95}
96
97#define EV_JOINT_VEC_GETTER(name, expression, member) \
98 float Joint3D::name() const { return isValid() ? expression(jointId_).member : 0.f; }
99EV_JOINT_VEC_GETTER(getConstraintForceX, b3Joint_GetConstraintForce, x)
100EV_JOINT_VEC_GETTER(getConstraintForceY, b3Joint_GetConstraintForce, y)
101EV_JOINT_VEC_GETTER(getConstraintForceZ, b3Joint_GetConstraintForce, z)
102EV_JOINT_VEC_GETTER(getConstraintTorqueX, b3Joint_GetConstraintTorque, x)
103EV_JOINT_VEC_GETTER(getConstraintTorqueY, b3Joint_GetConstraintTorque, y)
104EV_JOINT_VEC_GETTER(getConstraintTorqueZ, b3Joint_GetConstraintTorque, z)
105#undef EV_JOINT_VEC_GETTER
106
108 return isValid() ? b3Joint_GetLinearSeparation(jointId_) : 0.f;
109}
111 return isValid() ? b3Joint_GetAngularSeparation(jointId_) : 0.f;
112}
113
114void Joint3D::requireKind(Kind expected, const char *operation) const {
115 if (!isValid()) throw eve::Exception("%s: joint destroyed", operation);
116 if (kind_ != expected) throw eve::Exception("%s: incompatible joint kind", operation);
117}
118
120 requireKind(Kind::Distance, "Joint3D.setDistanceLength");
121 nonNegative(length, "Joint3D.setDistanceLength", "length");
122 b3DistanceJoint_SetLength(jointId_, length);
123}
125 requireKind(Kind::Distance, "Joint3D.getDistanceLength");
126 return b3DistanceJoint_GetLength(jointId_);
127}
129 requireKind(Kind::Distance, "Joint3D.getDistanceCurrentLength");
130 return b3DistanceJoint_GetCurrentLength(jointId_);
131}
132void Joint3D::setDistanceSpring(bool enabled, float hertz, float dampingRatio) {
133 requireKind(Kind::Distance, "Joint3D.setDistanceSpring");
134 nonNegative(hertz, "Joint3D.setDistanceSpring", "hertz");
135 nonNegative(dampingRatio, "Joint3D.setDistanceSpring", "dampingRatio");
136 b3DistanceJoint_SetSpringHertz(jointId_, hertz);
137 b3DistanceJoint_SetSpringDampingRatio(jointId_, dampingRatio);
138 b3DistanceJoint_EnableSpring(jointId_, enabled);
139}
141 requireKind(Kind::Distance, "Joint3D.setDistanceLimits");
142 nonNegative(minimum, "Joint3D.setDistanceLimits", "minimum");
143 nonNegative(maximum, "Joint3D.setDistanceLimits", "maximum");
144 if (minimum > maximum)
145 throw eve::Exception("Joint3D.setDistanceLimits: minimum must be <= maximum");
146 b3DistanceJoint_SetLengthRange(jointId_, minimum, maximum);
147 b3DistanceJoint_EnableLimit(jointId_, enabled);
148}
149void Joint3D::setDistanceMotor(bool enabled, float speed, float maxForce) {
150 requireKind(Kind::Distance, "Joint3D.setDistanceMotor");
151 finite(speed, "Joint3D.setDistanceMotor", "speed");
152 nonNegative(maxForce, "Joint3D.setDistanceMotor", "maxForce");
153 b3DistanceJoint_SetMotorSpeed(jointId_, speed);
154 b3DistanceJoint_SetMaxMotorForce(jointId_, maxForce);
155 b3DistanceJoint_EnableMotor(jointId_, enabled);
156}
157
158void Joint3D::setRevoluteSpring(bool enabled, float targetAngle, float hertz,
159 float dampingRatio) {
160 requireKind(Kind::Revolute, "Joint3D.setRevoluteSpring");
161 finite(targetAngle, "Joint3D.setRevoluteSpring", "targetAngle");
162 nonNegative(hertz, "Joint3D.setRevoluteSpring", "hertz");
163 nonNegative(dampingRatio, "Joint3D.setRevoluteSpring", "dampingRatio");
164 b3RevoluteJoint_SetTargetAngle(jointId_, targetAngle);
165 b3RevoluteJoint_SetSpringHertz(jointId_, hertz);
166 b3RevoluteJoint_SetSpringDampingRatio(jointId_, dampingRatio);
167 b3RevoluteJoint_EnableSpring(jointId_, enabled);
168}
169void Joint3D::setRevoluteLimits(bool enabled, float lower, float upper) {
170 requireKind(Kind::Revolute, "Joint3D.setRevoluteLimits");
171 finite(lower, "Joint3D.setRevoluteLimits", "lower");
172 finite(upper, "Joint3D.setRevoluteLimits", "upper");
173 if (lower > upper)
174 throw eve::Exception("Joint3D.setRevoluteLimits: lower must be <= upper");
175 b3RevoluteJoint_SetLimits(jointId_, lower, upper);
176 b3RevoluteJoint_EnableLimit(jointId_, enabled);
177}
178void Joint3D::setRevoluteMotor(bool enabled, float speed, float maxTorque) {
179 requireKind(Kind::Revolute, "Joint3D.setRevoluteMotor");
180 finite(speed, "Joint3D.setRevoluteMotor", "speed");
181 nonNegative(maxTorque, "Joint3D.setRevoluteMotor", "maxTorque");
182 b3RevoluteJoint_SetMotorSpeed(jointId_, speed);
183 b3RevoluteJoint_SetMaxMotorTorque(jointId_, maxTorque);
184 b3RevoluteJoint_EnableMotor(jointId_, enabled);
185}
187 requireKind(Kind::Revolute, "Joint3D.getRevoluteAngle");
188 return b3RevoluteJoint_GetAngle(jointId_);
189}
191 requireKind(Kind::Revolute, "Joint3D.getRevoluteMotorTorque");
192 return b3RevoluteJoint_GetMotorTorque(jointId_);
193}
194
195void Joint3D::setPrismaticSpring(bool enabled, float targetTranslation, float hertz,
196 float dampingRatio) {
197 requireKind(Kind::Prismatic, "Joint3D.setPrismaticSpring");
198 finite(targetTranslation, "Joint3D.setPrismaticSpring", "targetTranslation");
199 nonNegative(hertz, "Joint3D.setPrismaticSpring", "hertz");
200 nonNegative(dampingRatio, "Joint3D.setPrismaticSpring", "dampingRatio");
201 b3PrismaticJoint_SetTargetTranslation(jointId_, targetTranslation);
202 b3PrismaticJoint_SetSpringHertz(jointId_, hertz);
203 b3PrismaticJoint_SetSpringDampingRatio(jointId_, dampingRatio);
204 b3PrismaticJoint_EnableSpring(jointId_, enabled);
205}
206void Joint3D::setPrismaticLimits(bool enabled, float lower, float upper) {
207 requireKind(Kind::Prismatic, "Joint3D.setPrismaticLimits");
208 finite(lower, "Joint3D.setPrismaticLimits", "lower");
209 finite(upper, "Joint3D.setPrismaticLimits", "upper");
210 if (lower > upper)
211 throw eve::Exception("Joint3D.setPrismaticLimits: lower must be <= upper");
212 b3PrismaticJoint_SetLimits(jointId_, lower, upper);
213 b3PrismaticJoint_EnableLimit(jointId_, enabled);
214}
215void Joint3D::setPrismaticMotor(bool enabled, float speed, float maxForce) {
216 requireKind(Kind::Prismatic, "Joint3D.setPrismaticMotor");
217 finite(speed, "Joint3D.setPrismaticMotor", "speed");
218 nonNegative(maxForce, "Joint3D.setPrismaticMotor", "maxForce");
219 b3PrismaticJoint_SetMotorSpeed(jointId_, speed);
220 b3PrismaticJoint_SetMaxMotorForce(jointId_, maxForce);
221 b3PrismaticJoint_EnableMotor(jointId_, enabled);
222}
224 requireKind(Kind::Prismatic, "Joint3D.getPrismaticTranslation");
225 return b3PrismaticJoint_GetTranslation(jointId_);
226}
228 requireKind(Kind::Prismatic, "Joint3D.getPrismaticSpeed");
229 return b3PrismaticJoint_GetSpeed(jointId_);
230}
232 requireKind(Kind::Prismatic, "Joint3D.getPrismaticMotorForce");
233 return b3PrismaticJoint_GetMotorForce(jointId_);
234}
235
237 requireKind(Kind::Spherical, "Joint3D.setSphericalConeLimit");
238 finite(angle, "Joint3D.setSphericalConeLimit", "angle");
239 if (angle < 0.f || angle > B3_PI)
240 throw eve::Exception("Joint3D.setSphericalConeLimit: angle must be in [0, pi]");
241 b3SphericalJoint_SetConeLimit(jointId_, angle);
242 b3SphericalJoint_EnableConeLimit(jointId_, enabled);
243}
244void Joint3D::setSphericalTwistLimits(bool enabled, float lower, float upper) {
245 requireKind(Kind::Spherical, "Joint3D.setSphericalTwistLimits");
246 finite(lower, "Joint3D.setSphericalTwistLimits", "lower");
247 finite(upper, "Joint3D.setSphericalTwistLimits", "upper");
248 if (lower > upper || lower < -0.99f * B3_PI || upper > 0.99f * B3_PI)
249 throw eve::Exception(
250 "Joint3D.setSphericalTwistLimits: require -0.99*pi <= lower <= upper <= 0.99*pi");
251 b3SphericalJoint_SetTwistLimits(jointId_, lower, upper);
252 b3SphericalJoint_EnableTwistLimit(jointId_, enabled);
253}
254void Joint3D::setSphericalMotor(bool enabled, float velocityX, float velocityY,
255 float velocityZ, float maxTorque) {
256 requireKind(Kind::Spherical, "Joint3D.setSphericalMotor");
257 finite(velocityX, "Joint3D.setSphericalMotor", "velocityX");
258 finite(velocityY, "Joint3D.setSphericalMotor", "velocityY");
259 finite(velocityZ, "Joint3D.setSphericalMotor", "velocityZ");
260 nonNegative(maxTorque, "Joint3D.setSphericalMotor", "maxTorque");
261 b3SphericalJoint_SetMotorVelocity(jointId_, {velocityX, velocityY, velocityZ});
262 b3SphericalJoint_SetMaxMotorTorque(jointId_, maxTorque);
263 b3SphericalJoint_EnableMotor(jointId_, enabled);
264}
266 requireKind(Kind::Spherical, "Joint3D.getSphericalConeAngle");
267 return b3SphericalJoint_GetConeAngle(jointId_);
268}
270 requireKind(Kind::Spherical, "Joint3D.getSphericalTwistAngle");
271 return b3SphericalJoint_GetTwistAngle(jointId_);
272}
273
274void Joint3D::setWheelSuspension(bool enabled, float hertz, float dampingRatio) {
275 requireKind(Kind::Wheel, "Joint3D.setWheelSuspension");
276 nonNegative(hertz, "Joint3D.setWheelSuspension", "hertz");
277 nonNegative(dampingRatio, "Joint3D.setWheelSuspension", "dampingRatio");
278 b3WheelJoint_SetSuspensionHertz(jointId_, hertz);
279 b3WheelJoint_SetSuspensionDampingRatio(jointId_, dampingRatio);
280 b3WheelJoint_EnableSuspension(jointId_, enabled);
281}
282void Joint3D::setWheelSuspensionLimits(bool enabled, float lower, float upper) {
283 requireKind(Kind::Wheel, "Joint3D.setWheelSuspensionLimits");
284 finite(lower, "Joint3D.setWheelSuspensionLimits", "lower");
285 finite(upper, "Joint3D.setWheelSuspensionLimits", "upper");
286 if (lower > upper)
287 throw eve::Exception("Joint3D.setWheelSuspensionLimits: lower must be <= upper");
288 b3WheelJoint_SetSuspensionLimits(jointId_, lower, upper);
289 b3WheelJoint_EnableSuspensionLimit(jointId_, enabled);
290}
291void Joint3D::setWheelSpinMotor(bool enabled, float speed, float maxTorque) {
292 requireKind(Kind::Wheel, "Joint3D.setWheelSpinMotor");
293 finite(speed, "Joint3D.setWheelSpinMotor", "speed");
294 nonNegative(maxTorque, "Joint3D.setWheelSpinMotor", "maxTorque");
295 b3WheelJoint_SetSpinMotorSpeed(jointId_, speed);
296 b3WheelJoint_SetMaxSpinTorque(jointId_, maxTorque);
297 b3WheelJoint_EnableSpinMotor(jointId_, enabled);
298}
299void Joint3D::setWheelSteering(bool enabled, float targetAngle, float hertz,
300 float dampingRatio, float maxTorque) {
301 requireKind(Kind::Wheel, "Joint3D.setWheelSteering");
302 finite(targetAngle, "Joint3D.setWheelSteering", "targetAngle");
303 nonNegative(hertz, "Joint3D.setWheelSteering", "hertz");
304 nonNegative(dampingRatio, "Joint3D.setWheelSteering", "dampingRatio");
305 nonNegative(maxTorque, "Joint3D.setWheelSteering", "maxTorque");
306 b3WheelJoint_SetTargetSteeringAngle(jointId_, targetAngle);
307 b3WheelJoint_SetSteeringHertz(jointId_, hertz);
308 b3WheelJoint_SetSteeringDampingRatio(jointId_, dampingRatio);
309 b3WheelJoint_SetMaxSteeringTorque(jointId_, maxTorque);
310 b3WheelJoint_EnableSteering(jointId_, enabled);
311}
312void Joint3D::setWheelSteeringLimits(bool enabled, float lower, float upper) {
313 requireKind(Kind::Wheel, "Joint3D.setWheelSteeringLimits");
314 finite(lower, "Joint3D.setWheelSteeringLimits", "lower");
315 finite(upper, "Joint3D.setWheelSteeringLimits", "upper");
316 if (lower > upper)
317 throw eve::Exception("Joint3D.setWheelSteeringLimits: lower must be <= upper");
318 b3WheelJoint_SetSteeringLimits(jointId_, lower, upper);
319 b3WheelJoint_EnableSteeringLimit(jointId_, enabled);
320}
322 requireKind(Kind::Wheel, "Joint3D.getWheelSpinSpeed");
323 return b3WheelJoint_GetSpinSpeed(jointId_);
324}
326 requireKind(Kind::Wheel, "Joint3D.getWheelSpinTorque");
327 return b3WheelJoint_GetSpinTorque(jointId_);
328}
330 requireKind(Kind::Wheel, "Joint3D.getWheelSteeringAngle");
331 return b3WheelJoint_GetSteeringAngle(jointId_);
332}
334 requireKind(Kind::Wheel, "Joint3D.getWheelSteeringTorque");
335 return b3WheelJoint_GetSteeringTorque(jointId_);
336}
337
338void Joint3D::setWeldLinearSpring(float hertz, float dampingRatio) {
339 requireKind(Kind::Weld, "Joint3D.setWeldLinearSpring");
340 nonNegative(hertz, "Joint3D.setWeldLinearSpring", "hertz");
341 nonNegative(dampingRatio, "Joint3D.setWeldLinearSpring", "dampingRatio");
342 b3WeldJoint_SetLinearHertz(jointId_, hertz);
343 b3WeldJoint_SetLinearDampingRatio(jointId_, dampingRatio);
344}
345void Joint3D::setWeldAngularSpring(float hertz, float dampingRatio) {
346 requireKind(Kind::Weld, "Joint3D.setWeldAngularSpring");
347 nonNegative(hertz, "Joint3D.setWeldAngularSpring", "hertz");
348 nonNegative(dampingRatio, "Joint3D.setWeldAngularSpring", "dampingRatio");
349 b3WeldJoint_SetAngularHertz(jointId_, hertz);
350 b3WeldJoint_SetAngularDampingRatio(jointId_, dampingRatio);
351}
353 requireKind(Kind::Weld, "Joint3D.getWeldLinearHertz");
354 return b3WeldJoint_GetLinearHertz(jointId_);
355}
357 requireKind(Kind::Weld, "Joint3D.getWeldLinearDampingRatio");
358 return b3WeldJoint_GetLinearDampingRatio(jointId_);
359}
361 requireKind(Kind::Weld, "Joint3D.getWeldAngularHertz");
362 return b3WeldJoint_GetAngularHertz(jointId_);
363}
365 requireKind(Kind::Weld, "Joint3D.getWeldAngularDampingRatio");
366 return b3WeldJoint_GetAngularDampingRatio(jointId_);
367}
368
369void Joint3D::setMotorLinearVelocity(float vx, float vy, float vz) {
370 requireKind(Kind::Motor, "Joint3D.setMotorLinearVelocity");
371 finite(vx, "Joint3D.setMotorLinearVelocity", "vx");
372 finite(vy, "Joint3D.setMotorLinearVelocity", "vy");
373 finite(vz, "Joint3D.setMotorLinearVelocity", "vz");
374 b3MotorJoint_SetLinearVelocity(jointId_, b3Vec3{vx, vy, vz});
375}
376void Joint3D::setMotorAngularVelocity(float wx, float wy, float wz) {
377 requireKind(Kind::Motor, "Joint3D.setMotorAngularVelocity");
378 finite(wx, "Joint3D.setMotorAngularVelocity", "wx");
379 finite(wy, "Joint3D.setMotorAngularVelocity", "wy");
380 finite(wz, "Joint3D.setMotorAngularVelocity", "wz");
381 b3MotorJoint_SetAngularVelocity(jointId_, b3Vec3{wx, wy, wz});
382}
383void Joint3D::setMotorVelocityLimits(float maxForce, float maxTorque) {
384 requireKind(Kind::Motor, "Joint3D.setMotorVelocityLimits");
385 nonNegative(maxForce, "Joint3D.setMotorVelocityLimits", "maxForce");
386 nonNegative(maxTorque, "Joint3D.setMotorVelocityLimits", "maxTorque");
387 b3MotorJoint_SetMaxVelocityForce(jointId_, maxForce);
388 b3MotorJoint_SetMaxVelocityTorque(jointId_, maxTorque);
389}
390void Joint3D::setMotorLinearSpring(float hertz, float dampingRatio, float maxForce) {
391 requireKind(Kind::Motor, "Joint3D.setMotorLinearSpring");
392 nonNegative(hertz, "Joint3D.setMotorLinearSpring", "hertz");
393 nonNegative(dampingRatio, "Joint3D.setMotorLinearSpring", "dampingRatio");
394 nonNegative(maxForce, "Joint3D.setMotorLinearSpring", "maxForce");
395 b3MotorJoint_SetLinearHertz(jointId_, hertz);
396 b3MotorJoint_SetLinearDampingRatio(jointId_, dampingRatio);
397 b3MotorJoint_SetMaxSpringForce(jointId_, maxForce);
398}
399void Joint3D::setMotorAngularSpring(float hertz, float dampingRatio, float maxTorque) {
400 requireKind(Kind::Motor, "Joint3D.setMotorAngularSpring");
401 nonNegative(hertz, "Joint3D.setMotorAngularSpring", "hertz");
402 nonNegative(dampingRatio, "Joint3D.setMotorAngularSpring", "dampingRatio");
403 nonNegative(maxTorque, "Joint3D.setMotorAngularSpring", "maxTorque");
404 b3MotorJoint_SetAngularHertz(jointId_, hertz);
405 b3MotorJoint_SetAngularDampingRatio(jointId_, dampingRatio);
406 b3MotorJoint_SetMaxSpringTorque(jointId_, maxTorque);
407}
409 requireKind(Kind::Motor, "Joint3D.getMotorLinearVelocityX");
410 return b3MotorJoint_GetLinearVelocity(jointId_).x;
411}
413 requireKind(Kind::Motor, "Joint3D.getMotorLinearVelocityY");
414 return b3MotorJoint_GetLinearVelocity(jointId_).y;
415}
417 requireKind(Kind::Motor, "Joint3D.getMotorLinearVelocityZ");
418 return b3MotorJoint_GetLinearVelocity(jointId_).z;
419}
421 requireKind(Kind::Motor, "Joint3D.getMotorAngularVelocityX");
422 return b3MotorJoint_GetAngularVelocity(jointId_).x;
423}
425 requireKind(Kind::Motor, "Joint3D.getMotorAngularVelocityY");
426 return b3MotorJoint_GetAngularVelocity(jointId_).y;
427}
429 requireKind(Kind::Motor, "Joint3D.getMotorAngularVelocityZ");
430 return b3MotorJoint_GetAngularVelocity(jointId_).z;
431}
432
433void Joint3D::setParallelSpring(float hertz, float dampingRatio, float maxTorque) {
434 requireKind(Kind::Parallel, "Joint3D.setParallelSpring");
435 nonNegative(hertz, "Joint3D.setParallelSpring", "hertz");
436 nonNegative(dampingRatio, "Joint3D.setParallelSpring", "dampingRatio");
437 nonNegative(maxTorque, "Joint3D.setParallelSpring", "maxTorque");
438 b3ParallelJoint_SetSpringHertz(jointId_, hertz);
439 b3ParallelJoint_SetSpringDampingRatio(jointId_, dampingRatio);
440 b3ParallelJoint_SetMaxTorque(jointId_, maxTorque);
441}
443 requireKind(Kind::Parallel, "Joint3D.getParallelHertz");
444 return b3ParallelJoint_GetSpringHertz(jointId_);
445}
447 requireKind(Kind::Parallel, "Joint3D.getParallelDampingRatio");
448 return b3ParallelJoint_GetSpringDampingRatio(jointId_);
449}
451 requireKind(Kind::Parallel, "Joint3D.getParallelMaxTorque");
452 return b3ParallelJoint_GetMaxTorque(jointId_);
453}
454
455} // namespace eve::physics
ActionParameterOperation operation
double value
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float length
Definition CaveMesh.cpp:94
float maximum[3]
float minimum[3]
#define EV_JOINT_VEC_GETTER(name, expression, member)
Definition Joint3D.cpp:97
TokenKind kind
std::string name
bool finite
World3D * world
std::string id
Definition PlayHost.cpp:108
float vz
float wz
float wx
float vy
float vx
float angle
float wy
EVENGINE_API_FOUNDATION public API.
Definition Exception.h:13
static constexpr RuntimeHandle invalid() noexcept
Returns the canonical invalid handle.
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create pr...
Definition Body3D.h:24
int getId() const
Stable id used by collision events.
Definition Body3D.h:35
void setDistanceLength(float length)
Changes distance-joint rest length in metres.
Definition Joint3D.cpp:119
float getParallelHertz() const
Parallel spring stiffness in Hertz.
Definition Joint3D.cpp:442
void destroy()
Destroys the backend joint and invalidates this wrapper.
Definition Joint3D.cpp:48
void setForceThreshold(float threshold)
Sets the force threshold that emits a joint-stress event, in newtons.
Definition Joint3D.cpp:80
float getDistanceLength() const
Distance-joint rest length in metres.
Definition Joint3D.cpp:124
void setWheelSteering(bool enabled, float targetAngle, float hertz, float dampingRatio, float maxTorque)
Configures steering target, stiffness, damping and maximum torque.
Definition Joint3D.cpp:299
Joint3D(World3D *world, Body3D *bodyA, Body3D *bodyB, b3JointId jointId, PhysicsJointHandle runtimeHandle, Kind kind, int id)
Internal wrapper constructor; use World3D::new*Joint.
Definition Joint3D.cpp:25
void setMotorVelocityLimits(float maxForce, float maxTorque)
Sets motor velocity force/torque limits.
Definition Joint3D.cpp:383
Kind
Supported joint geometry.
Definition Joint3D.h:24
void setWheelSpinMotor(bool enabled, float speed, float maxTorque)
Configures wheel spin motor speed and maximum torque.
Definition Joint3D.cpp:291
void invalidate()
Internal invalidation used by body/world destruction.
Definition Joint3D.cpp:39
void setSphericalTwistLimits(bool enabled, float lower, float upper)
Enables spherical twist limits in radians.
Definition Joint3D.cpp:244
float getTorqueThreshold() const
Current torque event threshold in newton-metres.
Definition Joint3D.cpp:93
float getParallelMaxTorque() const
Parallel maximum spring torque in newton-metres.
Definition Joint3D.cpp:450
float getWheelSpinTorque() const
Current wheel spin motor torque in newton-metres.
Definition Joint3D.cpp:325
void setRevoluteLimits(bool enabled, float lower, float upper)
Configures revolute angular limits in radians.
Definition Joint3D.cpp:169
void setDistanceMotor(bool enabled, float speed, float maxForce)
Configures the distance motor in metres/second and newtons.
Definition Joint3D.cpp:149
float getRevoluteMotorTorque() const
Current revolute motor torque in newton-metres.
Definition Joint3D.cpp:190
void setMotorAngularVelocity(float wx, float wy, float wz)
Sets motor-joint relative angular velocity in radians/second.
Definition Joint3D.cpp:376
float getForceThreshold() const
Current force event threshold in newtons.
Definition Joint3D.cpp:85
float getParallelDampingRatio() const
Parallel spring damping ratio.
Definition Joint3D.cpp:446
void setSphericalMotor(bool enabled, float velocityX, float velocityY, float velocityZ, float maxTorque)
Configures spherical motor velocity and maximum torque.
Definition Joint3D.cpp:254
float getWeldAngularHertz() const
Weld angular stiffness in Hertz.
Definition Joint3D.cpp:360
float getWeldLinearDampingRatio() const
Weld linear damping ratio.
Definition Joint3D.cpp:356
void setTorqueThreshold(float threshold)
Sets the torque threshold that emits a joint-stress event, in newton-metres.
Definition Joint3D.cpp:88
void setWeldLinearSpring(float hertz, float dampingRatio)
Configures weld linear spring stiffness and damping; 0 hertz is rigid.
Definition Joint3D.cpp:338
float getDistanceCurrentLength() const
Current anchor-to-anchor distance in metres.
Definition Joint3D.cpp:128
float getPrismaticTranslation() const
Current prismatic translation in metres.
Definition Joint3D.cpp:223
float getRevoluteAngle() const
Current revolute angle in radians.
Definition Joint3D.cpp:186
void setDistanceLimits(bool enabled, float minimum, float maximum)
Configures optional distance limits in metres.
Definition Joint3D.cpp:140
float getWheelSpinSpeed() const
Current wheel spin speed in radians/second.
Definition Joint3D.cpp:321
void setWheelSteeringLimits(bool enabled, float lower, float upper)
Configures steering angular limits in radians.
Definition Joint3D.cpp:312
float getPrismaticMotorForce() const
Current prismatic motor force in newtons.
Definition Joint3D.cpp:231
void setRevoluteSpring(bool enabled, float targetAngle, float hertz, float dampingRatio)
Configures a revolute angular spring in radians.
Definition Joint3D.cpp:158
void setPrismaticLimits(bool enabled, float lower, float upper)
Configures prismatic translation limits in metres.
Definition Joint3D.cpp:206
std::string getKind() const
Joint kind string for script/debug ("distance", "revolute", …, "filter").
Definition Joint3D.cpp:54
float getMotorLinearVelocityX() const
Desired motor linear velocity X in metres/second.
Definition Joint3D.cpp:408
void setParallelSpring(float hertz, float dampingRatio, float maxTorque)
Configures parallel-joint spring stiffness, damping and torque cap.
Definition Joint3D.cpp:433
void setMotorLinearVelocity(float vx, float vy, float vz)
Sets motor-joint relative linear velocity in metres/second.
Definition Joint3D.cpp:369
float getMotorAngularVelocityY() const
Desired motor angular velocity Y in radians/second.
Definition Joint3D.cpp:424
float getLinearSeparation() const
Current inadmissible linear separation error in metres.
Definition Joint3D.cpp:107
bool isValid() const
Whether the backend joint still exists.
Definition Joint3D.cpp:37
float getMotorAngularVelocityX() const
Desired motor angular velocity X in radians/second.
Definition Joint3D.cpp:420
float getWheelSteeringTorque() const
Current steering torque in newton-metres.
Definition Joint3D.cpp:333
float getMotorAngularVelocityZ() const
Desired motor angular velocity Z in radians/second.
Definition Joint3D.cpp:428
float getWeldLinearHertz() const
Weld linear stiffness in Hertz.
Definition Joint3D.cpp:352
float getWeldAngularDampingRatio() const
Weld angular damping ratio.
Definition Joint3D.cpp:364
float getMotorLinearVelocityY() const
Desired motor linear velocity Y in metres/second.
Definition Joint3D.cpp:412
float getAngularSeparation() const
Current inadmissible angular separation error in radians.
Definition Joint3D.cpp:110
float getMotorLinearVelocityZ() const
Desired motor linear velocity Z in metres/second.
Definition Joint3D.cpp:416
float getWheelSteeringAngle() const
Current wheel steering angle in radians.
Definition Joint3D.cpp:329
void setDistanceSpring(bool enabled, float hertz, float dampingRatio)
Configures a distance spring; hertz and damping must be non-negative.
Definition Joint3D.cpp:132
void setRevoluteMotor(bool enabled, float speed, float maxTorque)
Configures the revolute motor in radians/second and newton-metres.
Definition Joint3D.cpp:178
int getBodyAId() const
Stable ID of attached body A, or -1 after invalidation.
Definition Joint3D.cpp:69
void setWheelSuspensionLimits(bool enabled, float lower, float upper)
Configures wheel suspension travel limits in metres.
Definition Joint3D.cpp:282
float getPrismaticSpeed() const
Current prismatic translation speed in metres/second.
Definition Joint3D.cpp:227
bool getCollideConnected() const
Whether attached bodies may collide.
Definition Joint3D.cpp:76
void setMotorAngularSpring(float hertz, float dampingRatio, float maxTorque)
Configures motor angular position spring.
Definition Joint3D.cpp:399
float getSphericalConeAngle() const
Current spherical cone angle in radians.
Definition Joint3D.cpp:265
void setPrismaticMotor(bool enabled, float speed, float maxForce)
Configures a prismatic motor in metres/second and newtons.
Definition Joint3D.cpp:215
void setSphericalConeLimit(bool enabled, float angle)
Enables a spherical cone limit in radians, within [0, pi].
Definition Joint3D.cpp:236
void setWeldAngularSpring(float hertz, float dampingRatio)
Configures weld angular spring stiffness and damping; 0 hertz is rigid.
Definition Joint3D.cpp:345
int getBodyBId() const
Stable ID of attached body B, or -1 after invalidation.
Definition Joint3D.cpp:70
void setWheelSuspension(bool enabled, float hertz, float dampingRatio)
Configures wheel suspension spring stiffness and damping.
Definition Joint3D.cpp:274
void setPrismaticSpring(bool enabled, float targetTranslation, float hertz, float dampingRatio)
Configures a prismatic linear spring and target translation.
Definition Joint3D.cpp:195
float getSphericalTwistAngle() const
Current spherical twist angle in radians.
Definition Joint3D.cpp:269
void setCollideConnected(bool collide)
Enables or disables collision between the attached bodies.
Definition Joint3D.cpp:72
void setMotorLinearSpring(float hertz, float dampingRatio, float maxForce)
Configures motor linear position spring.
Definition Joint3D.cpp:390
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
void forgetJoint(Joint3D *joint)
Internal: removes a joint wrapper from ownership bookkeeping.
Definition World3D.cpp:714
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
bool enabled