Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
순건 노
hand-window
Commits
b7b91322
Commit
b7b91322
authored
3 years ago
by
Nor-s
Browse files
Options
Download
Email Patches
Plain Diff
Update note
parent
722b8113
main
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
note/box2d_문서번역.md
+202
-6
note/box2d_문서번역.md
note/로그.md
+11
-2
note/로그.md
with
213 additions
and
8 deletions
+213
-8
note/box2d_
정리
.md
→
note/box2d_
문서번역
.md
View file @
b7b91322
...
...
@@ -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.0
f
/
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.0
f
,
-
1.0
f
);
aabb
.
upperBound
.
Set
(
1.0
f
,
1.0
f
);
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.0
f
,
0.0
f
);
b2Vec2
point2
(
3.0
f
,
1.0
f
);
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**
...
...
This diff is collapsed.
Click to expand it.
note/로그.md
View file @
b7b91322
...
...
@@ -10,13 +10,21 @@
- 윈도우: `windows.h`, `import mmap`
-
오픈소스 mediapipe, stb, glm, glfw 추가
-
mediapipe 소스코드 작성
## 2022/1/12
-
vulkan api를 사용하여 손 렌더링.
-
그래픽스 API인 vulkan api를 사용하여 손 렌더링.
-
이전에 작성한 코드 활용.

## 2022/1/13 ~ 2022/1/14
-
box2D 문서 읽고 정리
-
물리엔진 오픈소스인 box2D 공식 문서 읽고 정리
## 2022/1/15
-
box2D 문서 읽고 정리
-
손 객체 크기 조정하는 함수 추가, y축 반전
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help