空間に線を描画していけばいいと思うのですが、その計算式はどういったものになるのでしょうか?
それと、球の塗りつぶしは行わないようにしたいです(DrawSphere3D関数のFillFlagを、falseにしたいという意味です)。
現状のプログラムは以下のようになっております。
まだ、空間に線を3本描画しただけです。
言語:C++
コンパイラ:VisualStudio2010
ライブラリ:DirectX SDK June2010、hogeライブラリ(自作のライブラリ)
OS:Windows10
//インクルード
#include"d3dx9.h"
#include"hoge.h"
//ライブラリのリンク
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#pragma comment (lib, "dxguid.lib")
#pragma comment (lib, "winmm.lib")
#pragma comment (lib, "hoge.lib")
//定数定義
#define SCREEN_WIDTH (800)
#define SCREEN_HEIGHT (600)
#define CLASS_NAME "AppClass"
#define WINDOW_NAME "DirectX"
//グローバル変数
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
int g_nCountFPS = 0;
hoge::LINE3D TempLine[3]; //線描画用インスタンス
//プロトタイプ宣言
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT Init(HINSTANCE hInstance, HWND hWnd, BOOL bWindow);
void Uninit();
void Update();
void Draw();
//WinMain関数(エントリーポイント)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
WNDCLASSEX wcex = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0, 0, hInstance, NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, CLASS_NAME, NULL };
HWND hWnd;
MSG msg;
RegisterClassEx(&wcex);
hWnd = CreateWindowEx(0, CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, (SCREEN_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2), (SCREEN_HEIGHT + GetSystemMetrics(SM_CXDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION)), NULL, NULL, hInstance, NULL);
if(FAILED(Init(hInstance, hWnd, TRUE))){ return -1; }
DWORD dwExecLastTime;
DWORD dwFPSLastTime;
DWORD dwCurrentTime;
DWORD dwFrameCount;
timeBeginPeriod(1);
dwExecLastTime = dwFPSLastTime = timeGetTime();
dwCurrentTime = dwFrameCount = 0;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(1){
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){
if(msg.message == WM_QUIT){
break;
}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else{
dwCurrentTime = timeGetTime();
if((dwCurrentTime - dwFPSLastTime) >= 500){
g_nCountFPS = (dwFrameCount * 1000) / (dwCurrentTime - dwFPSLastTime);
dwFPSLastTime = dwCurrentTime;
dwFrameCount = 0;
}
if((dwCurrentTime - dwExecLastTime) >= (1000/60)){
dwExecLastTime = dwCurrentTime;
Update();
Draw();
dwFrameCount++;
}
}
}
UnregisterClass(CLASS_NAME, wcex.hInstance);
Uninit();
timeEndPeriod(1);
return (int)msg.wParam;
}
//コールバック関数
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch(wParam){
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//初期化
HRESULT Init(HINSTANCE hInstance, HWND hWnd, BOOL bWindow){
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE d3ddm;
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL){
return E_FAIL;
}
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))){
return E_FAIL;
}
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = bWindow;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
if(bWindow){
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
}else{
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
}
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice))){
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice))){
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice))){
return E_FAIL;
}
}
}
//キー入力初期化
hoge::KEY::Init(hInstance, hWnd);
//カメラ初期化
hoge::CAMERA::SetPos(10.0f, 6.0f, 10.0f);
hoge::CAMERA::SetTarget(0.0f, 0.0f, 0.0f);
hoge::CAMERA::SetUP(0.0f, 1.0f, 0.0f);
return S_OK;
}
//更新
void Update(){
//キー入力更新
hoge::KEY::Update();
//カーソルキー上下で、カメラの座標を上下する
if(hoge::KEY::Push(DIK_UP)){
hoge::CAMERA::AddPos(0.0f, 0.1f, 0.0f);
}
else if(hoge::KEY::Push(DIK_DOWN)){
hoge::CAMERA::AddPos(0.0f, -0.1f, 0.0f);
}
}
//描画
void Draw(){
g_pD3DDevice->Clear(0, NULL, (D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER), D3DCOLOR_RGBA(128,128,255,0), 1.0f, 0);
if(SUCCEEDED(g_pD3DDevice->BeginScene())){
//カメラセット
hoge::CAMERA::Set(g_pD3DDevice, SCREEN_WIDTH, SCREEN_HEIGHT, 10.0f, 20000.0f);
//線描画
TempLine[0].Draw(D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(10.0f, 0.0f, 0.0f), g_pD3DDevice);
TempLine[1].Draw(D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 10.0f, 0.0f), g_pD3DDevice);
TempLine[2].Draw(D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 10.0f), g_pD3DDevice);
g_pD3DDevice->EndScene();
}
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
//後処理
void Uninit(){
if(g_pD3DDevice != NULL){
g_pD3DDevice->Release();
g_pD3DDevice = NULL;
}
if(g_pD3D != NULL){
g_pD3D->Release();
g_pD3D = NULL;
}
}
//球を描画する
void DrawSphere(const D3DXVECTOR3 _CenterPos, const float _r, const int _DivNum){
}