Commit b7b91322 authored by Nor-s's avatar Nor-s
Browse files

Update note

parent 722b8113
No related merge requests found
Showing with 213 additions and 8 deletions
+213 -8
......@@ -72,6 +72,12 @@
- [5.3. **Joints**](#53-joints)
- [5.4. **Contacts**](#54-contacts)
- [5.5. **World**](#55-world)
- [5.5.1. **Creating and Destroying a World**](#551-creating-and-destroying-a-world)
- [5.5.2. **Using a World**](#552-using-a-world)
- [5.5.2.1. **Simulation**](#5521-simulation)
- [5.5.2.2. **Exploring the World**](#5522-exploring-the-world)
- [5.5.2.3. **AABB Queries**](#5523-aabb-queries)
- [5.5.2.4. **?Ray Casts?**](#5524-ray-casts)
- [6. **Loose Ends**](#6-loose-ends)
- [6.1. **User Data**](#61-user-data)
- [6.2. **Custom User Data**](#62-custom-user-data)
......@@ -1347,12 +1353,202 @@ Contact Filtering
## 5.5. **World**
Creating and Destroying a World
Using a World
Simulation
Exploring the World
AABB Queries
Ray Casts
- b2World 클래스에는 bodies 그리고 joints이 포함된다.
- 이것은 시뮬레이션의 모든 측면을 관리하고, 비동기 쿼리를 할 수 있게해준다. (AABB쿼리, 레이캐스트)
- Box2D와의 대부분의 상호 작용은 b2World 객체와 함께 수행된다.
### 5.5.1. **Creating and Destroying a World**
- 중력 벡터와 body가 sleep 상태로 변할 수 있는지에 대한 여부만 넘겨주면 된다.
- 일반적으로 포인터를 사용하여 생성, 해제 한다.
```cpp
b2World* myWorld = new b2World(gravity, doSleep);
// ... do stuff ...
delete myWorld;
```
### 5.5.2. **Using a World**
- world 클래스에는 body와 조인트를 생성하고 파괴하는 팩토리가 있다.
- 그 외에 여러 상호작용을 지원한다.
#### 5.5.2.1. **Simulation**
- world 클래스는 시뮬레이션을 구동하는데 사용된다.
- time step 과 velocity, position iteration count 를 지정해야한다.
```cpp
float timeStep = 1.0f / 60.f;
int32 velocityIterations = 10;
int32 positionIterations = 8;
myWorld->Step(timeStep, velocityIterations, positionIterations);
```
- time step 후에 body와 joints에 대한 검사를 수행할 수 있다.
- actor를 업데이트하고 렌더링할 수 있도록 body에서 position을 가져올 수 있다.
- 게임 루프 어느 곳에서든 timestep을 수행할 수 있다.
- 예를들어, 해당 프레임의 새로운 body에 대한 충돌 결과를 얻으려면 time step이전에 body를 생성해야한다.
- 고정된 timestep을 사용해야한다. (더 큰 time step은 low frame rate 시나리오에서 성능을 높일 수 있다.)
- 일반적으로 1/30 보다 작은 time step을 사용한다. (1/60은 고품질 시뮬레이션)
- 반복횟수는 제약 조건 솔버가 world의 모든 contacts 과 joints을 sweep하는 횟수를 제어한다.
- 더 많은 반복은 더 나은 시뮬레이션을 생성한다.
- (하지만 60hz에서 10번 반복이 30hz에서 20회 반복보다 더 좋다)
- stepping 후에는 body에 적용하고 있는 모든 forces를 제거해야한다.
- clearforces 함수를 통해 수행할 수 있다.
```cpp
myWorld->ClearForces();
```
#### 5.5.2.2. **Exploring the World**
- body, contact, joint 리스트들을 가져와 탐색할 수 있다.
- 아래의 코드는 모든 body를 깨우는 코드이다.
```cpp
for (b2Body* b = myWorld->GetBodyList(); b; b = b->GetNext())
{
b->SetAwake(true);
}
```
- 실제 코드에 적용하려면 좀 더 복잡해진다. 예를들어 아래는 오류가 발생할 수 있다.
```cpp
for (b2Body* b = myWorld->GetBodyList(); b; b = b->GetNext())
{
GameActor* myActor = (GameActor*)b->GetUserData().pointer;
if (myActor->IsDead())
{
myWorld->DestroyBody(b); // ERROR: now GetNext returns garbage.
}
}
```
- 만약 위처럼 조회하던 중에 body가 파괴되면(죽은 캐릭터를 파괴), next 포인터는 쓰레기값을 리턴한다.
- 이를 해결하기 위해서는 body를 파괴하기전에 next 포인터를 복사하는것이다.
```cpp
b2Body* node = myWorld->GetBodyList();
while (node)
{
b2Body* b = node;
node = node->GetNext();
GameActor* myActor = (GameActor*)b->GetUserData().pointer;
if (myActor->IsDead())
{
myWorld->DestroyBody(b);
}
}
```
- 위 코드는 현재의 body를 안전하게 제거하지만, 만약 여러 body를 제거하려면 다음과 같이 코드를 짜야한다. (GameCrazyBodyDestroyer에서 body가 삭제되면, 다시 world 쿼리)
```cpp
b2Body* node = myWorld->GetBodyList();
while (node)
{
b2Body* b = node;
node = node->GetNext();
GameActor* myActor = (GameActor*)b->GetUserData().pointer;
if (myActor->IsDead())
{
bool otherBodiesDestroyed = GameCrazyBodyDestroyer(b);
if (otherBodiesDestroyed)
{
node = myWorld->GetBodyList();
}
}
}
```
#### 5.5.2.3. **AABB Queries**
- 경우에 따라 영역에 있는 모든 shape를 확인하고 싶을 때가 있다.
- b2World 클래스는 이를 위해 광범위한 데이터 구조를 사용해 log(N)방법을 사용한다.
- 쿼리하기 위해서 world 좌표를 가진 AABB와 [b2QueryCallback](https://box2d.org/documentation/classb2_query_callback.html)을 구현해야한다.
- 예를 들어 다음 코드는 지정된 AABB와 겹치는 모든 fixture 를 찾고 관련된 모든 body를 깨운다.
```cpp
class MyQueryCallback : public b2QueryCallback
{
public:
bool ReportFixture(b2Fixture* fixture)
{
b2Body* body = fixture->GetBody();
body->SetAwake(true);
// Return true to continue the query.
return true;
}
};
// Elsewhere ...
MyQueryCallback callback;
b2AABB aabb;
aabb.lowerBound.Set(-1.0f, -1.0f);
aabb.upperBound.Set(1.0f, 1.0f);
myWorld->Query(&callback, aabb);
```
- You cannot make any assumptions about the order of the callbacks.
#### 5.5.2.4. **?Ray Casts?**
- 레이 캐스트를 통해 가시선 검사(line-of-sight check), 총 발사(fire gun) 등을 수행할 수 있다.
- 콜백 클래스를 구현하고, 시작점과 끝점을 제공하여 광선 투사를 수행해야한다.
- world 클래스는 광선 투사를 수행한다.
- world 클래스는 구현한 클래스에 광선에 맞은 fixture를 보고한다.
- 콜백은 fixture, 교차점, 단위 법선 벡터 및 광선에 따른 fractional distance를 함께 제공한다.
- 콜백의 순서에 대해 어떠한 가정도 할 수 없다.
- 반환된 fraction을 통해 레이 캐스트의 연속을 제어한다.
- fraction이 0일 경우, 레이 캐스트가 종료되어야함을 나타낸다.
- 1일 경우 적중이 발생하지 않아, 계속되어야함을 나타낸다.
- 만일 인수목록에서 fraction을 반환하면, 광선이 현재 교차점으로 잘린다.
- 따라서 모든 shape를 레이 캐스팅하거나, 어느 한 shape를 레이캐스팅하거나, 적절한 fraction을 반환하여 가장 가까운 shape를 레이캐스팅할 수있다.
- fixture를 필터링하기 위해 -1의 분수를 반환할 수 있다.
- 이러면 fixture가 존재하지 않는 것처럼 레이 캐스트가 진행된다.
```cpp
// This class captures the closest hit shape.
class MyRayCastCallback : public b2RayCastCallback
{
public:
MyRayCastCallback()
{
m_fixture = NULL;
}
float ReportFixture(b2Fixture* fixture, const b2Vec2& point,
const b2Vec2& normal, float fraction)
{
m_fixture = fixture;
m_point = point;
m_normal = normal;
m_fraction = fraction;
return fraction;
}
b2Fixture* m_fixture;
b2Vec2 m_point;
b2Vec2 m_normal;
float m_fraction;
};
// Elsewhere ...
MyRayCastCallback callback;
b2Vec2 point1(-1.0f, 0.0f);
b2Vec2 point2(3.0f, 1.0f);
myWorld->RayCast(&callback, point1, point2);
```
> Caution: Due to round-off errors, ray casts can sneak through small cracks between polygons in your static environment. If this is not acceptable in your application, trying slightly overlapping your polygons.
# 6. **Loose Ends**
......
......@@ -10,13 +10,21 @@
- 윈도우: `windows.h`, `import mmap`
- 오픈소스 mediapipe, stb, glm, glfw 추가
- mediapipe 소스코드 작성
## 2022/1/12
- vulkan api를 사용하여 손 렌더링.
- 그래픽스 API인 vulkan api를 사용하여 손 렌더링.
- 이전에 작성한 코드 활용.
![vulkan](https://github.com/Nor-s/Nor-s.github.io/raw/main/img/Jan-12-2022%2021-20-58.gif)
## 2022/1/13 ~ 2022/1/14
- box2D 문서 읽고 정리
- 물리엔진 오픈소스인 box2D 공식 문서 읽고 정리
## 2022/1/15
- box2D 문서 읽고 정리
- 손 객체 크기 조정하는 함수 추가, y축 반전
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment