DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 7年前

DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#1

投稿記事 by sadora3 » 2年前

DirectX9で、DXライブラリの関数の一つである、「DrawSphere3D関数」を実装したいのですが、どうすれば出来るのでしょうか?
空間に線を描画していけばいいと思うのですが、その計算式はどういったものになるのでしょうか?
それと、球の塗りつぶしは行わないようにしたいです(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){
	
}

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#2

投稿記事 by Dixq (管理人) » 2年前

複数の名前を使って投稿されているようですが、理由は何かあるのでしょうか。

sadora3
記事: 175
登録日時: 7年前

Re: DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#3

投稿記事 by sadora3 » 2年前

申し訳ありませんが、心当たりがありません。
私はアカウントを一つしかもっておりません。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#4

投稿記事 by Dixq (管理人) » 2年前

分かりました。
アクセス元情報が他の人と一致していましたが
たまたま一致したのかもしれません。

Math

Re: DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#5

投稿記事 by Math » 2年前

こういう事は”本家”にきかれた方が良いかと思いますけど...。
http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi

sadora3
記事: 175
登録日時: 7年前

Re: DirectX9で、DXライブラリの「DrawSphere3D関数」を実装したい

#6

投稿記事 by sadora3 » 2年前

ありがとうございます。
URL先の方で聞いてこようと思います。

返信

“C言語何でも質問掲示板” へ戻る