혹시 c++로 다이렉트X 해보신분 있으신가요?

#include <windows.h>
#include "d3dx9.h"

//-----------------------------------------------------------------------------
// 전역 변수 

LPDIRECT3D9             g_pD3D = NULL; // Direct3D 객체 
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // 랜더링 장치 (비디오카드)
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 버텍스 버퍼 
HWND g_hWnd;				// 메시지 박스 처리를 편하게 하기 위해 임시적으로 전역변수화


class CPhysicalObject {

private:
	int  bFire;
public:
	float a[3]; // 가속도 0,1,2 아마 x,y,z축 순서일듯
	float v[3]; // 속도
	float p[3]; // 위치
public:
	CPhysicalObject() { //생성자
		bFire = 0; //물체가 움직이지 않는 상황
		for (int i = 0; i < 3; i++) {
			a[i] = v[i] = p[i] = 0;
		}
		g_po.a[1] = -50.f; // 달의 중력 가속도 y방향
		g_po.v[0] = 0; //x축으로 계속 가게
		g_po.v[1] = 50; //[0],[1],[2] 는 xyz축 
		g_po.p[1] = 200; // 삼각형의 초기 위치 y방향
		//기본 세팅
	}
	void Fire() {
		bFire = 1; //움직이도록 플래그 켜줌
	}
	void UseFuel() {
		v[1] += 20.0f;  //속도를 y방향으로 20만큼 계속 더해줌
	}
	void Update(float time) {
		
		if (bFire == 0) return; //bfire가 0, 쏘는 상태가 아니면 계속 가만히 있음
		//if(p[1]<0) return;

		//이 아래는 bFire == 0이 아닐시 실행되는 코드들
		for (int i = 0; i < 3; i++) {
			//p[i] = p[i] + v[i]*time + 0.5*a[i]*time*time;
			p[i] = p[i] + v[i] * time; 
			v[i] = v[i] + a[i] * time; //위치계산, 속도계산 순, time은 흐른시간 의미
		}

		if (p[1] < 0) { //충돌발생, y축 위치가 0보다 작을시
			
			v[1] = fabs(v[1]);
			p[1] = 0;

			//bFire = 0;
			//if( fabs(v[1]) > 50 ) //속도가 50이상 빠르게 떨어지면
			//	MessageBox(g_hWnd, L"BOOM", L"BOOM", MB_OK); //boom 터지는것
			//else //아니면
			//	MessageBox(g_hWnd, L"good", L"nice landing", MB_OK); //good 잘떨어짐
			//	
		}

	}
} g_po;


// frame count
//int g_iFrame = 0;
int g_bFire = FALSE;
int g_prev = 0;

// 커스텀 버텍스 타입 구조체 
struct CUSTOMVERTEX
{
	FLOAT x, y, z;    // 3D 좌표값
	DWORD color;      // 버텍스 색상
};

// 커스텀 버텍스의 구조를 표시하기 위한 FVF(Flexible Vertex Format) 값 
// D3DFVF_XYZ(3D 월드 좌표) 와  D3DFVF_DIFFUSE(점의 색상) 특성을 가지도록.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)




//-----------------------------------------------------------------------------
// 이름: InitD3D()
// 기능: Direct3D 초기화 
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
	// Direct3D 객체 생성 
	if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
		return E_FAIL;

	// 장치 생성용 데이타 준비
	D3DPRESENT_PARAMETERS d3dpp;         // 장치 생성용 정보 구조체 변수 선언
	ZeroMemory(&d3dpp, sizeof(d3dpp)); // 변수 클리어 
	d3dpp.Windowed = TRUE;                    // 윈도우 모드로 실행 설정 
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 스왑 방법 설정
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;  // 백버퍼 포맷은 현재 데스크탑 
											  // 형식으로 설정 

	// D3D객체의 장치 생성 함수 호출 (디폴트 비디오카드 사용, HAL 사용,
	// 버텍스 처리 하드웨어 사용 지정)
	if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_HARDWARE_VERTEXPROCESSING,
		&d3dpp, &g_pd3dDevice)))
	{
		return E_FAIL;
	}

	// 이제 장치가 정상적으로 생성되었음.

	return S_OK;
}



