Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdynamicrigidbody.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
8#include "physxnode/qphysxdynamicbody_p.h"
9
10#include <foundation/PxSimpleTypes.h>
11
13
14/*!
15 \qmltype DynamicRigidBody
16 \inqmlmodule QtQuick3D.Physics
17 \inherits PhysicsBody
18 \since 6.4
19 \brief A physical body that can move or be moved.
20
21 This type defines a dynamic rigid body: an object that is part of the physics
22 scene and behaves like a physical object with mass and velocity.
23
24 \note \l{TriangleMeshShape}{triangle mesh}, \l{HeightFieldShape}{height field} and
25 \l{PlaneShape}{plane} geometry shapes are not allowed as collision shapes when
26 \l isKinematic is \c false.
27*/
28
29/*!
30 \qmlproperty real DynamicRigidBody::mass
31
32 This property defines the mass of the body. Note that this is only used when massMode is not
33 \c {DynamicRigidBody.CustomDensity} or \c {DynamicRigidBody.DefaultDensity}. Also note that
34 a value of 0 is interpreted as infinite mass and that negative numbers are not allowed.
35
36 Default value: \c 1
37
38 Range: \c{[0, inf]}
39
40 \sa massMode
41*/
42
43/*!
44 \qmlproperty real DynamicRigidBody::density
45
46 This property defines the density of the body. This is only used when massMode is set to \c
47 {DynamicRigidBody.CustomDensity}.
48
49 Default value: \c{0.001}
50
51 Range: \c{(0, inf]}
52 \sa massMode
53*/
54
55/*!
56 \qmlproperty AxisLock DynamicRigidBody::linearAxisLock
57
58 This property locks the linear velocity of the body along the axes defined by the
59 DynamicRigidBody.AxisLock enum. To lock several axes just bitwise-or their enum values.
60
61 Available options:
62
63 \value DynamicRigidBody.None
64 No axis lock.
65
66 \value DynamicRigidBody.LockX
67 Lock X axis.
68
69 \value DynamicRigidBody.LockY
70 Lock Y axis.
71
72 \value DynamicRigidBody.LockZ
73 Lock Z axis.
74
75 Default value: \c{DynamicRigidBody.None}
76*/
77
78/*!
79 \qmlproperty AxisLock DynamicRigidBody::angularAxisLock
80
81 This property locks the angular velocity of the body along the axes defined by the
82 DynamicRigidBody.AxisLock enum. To lock several axes just bitwise-or their enum values.
83
84 Available options:
85
86 \value DynamicRigidBody.None
87 No axis lock.
88
89 \value DynamicRigidBody.LockX
90 Lock X axis.
91
92 \value DynamicRigidBody.LockY
93 Lock Y axis.
94
95 \value DynamicRigidBody.LockZ
96 Lock Z axis.
97
98 Default value: \c{DynamicRigidBody.None}
99*/
100
101/*!
102 \qmlproperty enumeration DynamicRigidBody::ccd
103 \since 6.13
104
105 This property determines the continuous collision detection (CCD) mode
106 used for this body. Enabling CCD reduces the risk of fast-moving objects passing
107 through geometry between physics frames (tunnelling). The following values
108 are available:
109
110 \value DynamicRigidBody.None
111 CCD is disabled for this body unless enabled globally by \l PhysicsWorld::enableCCD.
112
113 \value DynamicRigidBody.SpeculativeCCD
114 Uses speculative continuous collision detection. Supported for both dynamic and
115 kinematic bodies.
116
117 \value DynamicRigidBody.SweepBasedCCD
118 Uses sweep-based continuous collision detection. This mode is supported only
119 for non-kinematic dynamic bodies. If applied to a kinematic body, it automatically
120 falls back to \c SpeculativeCCD.
121
122 \default DynamicRigidBody.None
123
124 \note CCD processing can significantly impact simulation performance. Enable it only for
125 objects moving at high velocities or having small bounds relative to their speed.
126
127 \sa PhysicsWorld::enableCCD
128*/
129
130/*!
131 \qmlproperty bool DynamicRigidBody::isKinematic
132 This property defines whether the object is kinematic or not. A kinematic object does not get
133 influenced by external forces and can be seen as an object of infinite mass. If this property is
134 set then in every simulation frame the physical object will be moved to its target position
135 regardless of external forces. Note that to move and rotate the kinematic object you need to use
136 the kinematicPosition, kinematicRotation, kinematicEulerRotation and kinematicPivot properties.
137
138 Default value: \c{false}
139
140 \sa kinematicPosition, kinematicRotation, kinematicEulerRotation, kinematicPivot
141*/
142
143/*!
144 \qmlproperty bool DynamicRigidBody::gravityEnabled
145 This property defines whether the object is going to be affected by gravity or not.
146
147 Default value: \c{true}
148*/
149
150/*!
151 \qmlproperty MassMode DynamicRigidBody::massMode
152
153 This property holds the enum which describes how mass and inertia are calculated for this body.
154
155 Available options:
156
157 \value DynamicRigidBody.DefaultDensity
158 Use the density specified in the \l {PhysicsWorld::}{defaultDensity} property in
159 PhysicsWorld to calculate mass and inertia assuming a uniform density.
160
161 \value DynamicRigidBody.CustomDensity
162 Use specified density in the specified in the \l {DynamicRigidBody::}{density} to
163 calculate mass and inertia assuming a uniform density.
164
165 \value DynamicRigidBody.Mass
166 Use the specified mass to calculate inertia assuming a uniform density.
167
168 \value DynamicRigidBody.MassAndInertiaTensor
169 Use the specified mass value and inertia tensor.
170
171 \value DynamicRigidBody.MassAndInertiaMatrix
172 Use the specified mass value and calculate inertia from the specified inertia
173 matrix.
174
175 Default value: \c{DynamicRigidBody.DefaultDensity}
176*/
177
178/*!
179 \qmlproperty vector3d DynamicRigidBody::inertiaTensor
180
181 Defines the inertia tensor vector, using a parameter specified in mass space coordinates.
182
183 This is the diagonal vector of a 3x3 diagonal matrix, if you have a non diagonal world/actor
184 space inertia tensor then you should use \l{DynamicRigidBody::inertiaMatrix}{inertiaMatrix}
185 instead.
186
187 The inertia tensor components must be positive and a value of 0 in any component is
188 interpreted as infinite inertia along that axis. Note that this is only used when
189 massMode is set to \c DynamicRigidBody.MassAndInertiaTensor.
190
191 Default value: \c{(1, 1, 1)}
192
193 \sa massMode, inertiaMatrix
194*/
195
196/*!
197 \qmlproperty vector3d DynamicRigidBody::centerOfMassPosition
198
199 Defines the position of the center of mass relative to the body. Note that this is only used
200 when massMode is set to \c DynamicRigidBody.MassAndInertiaTensor.
201
202 Default value: \c{(0, 0, 0)}
203
204 \sa massMode, inertiaTensor
205*/
206
207/*!
208 \qmlproperty quaternion DynamicRigidBody::centerOfMassRotation
209
210 Defines the rotation of the center of mass pose, i.e. it specifies the orientation of the body's
211 principal inertia axes relative to the body. Note that this is only used when massMode is set to
212 \c DynamicRigidBody.MassAndInertiaTensor.
213
214 Default value: \c{(1, 0, 0, 0)}
215
216 \sa massMode, inertiaTensor
217*/
218
219/*!
220 \qmlproperty list<real> DynamicRigidBody::inertiaMatrix
221
222 Defines the inertia tensor matrix. This is a 3x3 matrix in column-major order. Note that this
223 matrix is expected to be diagonalizable. Note that this is only used when massMode is set to
224 \c DynamicRigidBody.MassAndInertiaMatrix.
225
226 Default value: A 3x3 identity matrix
227
228 \sa massMode, inertiaTensor
229*/
230
231/*!
232 \qmlproperty vector3d DynamicRigidBody::kinematicPosition
233 \since 6.5
234
235 Defines the position of the object when it is kinematic, i.e. when \l isKinematic is set to \c
236 true. On each iteration of the simulation the physical object will be updated according to this
237 value.
238
239 Default value: \c{(0, 0, 0)}
240
241 \sa isKinematic, kinematicRotation, kinematicEulerRotation, kinematicPivot
242*/
243
244/*!
245 \qmlproperty quaternion DynamicRigidBody::kinematicRotation
246 \since 6.5
247
248 Defines the rotation of the object when it is kinematic, i.e. when \l isKinematic is set to \c
249 true. On each iteration of the simulation the physical object will be updated according to this
250 value.
251
252 Default value: \c{(1, 0, 0, 0)}
253
254 \sa isKinematic, kinematicPosition, kinematicEulerRotation, kinematicPivot
255*/
256
257/*!
258 \qmlproperty vector3d DynamicRigidBody::kinematicEulerRotation
259 \since 6.5
260
261 Defines the euler rotation of the object when it is kinematic, i.e. when \l isKinematic is set to \c
262 true. On each iteration of the simulation the physical object will be updated according to this
263 value.
264
265 Default value: \c{(0, 0, 0)}
266
267 \sa isKinematic, kinematicPosition, kinematicEulerRotation, kinematicPivot
268*/
269
270/*!
271 \qmlproperty vector3d DynamicRigidBody::kinematicPivot
272 \since 6.5
273
274 Defines the pivot of the object when it is kinematic, i.e. when \l isKinematic is set to \c
275 true. On each iteration of the simulation the physical object will be updated according to this
276 value.
277
278 Default value: \c{(0, 0, 0)}
279
280 \sa isKinematic, kinematicPosition, kinematicEulerRotation, kinematicRotation
281*/
282
283/*!
284 \qmlproperty bool DynamicRigidBody::isSleeping
285 \since 6.9
286
287 Is set to \c{true} if the body is sleeping. While it is technically possible to set this property
288 it should be seen as a read-only property that is set on every frame the physics simulation is
289 running.
290*/
291
292/*!
293 \qmlmethod void DynamicRigidBody::applyCentralForce(vector3d force)
294
295 Applies a \a force on the center of the body.
296*/
297
298/*!
299 \qmlmethod void DynamicRigidBody::applyForce(vector3d force, vector3d position)
300
301 Applies a \a force at a \a position on the body.
302*/
303
304/*!
305 \qmlmethod void DynamicRigidBody::applyTorque(vector3d torque)
306
307 Applies a \a torque on the body.
308*/
309
310/*!
311 \qmlmethod void DynamicRigidBody::applyCentralImpulse(vector3d impulse)
312
313 Applies an \a impulse on the center of the body.
314*/
315
316/*!
317 \qmlmethod void DynamicRigidBody::applyImpulse(vector3d impulse, vector3d position)
318
319 Applies an \a impulse at a \a position on the body.
320*/
321
322/*!
323 \qmlmethod void DynamicRigidBody::applyTorqueImpulse(vector3d impulse)
324
325 Applies a torque \a impulse on the body.
326*/
327
328/*!
329 \qmlmethod void DynamicRigidBody::setAngularVelocity(vector3d angularVelocity)
330
331 Sets the \a angularVelocity of the body.
332*/
333
334/*!
335 \qmlmethod void DynamicRigidBody::setLinearVelocity(vector3d linearVelocity)
336
337 Sets the \a linearVelocity of the body.
338*/
339
340/*!
341 \qmlmethod void DynamicRigidBody::reset(vector3d position, vector3d eulerRotation)
342
343 Resets the body's \a position and \a eulerRotation.
344*/
345
346QDynamicRigidBody::QDynamicRigidBody() = default;
347
348QDynamicRigidBody::~QDynamicRigidBody()
349{
350 qDeleteAll(m_commandQueue);
351 m_commandQueue.clear();
352}
353
354const QQuaternion &QDynamicRigidBody::centerOfMassRotation() const
355{
356 return m_centerOfMassRotation;
357}
358
359void QDynamicRigidBody::setCenterOfMassRotation(const QQuaternion &newCenterOfMassRotation)
360{
361 if (qFuzzyCompare(m_centerOfMassRotation, newCenterOfMassRotation))
362 return;
363 m_centerOfMassRotation = newCenterOfMassRotation;
364
365 // Only inertia tensor is using rotation
366 if (m_massMode == MassMode::MassAndInertiaTensor)
367 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaTensor(m_mass, m_inertiaTensor));
368
369 emit centerOfMassRotationChanged();
370}
371
372const QVector3D &QDynamicRigidBody::centerOfMassPosition() const
373{
374 return m_centerOfMassPosition;
375}
376
377void QDynamicRigidBody::setCenterOfMassPosition(const QVector3D &newCenterOfMassPosition)
378{
379 if (qFuzzyCompare(m_centerOfMassPosition, newCenterOfMassPosition))
380 return;
381
382 switch (m_massMode) {
383 case MassMode::MassAndInertiaTensor: {
384 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaTensor(m_mass, m_inertiaTensor));
385 break;
386 }
387 case MassMode::MassAndInertiaMatrix: {
388 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaMatrix(m_mass, m_inertiaMatrix));
389 break;
390 }
391 case MassMode::DefaultDensity:
392 case MassMode::CustomDensity:
393 case MassMode::Mass:
394 break;
395 }
396
397 m_centerOfMassPosition = newCenterOfMassPosition;
398 emit centerOfMassPositionChanged();
399}
400
401QDynamicRigidBody::MassMode QDynamicRigidBody::massMode() const
402{
403 return m_massMode;
404}
405
406void QDynamicRigidBody::setMassMode(const MassMode newMassMode)
407{
408 if (m_massMode == newMassMode)
409 return;
410
411 switch (newMassMode) {
412 case MassMode::DefaultDensity: {
413 auto world = QPhysicsWorld::getWorld(this);
414 if (world) {
415 m_commandQueue.enqueue(new QPhysicsCommandSetDensity(world->defaultDensity()));
416 } else {
417 qWarning() << "No physics world found, cannot set default density.";
418 }
419 break;
420 }
421 case MassMode::CustomDensity: {
422 m_commandQueue.enqueue(new QPhysicsCommandSetDensity(m_density));
423 break;
424 }
425 case MassMode::Mass: {
426 m_commandQueue.enqueue(new QPhysicsCommandSetMass(m_mass));
427 break;
428 }
429 case MassMode::MassAndInertiaTensor: {
430 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaTensor(m_mass, m_inertiaTensor));
431 break;
432 }
433 case MassMode::MassAndInertiaMatrix: {
434 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaMatrix(m_mass, m_inertiaMatrix));
435 break;
436 }
437 }
438
439 m_massMode = newMassMode;
440 emit massModeChanged();
441}
442
443const QVector3D &QDynamicRigidBody::inertiaTensor() const
444{
445 return m_inertiaTensor;
446}
447
448void QDynamicRigidBody::setInertiaTensor(const QVector3D &newInertiaTensor)
449{
450 if (qFuzzyCompare(m_inertiaTensor, newInertiaTensor))
451 return;
452 m_inertiaTensor = newInertiaTensor;
453
454 if (m_massMode == MassMode::MassAndInertiaTensor)
455 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaTensor(m_mass, m_inertiaTensor));
456
457 emit inertiaTensorChanged();
458}
459
460const QList<float> &QDynamicRigidBody::readInertiaMatrix() const
461{
462 return m_inertiaMatrixList;
463}
464
465static bool fuzzyEquals(const QList<float> &a, const QList<float> &b)
466{
467 if (a.length() != b.length())
468 return false;
469
470 const int length = a.length();
471 for (int i = 0; i < length; i++)
472 if (!qFuzzyCompare(a[i], b[i]))
473 return false;
474
475 return true;
476}
477
478void QDynamicRigidBody::setInertiaMatrix(const QList<float> &newInertiaMatrix)
479{
480 if (fuzzyEquals(m_inertiaMatrixList, newInertiaMatrix))
481 return;
482
483 m_inertiaMatrixList = newInertiaMatrix;
484 const int elemsToCopy = qMin(m_inertiaMatrixList.length(), 9);
485 memcpy(m_inertiaMatrix.data(), m_inertiaMatrixList.data(), elemsToCopy * sizeof(float));
486 memset(m_inertiaMatrix.data() + elemsToCopy, 0, (9 - elemsToCopy) * sizeof(float));
487
488 if (m_massMode == MassMode::MassAndInertiaMatrix)
489 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaMatrix(m_mass, m_inertiaMatrix));
490
491 emit inertiaMatrixChanged();
492}
493
494const QMatrix3x3 &QDynamicRigidBody::inertiaMatrix() const
495{
496 return m_inertiaMatrix;
497}
498
499float QDynamicRigidBody::mass() const
500{
501 return m_mass;
502}
503
504bool QDynamicRigidBody::isKinematic() const
505{
506 return m_isKinematic;
507}
508
509QDynamicRigidBody::CCDType QDynamicRigidBody::ccd() const
510{
511 return m_CCD;
512}
513
514bool QDynamicRigidBody::gravityEnabled() const
515{
516 return m_gravityEnabled;
517}
518
519void QDynamicRigidBody::setMass(float mass)
520{
521 if (mass < 0.f || qFuzzyCompare(m_mass, mass))
522 return;
523
524 switch (m_massMode) {
525 case QDynamicRigidBody::MassMode::Mass:
526 m_commandQueue.enqueue(new QPhysicsCommandSetMass(mass));
527 break;
528 case QDynamicRigidBody::MassMode::MassAndInertiaTensor:
529 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaTensor(mass, m_inertiaTensor));
530 break;
531 case QDynamicRigidBody::MassMode::MassAndInertiaMatrix:
532 m_commandQueue.enqueue(new QPhysicsCommandSetMassAndInertiaMatrix(mass, m_inertiaMatrix));
533 break;
534 case QDynamicRigidBody::MassMode::DefaultDensity:
535 case QDynamicRigidBody::MassMode::CustomDensity:
536 break;
537 }
538
539 m_mass = mass;
540 emit massChanged(m_mass);
541}
542
543float QDynamicRigidBody::density() const
544{
545 return m_density;
546}
547
548void QDynamicRigidBody::setDensity(float density)
549{
550 density = qBound(0.0000001f, density, PX_MAX_F32);
551
552 if (qFuzzyCompare(m_density, density))
553 return;
554
555 if (m_massMode == MassMode::CustomDensity)
556 m_commandQueue.enqueue(new QPhysicsCommandSetDensity(density));
557
558 m_density = density;
559 emit densityChanged(m_density);
560}
561
562void QDynamicRigidBody::setIsKinematic(bool isKinematic)
563{
564 if (m_isKinematic == isKinematic)
565 return;
566
567 if (hasStaticShapes() && !isKinematic) {
568 qWarning()
569 << "Cannot make body containing trimesh/heightfield/plane non-kinematic, ignoring.";
570 return;
571 }
572
573 m_isKinematic = isKinematic;
574 auto world = QPhysicsWorld::getWorld(this);
575 m_commandQueue.enqueue(
576 new QPhysicsCommandSetIsKinematic(m_isKinematic, world && world->enableCCD()));
577 emit isKinematicChanged(m_isKinematic);
578}
579
580void QDynamicRigidBody::setCCD(CCDType newCCD)
581{
582 if (m_CCD == newCCD)
583 return;
584
585 m_CCD = newCCD;
586 auto world = QPhysicsWorld::getWorld(this);
587 m_commandQueue.enqueue(new QPhysicsCommandSetCCD(m_CCD, world && world->enableCCD()));
588 emit ccdChanged();
589}
590
591void QDynamicRigidBody::setGravityEnabled(bool gravityEnabled)
592{
593 if (m_gravityEnabled == gravityEnabled)
594 return;
595
596 m_gravityEnabled = gravityEnabled;
597 m_commandQueue.enqueue(new QPhysicsCommandSetGravityEnabled(m_gravityEnabled));
598 emit gravityEnabledChanged();
599}
600
601void QDynamicRigidBody::setAngularVelocity(const QVector3D &angularVelocity)
602{
603 m_commandQueue.enqueue(new QPhysicsCommandSetAngularVelocity(angularVelocity));
604}
605
606QDynamicRigidBody::AxisLock QDynamicRigidBody::linearAxisLock() const
607{
608 return m_linearAxisLock;
609}
610
611void QDynamicRigidBody::setLinearAxisLock(AxisLock newAxisLockLinear)
612{
613 if (m_linearAxisLock == newAxisLockLinear)
614 return;
615 m_linearAxisLock = newAxisLockLinear;
616 emit linearAxisLockChanged();
617}
618
619QDynamicRigidBody::AxisLock QDynamicRigidBody::angularAxisLock() const
620{
621 return m_angularAxisLock;
622}
623
624void QDynamicRigidBody::setAngularAxisLock(AxisLock newAxisLockAngular)
625{
626 if (m_angularAxisLock == newAxisLockAngular)
627 return;
628 m_angularAxisLock = newAxisLockAngular;
629 emit angularAxisLockChanged();
630}
631
632QQueue<QPhysicsCommand *> &QDynamicRigidBody::commandQueue()
633{
634 return m_commandQueue;
635}
636
637void QDynamicRigidBody::updateDefaultDensity(float defaultDensity)
638{
639 if (m_massMode == MassMode::DefaultDensity)
640 m_commandQueue.enqueue(new QPhysicsCommandSetDensity(defaultDensity));
641}
642
643void QDynamicRigidBody::applyCentralForce(const QVector3D &force)
644{
645 m_commandQueue.enqueue(new QPhysicsCommandApplyCentralForce(force));
646}
647
648void QDynamicRigidBody::applyForce(const QVector3D &force, const QVector3D &position)
649{
650 m_commandQueue.enqueue(new QPhysicsCommandApplyForce(force, position));
651}
652
653void QDynamicRigidBody::applyTorque(const QVector3D &torque)
654{
655 m_commandQueue.enqueue(new QPhysicsCommandApplyTorque(torque));
656}
657
658void QDynamicRigidBody::applyCentralImpulse(const QVector3D &impulse)
659{
660 m_commandQueue.enqueue(new QPhysicsCommandApplyCentralImpulse(impulse));
661}
662
663void QDynamicRigidBody::applyImpulse(const QVector3D &impulse, const QVector3D &position)
664{
665 m_commandQueue.enqueue(new QPhysicsCommandApplyImpulse(impulse, position));
666}
667
668void QDynamicRigidBody::applyTorqueImpulse(const QVector3D &impulse)
669{
670 m_commandQueue.enqueue(new QPhysicsCommandApplyTorqueImpulse(impulse));
671}
672
673void QDynamicRigidBody::setLinearVelocity(const QVector3D &linearVelocity)
674{
675 m_commandQueue.enqueue(new QPhysicsCommandSetLinearVelocity(linearVelocity));
676}
677
678void QDynamicRigidBody::reset(const QVector3D &position, const QVector3D &eulerRotation)
679{
680 m_commandQueue.enqueue(new QPhysicsCommandReset(position, eulerRotation));
681}
682
683void QDynamicRigidBody::setKinematicRotation(const QQuaternion &rotation)
684{
685 if (m_kinematicRotation == rotation)
686 return;
687
688 m_kinematicRotation = rotation;
689 emit kinematicRotationChanged(m_kinematicRotation.toQuaternion());
690 emit kinematicEulerRotationChanged(m_kinematicRotation.toEulerAngles());
691}
692
693QQuaternion QDynamicRigidBody::kinematicRotation() const
694{
695 return m_kinematicRotation.toQuaternion();
696}
697
698void QDynamicRigidBody::setKinematicEulerRotation(const QVector3D &rotation)
699{
700 if (m_kinematicRotation == rotation)
701 return;
702
703 m_kinematicRotation = rotation;
704 emit kinematicEulerRotationChanged(m_kinematicRotation.toEulerAngles());
705 emit kinematicRotationChanged(m_kinematicRotation.toQuaternion());
706}
707
708QVector3D QDynamicRigidBody::kinematicEulerRotation() const
709{
710 return m_kinematicRotation.toEulerAngles();
711}
712
713void QDynamicRigidBody::setKinematicPivot(const QVector3D &pivot)
714{
715 m_kinematicPivot = pivot;
716 emit kinematicPivotChanged(m_kinematicPivot);
717}
718
719QVector3D QDynamicRigidBody::kinematicPivot() const
720{
721 return m_kinematicPivot;
722}
723
724bool QDynamicRigidBody::isSleeping() const
725{
726 return m_isSleeping;
727}
728
729void QDynamicRigidBody::setIsSleeping(bool newIsSleeping)
730{
731 if (m_isSleeping == newIsSleeping)
732 return;
733
734 m_isSleeping = newIsSleeping;
735 emit isSleepingChanged(newIsSleeping);
736}
737
738QAbstractPhysXNode *QDynamicRigidBody::createPhysXBackend()
739{
740 return new QPhysXDynamicBody(this);
741}
742
743void QDynamicRigidBody::setKinematicPosition(const QVector3D &position)
744{
745 m_kinematicPosition = position;
746 emit kinematicPositionChanged(m_kinematicPosition);
747}
748
749QVector3D QDynamicRigidBody::kinematicPosition() const
750{
751 return m_kinematicPosition;
752}
753
static bool fuzzyEquals(const QList< float > &a, const QList< float > &b)
#define QT_BEGIN_NAMESPACE
#define QT_END_NAMESPACE