MoniWiki딱지_Tokamak
Login:
Password:
대문|찾기|바뀐글|목록|메모장|책갈피|연꽃|링크
Edit Diff Reload Search Print Info Mail Help RSS

@ 2004-12-14 @

  the Tokamak physics engine
http://www.tokamakphysics.com - SDK download
http://www.adamdawes.com/programming/tokamak/index.html - Tokamak physics tutorials
▲ tutorial 3 - 구와 실린더 생성
▲ tutorial 4 - reset과 출력을 위한 버텍스/인덱스 버퍼 채우기
▲ tutorial 5 - 지형 CallBack 사용하는 방법(함수 포인터로 받음)
http://www.codesampler.com/dx9src.htm
▲ dx9_tokamak_chain - 오브젝트 상이에 joint를 두어서, 체인처럼 연결(SDK가 있어도, 설명이 억수로 부실(??))
▲ dx9_tokamak_geometry - 오브젝트를 .X파일을 사용, neAnimatedBody의 회전처리와, 힘을 셋팅하는 방법을 보여줌

▷ 창훈이 쉽다는 말과 손이 놀고 있어서, 튜토리얼 따라하고 있는데,
물리엔진이라서 그런지 맥스에서 하복 적용할 때와 거의 비슷한 순서로 적용되고,
다른점이 있다면 UI인터페이스가 아니라(필요하면 만들야지 ^^;;)
아직은 코드로 쳐넣고, 머리로 상상을 좀더 해야되는 정도로 맛보고 있음
▷ 글쎄, 써먹을 일이 있을지는 나중 일, 지금은 튜토리얼 하면서 정리하자.(물론 내 손 가는대로 ㅋㅋㅋ )
공개엔진이지만, 역시나 SDK에 만족할 만한 설명이 부족해서 아는만큼 정리...

          # 기본 구조
          # mass inertia tensor 설정
          # 지형 CallBack 설정시 주의점
          # 기타
{_r} 메모장으로 가기


    ◎ 기본 구조
▷ Head에 포함
#pragma comment(lib, "tokamak.lib")
#include <tokamak.h>
▷ 구성
neSimulator * gSim; // 물리공간
neRigidBody * gCubesCUBECOUNT; // 충돌물체
neAnimatedBody * gFloorFloorCOUNT; // 고정물체
▶ 물리공간; neSimulator * gSim;
-1.물리공간을 해제하면 공간에 존재하는 모든 물체는 소거된다.
if (gSim)
{
neSimulator::DestroySimulator(gSim);
gSim = NULL;
}
-2.설정
gSim = neSimulator::CreateSimulator(sizeInfo, NULL, &gravity);
neSimulatorSizeInfo sizeInfo; // 충돌이 발생하는 공간의 정보
sizeInfo.rigidBodiesCount = CUBECOUNT;
sizeInfo.animatedBodiesCount = FloorCOUNT;
s32 totalBody = sizeInfo.rigidBodiesCount + sizeInfo.animatedBodiesCount;
sizeInfo.geometriesCount = totalBody; // 물리공간에서 처리해야될 전체물체의 갯수(적어면 바로 error)
sizeInfo.overlappedPairsCount = totalBody * (totalBody - 1) / 2;
// 한번에 얼마나 많은 물체들이 충돌할지 설정, SDK에서 이런식으로 사용하라네요 ??
sizeInfo.rigidParticleCount = 0; // ?
sizeInfo.constraintsCount = 0; // ?
// 지형이 없을 때는 0으로 설정하고, 지형이 있을 때는 이 값을 설정하지 않는다.
(_cr) sizeInfo.terrainNodesStartCount = 0;
neV3 gravity; // 중력 가속도(neV3은 float * 3 타입의 벡터)
gravity.Set(0.0f, -10.0f, 0.0f);
▶ 충돌물체; neRigidBody * gCubesCUBECOUNT;
-1.설정
neGeometry * geom; // 이 형식을 사용해서 물체의 세부사항을 설정(자세한 내용 SDK에서도 찾지 못함)
neV3 boxSize1; // 출동박스 크기
neV3 pos; // 위치
f32 mass; // 질량(중력을 감안한다면 무게가 됨)