//-----------------------------------------------------------------------------
// 이름: InitGeometry()
// 기능: 버텍스 버퍼를 생성한 후 버텍스로 채운다. 
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
	// 버텍스 버퍼에 넣을 버텍스 자료를 임시로 만든다. 
	CUSTOMVERTEX vertices[] =
	{
	{ -200.0f,  0.0f, 0.0f, 0xff00ff00, }, // x축 라인을 위한 버텍스 , x축 연두색
	{ 200.0f,  0.0f, 0.0f, 0xff00ff00, },

	{ 0.0f, 0.0f, -200.0f, 0xffffff00, },  // z축 라인을 위한 버텍스, 노란색
	{ 0.0f, 0.0f,  200.0f, 0xffffff00, },

	{ 0.0f, -200.0f, 0.0f, 0xffff0000, },  // y축 라인을 위한 버텍스, 빨간색
	{ 0.0f,  200.0f, 0.0f, 0xffff0000, },

	{ 0.0f, 20.0f, 0.0f, 0xffff0000, },  // 삼각형의 첫 번째 버텍스
	{ -20.0f,  0.0f, 0.0f, 0xffff0000, },  // 삼각형의 두 번째 버텍스 
	{ 20.0f,  0.0f, 0.0f, 0xffff0000, },  // 삼각형의 세 번째 버텍스 
	//첫번째 삼각형 빨간색
	{ 0.0f, 20.0f, 0.0f, 0xffFFB400, },  // 삼각형의 첫 번째 버텍스 
	{ -20.0f,  0.0f, 0.0f, 0xffFFB400, },  // 삼각형의 두 번째 버텍스 
	{ 20.0f,  0.0f, 0.0f, 0xffFFB400, },  // 삼각형의 세 번째 버텍스 
	//두번째 삼각형 노란색
	{ 0.0f, 20.0f, 0.0f, 0xff00FFFF, },  // 삼각형의 첫 번째 버텍스 
	{ -20.0f,  0.0f, 0.0f, 0xff00FFFF, },  // 삼각형의 두 번째 버텍스 
	{ 20.0f,  0.0f, 0.0f, 0xff00FFFF, },  // 삼각형의 세 번째 버텍스 
	//세번째 삼각형 하늘색
	{ 0.0f, 20.0f, 0.0f, 0xffFFFFFF, },  // 삼각형의 첫 번째 버텍스 
	{ -20.0f,  0.0f, 0.0f, 0xffFFFFFF, },  // 삼각형의 두 번째 버텍스 
	{ 20.0f,  0.0f, 0.0f, 0xffFFFFFF, },  // 삼각형의 세 번째 버텍스 
	//네번째 삼각형 하얀색
	};

	// 버텍스 버퍼를 생성한다.
	// 각 버텍스의 포맷은 D3DFVF_CUSTOMVERTEX 라는 것도 전달 
	if (FAILED(g_pd3dDevice->CreateVertexBuffer(18 * sizeof(CUSTOMVERTEX),
		0, D3DFVF_CUSTOMVERTEX,
		D3DPOOL_DEFAULT, &g_pVB, NULL)))
	{
		return E_FAIL;
	}

	// 버텍스 버퍼에 락을 건 후 버텍스를 넣는다. 
	VOID* pVertices;
	if (FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
		return E_FAIL;
	memcpy(pVertices, vertices, sizeof(vertices));
	g_pVB->Unlock();

	return S_OK;
}



//-----------------------------------------------------------------------------
// 이름: Cleanup()
// 기능: 초기화되었던 모든 객체들을 해제한다. 
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	if (g_pVB != NULL)
		g_pVB->Release();

	if (g_pd3dDevice != NULL)    // 장치 객체 해제 
		g_pd3dDevice->Release();

	if (g_pD3D != NULL)          // D3D 객체 해제 
		g_pD3D->Release();
}



//-----------------------------------------------------------------------------
// 이름: SetupViewProjection()
// 기능: 뷰 변환과 프로젝션 변환을 설정한다. 
//-----------------------------------------------------------------------------
VOID SetupViewProjection()
{
	// 뷰 변환 설정 
	D3DXVECTOR3 vEyePt(0.0f, 100.0f, -400.0f);    // 카메라의 위치 
	D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);       // 바라보는 지점 
	D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);          // 업벡터 설정 
	D3DXMATRIXA16 matView;                           // 뷰변환용 매트릭스 
													 // 뷰 매트릭스 설정 
	D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
	// Direct3D 장치에 뷰 매트릭스 전달 
	g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);

	// 프로젝션 변환 설정 
	D3DXMATRIXA16 matProj;   // 프로젝션용 매트릭스 
							 // 프로젝션 매트릭스 설정 
	D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 2, 1.0f, 1.0f, 1000.0f);
	// Direct3D 장치로 프로젝션 매트릭스 전달 
	g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}


