TDME2  1.9.200
Capsule.cpp
Go to the documentation of this file.
2 
3 #include <reactphysics3d/collision/shapes/CapsuleShape.h>
4 
5 #include <tdme/tdme.h>
9 #include <tdme/math/Math.h>
10 #include <tdme/math/Matrix4x4.h>
11 #include <tdme/math/Vector3.h>
12 #include <tdme/utilities/Console.h>
13 
15 
19 using tdme::math::Math;
23 
24 Capsule::Capsule(const Vector3& a, const Vector3& b, float radius, const Vector3& scale)
25 {
26  this->a.set(a);
27  this->b.set(b);
28  this->radius = radius;
29  center.set(a).add(b).scale(0.5f);
30  setScale(scale);
31 }
32 
35 }
36 
37 float Capsule::getRadius() const
38 {
39  return radius;
40 }
41 
42 const Vector3& Capsule::getA() const
43 {
44  return a;
45 }
46 
47 const Vector3& Capsule::getB() const
48 {
49  return b;
50 }
51 
52 void Capsule::setScale(const Vector3& scale) {
53  // store new scale
54  this->scale.set(scale);
55 
56  //
57  Vector3 aScaled;
58  Vector3 bScaled;
59  aScaled.set(a).scale(scale);
60  bScaled.set(b).scale(scale);
61 
62  // determine local rotation around Y axis
63  Vector3 yAxis(0.0f, -1.0f, 0.0f);
64  Vector3 abNormalized = aScaled.clone().sub(bScaled).normalize();
65  Vector3 rotationAxis;
66  if (Math::abs(abNormalized[0]) < Math::EPSILON && Math::abs(abNormalized[2]) < Math::EPSILON) {
67  rotationAxis.set(abNormalized[1], 0.0f, 0.0f);
68  } else {
69  rotationAxis = Vector3::computeCrossProduct(yAxis, abNormalized).normalize();
70  }
71  auto angle = Vector3::computeAngle(yAxis, abNormalized, yAxis);
72  Quaternion rotationQuaternion;
73  rotationQuaternion.rotate(rotationAxis, angle);
74 
75  // set shape orientation
76  collisionShapeLocalTransform.setOrientation(
77  reactphysics3d::Quaternion(
78  rotationQuaternion.getX(),
79  rotationQuaternion.getY(),
80  rotationQuaternion.getZ(),
81  rotationQuaternion.getW()
82  )
83  );
84 
85  // determine local translation
87  collisionShapeLocalTransform.setPosition(
88  reactphysics3d::Vector3(
92  )
93  );
94 
95 }
96 
98  if (collisionShape == nullptr) return;
99  this->world->physicsCommon.destroyCapsuleShape(static_cast<reactphysics3d::CapsuleShape*>(collisionShape));
100  collisionShape = nullptr;
101  world = nullptr;
102 }
103 
105  if (this->world != nullptr && this->world != world) {
106  Console::println("Capsule::createCollisionShape(): already attached to a world.");
107  }
108  this->world = world;
109 
110  //
111  Vector3 aScaled;
112  Vector3 bScaled;
113  aScaled.set(a).scale(scale);
114  bScaled.set(b).scale(scale);
115 
116  // create capsule
117  collisionShape = world->physicsCommon.createCapsuleShape(
118  Math::max(Math::EPSILON, radius * Math::max(Math::abs(scale.getZ()), Math::max(Math::abs(scale.getX()), Math::abs(scale.getY())))),
119  Math::max(Math::EPSILON, bScaled.clone().sub(aScaled).computeLength())
120  );
121 }
122 
124 {
125  return new Capsule(a, b, radius, scale);
126 }
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Dynamic physics world class.
Definition: World.h:38
reactphysics3d::PhysicsCommon physicsCommon
Definition: World.h:53
reactphysics3d::Transform collisionShapeLocalTransform
reactphysics3d::CollisionShape * collisionShape
Capsule physics primitive.
Definition: Capsule.h:19
~Capsule()
Public destructor.
Definition: Capsule.cpp:33
const Vector3 & getB() const
Definition: Capsule.cpp:47
void destroyCollisionShape() override
Destroy collision shape.
Definition: Capsule.cpp:97
void setScale(const Vector3 &scale) override
Set local scale.
Definition: Capsule.cpp:52
const Vector3 & getA() const
Definition: Capsule.cpp:42
void createCollisionShape(World *world) override
Create collision shap.
Definition: Capsule.cpp:104
BoundingVolume * clone() const override
Clones this bounding volume.
Definition: Capsule.cpp:123
Standard math functions.
Definition: Math.h:19
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Quaternion class representing quaternion mathematical structure and operations with x,...
Definition: Quaternion.h:24
float getY() const
Definition: Quaternion.h:174
float getX() const
Definition: Quaternion.h:157
float getZ() const
Definition: Quaternion.h:191
float getW() const
Definition: Quaternion.h:208
Quaternion & rotate(const Vector3 &axis, float angle)
Creates rotation quaternion.
Definition: Quaternion.h:361
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
float getY() const
Definition: Vector3.h:117
float getX() const
Definition: Vector3.h:100
float computeLength() const
Definition: Vector3.h:274
float getZ() const
Definition: Vector3.h:134
Vector3 & add(float scalar)
Adds a scalar.
Definition: Vector3.h:153
Vector3 clone() const
Clones this vector3.
Definition: Vector3.h:374
Vector3 & sub(float scalar)
Subtracts a scalar.
Definition: Vector3.h:177
Vector3 & scale(float scalar)
Scales by scalar.
Definition: Vector3.h:201
Vector3 & set(float x, float y, float z)
Sets this vector3 by its components.
Definition: Vector3.h:70
Vector3 & normalize()
Normalizes this vector3.
Definition: Vector3.h:239
Console class.
Definition: Console.h:29