gCubes[i] = gSim->CreateRigidBody(); // 물리공간에서 어떤 역할을 할지 설정
geom = gCubes[i]->AddGeometry();
boxSize1.Set(1.0f, 1.0f, 1.0f); // 충돌박스 크기
geom->SetBoxSize(boxSize1[0], boxSize1[1], boxSize1[2]);
gCubes[i]->UpdateBoundingInfo(); // 충돌박스 설정
// 충돌체에 대한 특성 설정 (mass, position, mass inertia tensor.)
mass = 1.0f;
(_cr) gCubes[i]->SetInertiaTensor(neBoxInertiaTensor(boxSize1[0], boxSize1[1], boxSize1[2], 1.0f));
// Tensor 값이 너무 작으면 neAnimatedBody를 뚫고 지나간다.(Tensor의 종류설정)
gCubes[i]->SetMass(mass); // 질량 설정(값이 너무 커지면 neAnimatedBody를 뚫고 지나간다.)
pos.Set((float)(i) / 4, 3.0f + i*2.0f, (float)(rand()%10) / 100); // 초기위치 설정
gCubes[i]->SetPos(pos);
// Set the angular damping for the object - 값이 커지면 잘 구르지 않고, 충돌했을 때 많이 튄다.
gCubes[i]->SetAngularDamping(0.001f);

▶ 고정물체; neAnimatedBody * gFloorFloorCOUNT;
-0.고정물체는 mass나 mass inertia tensor의 설정이 필요없다.
-1.설정
gFloor = gSim->CreateAnimatedBody(); // 물리공간에서 어떤 역할을 할지 설정
geom = gFloor[i]->AddGeometry();
boxSize1.Set(FLOORSIZE, 0.2f, FLOORSIZE); // 충돌박스 크기
geom->SetBoxSize(boxSize1[0],boxSize1[1],boxSize1[2]);
gFloor->UpdateBoundingInfo(); // 충돌박스 설정
pos.Set(float(i)*4, -float(i)*3, 0.0f);
gFloor[i]->SetPos(pos); // 초기위치 설정

▶ 지형;
-0.gSim->SetTerrainMesh( neTriangleMesh &triMesh ); // triMesh를 채우는 방식으로
충돌/ 고정물체와는 다르게 처리되고,
tutorial 4에서는 D3DPT_TRIANGLELIST방식으로 삼각형을 채운다.
-1.설정
neTriangleMesh triMesh; // 물리공간에 지형을 채운다.
neV3 triVerticesTERRAIN_VERTEXCOUNT; // 지형의 버텍스 정보를 채운다.
neTriangle triDataTERRAIN_TRIANGLECOUNT; // 지형의 면 정보를 채운다.
triMesh.vertexCount = TERRAIN_VERTEXCOUNT;
triMesh.vertices = triVertices;
triMesh.triangles = triData; // Set the triangles into the triMesh
gSim->SetTerrainMesh(&triMesh);
-9.주의
물리공간의 sizeInfo.terrainNodesStartCount의 정보를 설정하지 않는다.
// No need to tell Tokamak about our terrain nodes, the sizeInfo's default values will suffice
( tutorial 4의 주석)

▷ 변화(역시 물리엔진엔 시간변수가 변수가 친구^^*)
-1.loop가 돌 때마다, 델타시간을 넣어주면 자동으로 물체들의 위치를 계산
gSim->Advance(0.01f);
-2.Reset을 하기 위해서는 오브젝트의 위치, 속도, 회전, 회전모우멘트를 초기화 시킨다.
(tokamak의 인터페이스만 알고, 내부 사정을 잘 모르기 때문에 인터페이스에 맞춰서 초기화 시킴)
neV3 pos;
neV3 force;
neM3 gCubes_InitM3;
force.Set( 0.0f, 0.0f, 0.0f );
for ( int i=0; i<CUBECOUNT; ++i)
{
gCubes[i]->SetRotation( gCubes_InitM3 ); // 회전값을 초기화
pos.Set((float)(i) / 4, 3.0f + i*2.0f, (float)(rand()%10) / 100);
gCubes[i]->SetPos(pos); // 위치를 초기화
gCubes[i]->SetVelocity( force ); // 속도를 초기화
gCubes[i]->SetAngularMomentum( force );
}
-3.간단하게 물리공간을 해제하고, 다시 만들어서 초기화 시킬 수 있지만,
지금의 상태에서 다음 변화를 주기 위해서는 내부 상태값을 원하는 값을 셋팅해서 사용해야 한다.


    ◎ mass inertia tensor 설정