//-----------------------------------------------------------------------------
// 이름: Render()
// 기능: 화면을 그린다.
//-----------------------------------------------------------------------------
VOID Render()
{
	if (NULL == g_pd3dDevice)  // 장치 객체가 생성되지 않았으면 리턴 
		return;

	if (g_prev == 0) g_prev = GetTickCount(); //현재 시간을 스톱워치로 찍는 함수
	int current = GetTickCount();
	float dt = (current - g_prev) * 0.001f; // time step, 찍은시간 - 현재시간 = 흐른시간

	g_po.Update(dt);
	g_prev = current;
	//g_iFrame++;


	// 여기서 p[0],p[1],p[2]는 물체의 좌표를 나타낸다.

	// 뷰 및 프로젝션 변환 설정
	SetupViewProjection();

	// 삼각형의 앞/뒤 변을 모두 렌더링하도록 컬링 기능을 끈다.
	g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

	// 조명을 끈다. (조명에 의한 색상이 이나고, 버텍스 자체의 색상을 사용하도록)
	g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

	// 백버퍼를 지정된 색상으로 지운다.
	g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

	// 화면 그리기 시작 
	if (SUCCEEDED(g_pd3dDevice->BeginScene()))
	{
		///// 버텍스 출력 
		// 버텍스 버퍼 지정 
		g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
		g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); // 버텍스 포멧 지정 

		D3DXMATRIXA16 matWorld;  // 월드 변환용 매트릭스 선언 

		for (float x = -200; x <= 200; x += 20) {  // z 축에 평행한 라인을 여러 개 그리기 
			D3DXMatrixTranslation(&matWorld, x, 0.0, 0.0);  // x축에 따라 위치 이동 매트릭스   
			g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); // 변환매트릭스 적용 
			g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 2, 1);  // z축 라인 그리기 
		}

		for (float z = -200; z <= 200; z += 20) {  // x 축에 평행한 라인을 여러 개 그리기 
			D3DXMatrixTranslation(&matWorld, 0.0, 0.0, z);  // z 축에 따라 위치 이동 매트릭스
			g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);  // 변환매트릭스 적용 
			g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 1);   // x축 라인 그리기 
		}

		D3DXMatrixIdentity(&matWorld);   // 매트릭스를 단위 행렬로 리셋 
		g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);  // 변환 매트릭스 전달 
		g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 4, 1);   // y 축 그리기 

															 // 변환이 적용되지 않은 상태에서 삼각형 그리기 
		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 12, 1);

		// matWorld를 g_po 만큼 이동 변환 매트릭스로 만들기 
		D3DXMatrixTranslation(&matWorld, g_po.p[0], g_po.p[1], g_po.p[2]);


		// 복합 변환이 적용된 최종 매트릭스 marWorld를 장치로 전달 
		g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

		// 삼각형 출력 
		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 6, 1);


		// 화면 그리기 끝 
		g_pd3dDevice->EndScene();
	}

	// 백버퍼의 내용을 화면으로 보낸다. 
	g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

}

제가 지금 삼각형을 만들고 물리엔진을 넣은 예제코드를 이용해서

객체를 여러개 만들어서 각 객체별로 움직임을 갖게 하려고 했는데

예제코드를 보는데 객체가 어떻게 삼각형을 만드는 버텍스(정점)과 연결이 되는지

잘 이해가 안가서요

분명 구조체는 따로 만들어져있는데 그게 코드를 아무리 봐도 저 코드에서 사용한

첫번째 삼각형 버텍스 모음과 대치가 되는지 이해가 안가서요…

하늘색 삼각형은 위에 버텍스들로 그린 삼각형중 하나이고(여러개가 곂쳐있음)

빨간색 삼각형이 위에 g_po 구조체로 만들어져서

키보드로 명령이 입력이 가능한 삼각형인데

저게 어떻게 그려지는지 예제 코드를 아무리봐도 이해가 안가네요;

뒤늦게 스스로 해결하고 답글 쓰네요

프로그램이 본문에는 나와있지 않지만

winMain 에서 한번 실행되고

한번 실행 될때 HRESULT InitGeometry() 함수가 실행되는데

이곳에서 좌표들과 삼각형 좌표들을 이용해서 찍고

나중에 이곳의 좌표들을 다른곳에서 함수를 이용,수정하여

Render로 계속 새로 그리는 방식이었습니다…