载入中...
搜索中...
未找到
World3D.h
浏览该文件的文档.
1#pragma once
2
3#include <string>
4#include <unordered_set>
5#include <vector>
6
7#include <box3d/id.h>
8
9namespace eve::physics {
10
11class Body3D;
12class Shape3D;
13
18class World3D {
19public:
20 World3D(float gravityX, float gravityY, float gravityZ, bool sleep);
21 ~World3D();
22
23 World3D(const World3D &) = delete;
24 World3D &operator=(const World3D &) = delete;
25
27 void update(float dt);
29 void updateFull(float dt, int subStepCount);
30
32 void setGravity(float gx, float gy, float gz);
33 float getGravityX() const;
34 float getGravityY() const;
35 float getGravityZ() const;
36
38 Body3D *newBody(const std::string &bodyType, float x, float y, float z);
39
41 void destroyBody(Body3D *body);
43 void destroy();
44
49 int rayCast(float x1, float y1, float z1, float x2, float y2, float z2);
50 bool hasRayHit() const { return rayHitBodyId_ >= 0; }
51 int getRayHitBodyId() const { return rayHitBodyId_; }
52 float getRayHitX() const { return rayHitX_; }
53 float getRayHitY() const { return rayHitY_; }
54 float getRayHitZ() const { return rayHitZ_; }
55 float getRayHitNormalX() const { return rayHitNormalX_; }
56 float getRayHitNormalY() const { return rayHitNormalY_; }
57 float getRayHitNormalZ() const { return rayHitNormalZ_; }
58 float getRayHitFraction() const { return rayHitFraction_; }
59
64 int queryAABB(float minX, float minY, float minZ, float maxX, float maxY, float maxZ);
66 int getQueryCount() const { return static_cast<int>(queryBodyIds_.size()); }
68 int getQueryBodyId(int index) const;
69
71 bool isValid() const;
73 b3WorldId raw() const { return worldId_; }
74
76 void forgetBody(Body3D *body);
77 void forgetShape(Shape3D *shape);
78
80 int nextBodyId();
81
83 void emitContactEvents();
84
85private:
86 friend class Body3D;
87 friend class Shape3D;
88
89 b3WorldId worldId_{};
90 bool destroyed_ = false;
91 int nextId_ = 1;
92
93 std::unordered_set<Body3D *> bodies_;
94 std::unordered_set<Shape3D *> shapes_;
95
96 int rayHitBodyId_ = -1;
97 float rayHitX_ = 0.f;
98 float rayHitY_ = 0.f;
99 float rayHitZ_ = 0.f;
100 float rayHitNormalX_ = 0.f;
101 float rayHitNormalY_ = 0.f;
102 float rayHitNormalZ_ = 0.f;
103 float rayHitFraction_ = 0.f;
104
105 std::vector<int> queryBodyIds_;
106};
107
108} // namespace eve::physics
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
JobFunc body
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create sh...
Definition Body3D.h:16
3D shape (box/sphere/capsule) attached to a Body3D with material settings. Created via Body3D::new*Sh...
Definition Shape3D.h:14
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:18
void setGravity(float gx, float gy, float gz)
Gravity in m/s².
Definition World3D.cpp:76
int getQueryBodyId(int index) const
Body id of the i-th query hit.
Definition World3D.cpp:204
bool hasRayHit() const
Definition World3D.h:50
void update(float dt)
Steps the simulation by dt seconds (default substep count).
Definition World3D.cpp:65
float getRayHitX() const
Definition World3D.h:52
float getRayHitY() const
Definition World3D.h:53
World3D(const World3D &)=delete
void forgetBody(Body3D *body)
Internal: wrapper teardown bookkeeping.
Definition World3D.cpp:118
World3D & operator=(const World3D &)=delete
float getGravityX() const
Definition World3D.cpp:81
int getQueryCount() const
Number of bodies hit by the last queryAABB().
Definition World3D.h:66
int nextBodyId()
Internal: next stable body id.
Definition World3D.cpp:96
float getRayHitNormalX() const
Definition World3D.h:55
float getRayHitNormalZ() const
Definition World3D.h:57
float getGravityY() const
Definition World3D.cpp:86
int rayCast(float x1, float y1, float z1, float x2, float y2, float z2)
Closest raycast from (x1,y1,z1) to (x2,y2,z2) in meters. Returns hit body id, or -1....
Definition World3D.cpp:146
b3WorldId raw() const
Raw Box3D world id.
Definition World3D.h:73
bool isValid() const
True while the underlying Box3D world is alive.
Definition World3D.cpp:41
int queryAABB(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)
Query shapes overlapping an AABB in meters (min/max corners). Returns match count; read ids with getQ...
Definition World3D.cpp:177
void updateFull(float dt, int subStepCount)
Steps with an explicit substep count.
Definition World3D.cpp:67
void destroyBody(Body3D *body)
Destroys a body (null is ignored).
Definition World3D.cpp:113
void forgetShape(Shape3D *shape)
Definition World3D.cpp:119
float getGravityZ() const
Definition World3D.cpp:91
void destroy()
Destroys the world and invalidates all wrappers.
Definition World3D.cpp:43
float getRayHitZ() const
Definition World3D.h:54
int getRayHitBodyId() const
Definition World3D.h:51
void emitContactEvents()
Internal: collects Box3D contact events into the event buffers.
Definition World3D.cpp:121
Body3D * newBody(const std::string &bodyType, float x, float y, float z)
bodyType: "static" | "kinematic" | "dynamic". Position in meters.
Definition World3D.cpp:98
float getRayHitFraction() const
Definition World3D.h:58
float getRayHitNormalY() const
Definition World3D.h:56