▷ 충돌박스의 모양에 따라 파라미터 형식이 조금씩 다르다.
-1.Box
boxSize1.Set(1.0f, 1.0f, 1.0f); // 충돌박스 크기
geom->SetBoxSize(boxSize1[0], boxSize1[1], boxSize1[2]);
gCubes[i]->UpdateBoundingInfo(); // 충돌박스 설정
-2.Sphere
geom->SetSphereDiameter(SPHEREDIAM);
gSpheres[i]->UpdateBoundingInfo();
-3.Cylinder
geom->SetCylinder(CYLINDERDIAM, CYLINDERHEIGHT);
gCylinders[i]->UpdateBoundingInfo();


    ◎ 지형 CallBack 설정시 주의점
CallBack 함수가 함수 포인터를 받는다는 점에 주의해서 tutorial 5를 참고.
void SetTerrainTriangleQueryCallback(neTerrainTriangleQueryCallback * cb);
neTerrainTriangleQueryCallback * GetTerrainTriangleQueryCallback();
-1.오브젝트와 충돌하는 Triangle의 검출 기준이 되는 neTriangleMesh를 가공할 때는
neTriangleMesh를 구성하는 neV3와 neTriangle 배열을 묶어서 같은 (전역)형식으로 처리한다!
-2.물리엔진 설정시, 오브젝트에 고유 번호를 부여하고(gSpheres[i]->SetUserData(i);) CallBack함수를 호출하는 것으로 설정을 마칠 수 있으며, Tokamak에 맞는 형식으로 Triangle을 채운다.


    ◎ 기타
▷ 변수
-1.기본정의
typedef _ float _ f32;
typedef _ double _ f64;
-2.neV3 형은 float형 3개의 값을 받아 벡터를 표현( typedef float f32 );
neV3 pos;
pos.Set(0.0f, -10.0f, 0.0f);
-3.neM3 형은 회전을 표현하기 위한 구조체
struct neM3
{ neV3 M[3];
함수()...로 구성 }
◇ 외부의 영향을 이동하고, 회전한 결과를 다이렉트X(API)에 적용하기 위해서는
tokamak에서 계산된 결과를 Wrold변환 매트릭스로 값으로 변환시켜서 적용시켜 주는 방식으로 사용하면 되는데,
스핀(회전)도 가지기 때문에 물체의 특성을 나타내는 특성치 설정에 주의가 필요하다.
-.설정 값에 따라 과도하게 튀기도 하고, 고정물을 뚫고 지나가기 때문에 테스트가 필요
▷ dx9_tokamak_chain에 보는 바와 같이, 관절처럼 사용할 수 있는 joint에 대한 설정도 있고,
변수들을 보면 파티클을 처리하는 부분도 있지만 여기에 관한 정보는 tutorial에서 찾을 수 없지만, 참고로 tokamak홈에 Forum에 여기서 다루지 않는 부분에 관한 내용이 있다.


{_r} 메모장으로 가기

August, 2019
 123
45678910
11121314151617
18192021222324
25262728293031

시간을 존중하고, 기술에 겸손하며, 자기를 사랑하자.

메모장_형상관리
딱지_데이터베이스
Cpp_enum
BoardMacro
last modified 2005-01-20 06:17:19
고치기|찾기|쪽 지우기|비슷한 쪽 Valid XHTML 1.0! Valid CSS! powerd by MoniWiki
0.4301 sec