約 4,838,230 件
https://w.atwiki.jp/arprojectfun/pages/46.html
ノート Direct3D 入門 BMP画像を表示する BMP画像をスプライトにテクスチャとして貼りつけて表示する方法を説明します。 サンプルプログラム Subversionリポジトリ内、下記の場所にVisual Studio のプロジェクトがあります trunk/directx/ShowXFile_base20100511 やること BMP画像をスプライトに貼りつけて3D空間上で表示する 用語 ジオメトリ 「頂点」「線」「平面」(ポリゴン)という3D空間上の幾何学図形 テクスチャ 3次元コンピュータグラフィックスで、物体の表面の質感を表現するために貼り付ける画像のこと スプライト キャラクターなどを表す画面上の2Dイメージ。Direct3Dでは、4頂点から成る4角形ジオメトリにテクスチャを張り付けたものとして扱う。 解説 stdafx.h インクルードファイルについて ポリゴンの表示では //DirectX ヘッダー ファイル #include d3d9.h のように、d3d9.h をインクルードしていましたが、 //DirectX ヘッダー ファイル #include d3dx9.h 今回は d3dx9.h をインクルードします。 ShowXFile_test20100510.cpp 定義とグローバル宣言 // シンボル定義及びマクロ #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define SPRITE_WIDTH 200 #define SPRITE_HEIGHT 246 ウィンドウサイズは800x600、スプライトの画像は200x246だと指定している。 #define SAFE_RELEASE(p) { if(p) { (p)- Release(); (p)=NULL; } } Direct3D のインスタンスをメモリから開放するためのマクロ。 PDIRECT3D9 pD3d = NULL; //Direct3Dへアクセスするためのポインタ LPDIRECT3DDEVICE9 pDevice = NULL; //ビデオカードへアクセスするためのポインタ pD3d は「Direct3オブジェクト」、pDevice は「Direct3Dデバイス・オブジェクト」。 Direct3Dのプログラムではこの2つが必須。 LPDIRECT3DTEXTURE9 pTexture; LPD3DXSPRITE pSprite; テクスチャ・オブジェクト(pTexture)、スプライト・オブジェクト(pSprite)を宣言している。 InitD3d 関数 プロトタイプ宣言部 HRESULT InitD3d(HWND); //DirectXの初期化 Direct3D 関係のオブジェクトを作って、初期化する関数。 はじめに一度だけ InitInstance() から実行される。(147行目あたり) if(FAILED (InitD3d(hWnd))) { return FALSE; } Direct3D を使うには、なによりもDirect3D オブジェクトを作らなければならない。 // 「Direct3D」オブジェクトの作成 if( NULL == ( pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) ) { MessageBox(0,TEXT("Direct3Dの作成に失敗しました"),TEXT(""),MB_OK); return E_FAIL; } Direct3DCreate9 関数により Direct3D オブジェクトが作られるこのように生成を手助けする外部関数を「ヘルパー関数」と呼んだりする Direct3D で使うその他のオブジェクトはすべてここで作成した Direct3D オブジェクトから作られる 次は、Direct3D デバイス・オブジェクトの作成(169~200行目あたり) Direct3D デバイス・オブジェクトとは、簡単にいえば、「ディスプレイ」「モニタ」「ビデオ・カード」のオブジェクトのこと 「IDirect3D9 CreateDevice メソッド」で作成する「IDirect3D9」はDirect3D オブジェクト、「CreateDevice」はそのメソッド if文が何重にもネストしているのは、様々なビデオ・カードの環境に対応するため使い回せばなんとかなる部分なので、詳細については割愛 ※FAILED() と SUCCEEDED() マクロ それぞれ括弧内の処理が失敗(FAILED)、成功(SUCCEEDED)したときに真を返すマクロ //「テクスチャオブジェクト」の作成 if(FAILED(D3DXCreateTextureFromFileEx(pDevice,TEXT("Sprite.bmp"),SPRITE_WIDTH,SPRITE_HEIGHT,0,0,D3DFMT_UNKNOWN, D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT, 0xff000000,NULL,NULL, pTexture))) { MessageBox(0,TEXT("テクスチャの作成に失敗しました"),TEXT(""),MB_OK); return E_FAIL; } D3DXCreateTextureFromFileEx関数を使ってテクスチャオブジェクトを作成する。 成功すると、pTexture が作成されたテクスチャオブジェクトを指すことになる。 // 「スプライトオブジェクト」の作成 if(FAILED(D3DXCreateSprite(pDevice, pSprite))) { MessageBox(0,TEXT("スプライトの作成に失敗しました"),TEXT(""),MB_OK); return E_FAIL; } D3DXCreateSprite関数を使ってスプライトオブジェクトを作成する。 成功すると、pSprite が作成されたスプライトオブジェクトを指すことになる。 DrawSprite 関数 プロトタイプ宣言部 VOID DrawSprite();//描画 スプライトを表示する関数 プログラムの起動中は常に繰り返し実行される pDevice- Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(30,30,30), 1.0f, 0 ); なにか描画を行う前には、画面をクリアする厳密には単色で画面を塗りつぶす ゲームなどでは多くの場合、1秒間に60回の更新を行う。その1回の更新を「1フレーム」と呼んだりする 各フレームの最初にはクリアが実行される if( SUCCEEDED( pDevice- BeginScene() ) ) クリアはしてもしなくても構わないが、「BeginScene メソッド」は実行しておかないと描画処理ができない。 あらゆる描画処理の前にはこのメソッドをコールすること RECT rect={0,0,SPRITE_WIDTH,SPRITE_HEIGHT}; RECT 構造体の rect を、BMP画像の大きさ(SPRITE_WIDTH x SPRITE_HEIGHT)で初期化する D3DXVECTOR3 vec3Center(0,0,0); D3DXVECTOR3 vec3Position(210,110,0); D3DXVECTOR3 は3次元ベクトルを表す構造体float 型のx, y, z をメンバとして持つ D3DVECTOR3 を継承した派生型で、加減算や乗算を直感的に行えるようオペレーター定義されている vec3Center はスプライトの中心座標絶対的なスクリーン座標ではなく、そのスプライト内のローカル座標でありウィンドウ上では相対座標中心を(0,0,0)とすると、スプライトの左上の点を意味する 通常は(スプライトの横幅半分,スプライトの縦幅半分,0)とする スプライトを回転させる際に、軸がずれているように回ってしまうため vec3Position はスプライトの位置(スクリーン座標)として使うウィンドウ上では絶対座標 この座標がスプライトの左上に対応している(0,0,0)とすればウィンドウの左上から描画される (400,300,0)とすれば(ウィンドウが800x600の場合)、ウィンドウの丁度真ん中から描画される pSprite- Begin(D3DXSPRITE_ALPHABLEND); スプライトの描画前には必ず「ID3DXSprite Begin メソッド」を実行する ここでの引数の意味は、「アルファ・ブレンド(透過処理)が効くようにする」ということ pSprite- Draw(pTexture, rect, vec3Center, vec3Position,D3DCOLOR_ARGB(255,255,255,255)); 先に作っておいたテクスチャを第1引数として与えることで、スプライトにテクスチャが貼られる 第2引数は、スプライトのサイズを保持した矩形 第3引数は、中心座標 第4引数は、位置の絶対座標 第5引数は、スプライトの透明度と色合いD3DCOLOR_ARGB マクロ () pSprite- End(); スプライト描画の終りには、「ID3DXSprite End メソッド」を実行する これを実行しないとスプライトが画面に描画されない pDevice- EndScene(); スプライトを含む全ての描画処理の後に実行する pDevice- Present( NULL, NULL, NULL, NULL ); 「IDirect3DDevice9 Present メソッド」は、画面を更新するためのもの なんにしろ、これも実行しないと画面が更新されないため、描画結果が見えない FreeDx 関数 プロトタイプ宣言部 VOID FreeDx();//後片付け プログラム内で作ったオブジェクトをメモリから開放する関数 プログラムの終了時に1度だけ実行される(82行目あたり) FreeDx(); //ループから抜けたときに後片付け 開放は『生成した順番とは逆』に行う メモ d3dx9.lib と d3dx9d.lib 前の項では d3dx9.lib を使っていて、 この項で参考にしている本では d3dx9.lib を指定しているが、 その違いは Debug 時に使うか(d3dx9d.lib)、Release 時に使うか(d3dx9.lib)の違いみたい。 なので、Visual Studio 上で試している限りでは d3dx9d.lib をインクルードしているままで大丈夫だと思う。 MFC + Direct Graphics - TMPSwiki WinAPI メッセージボックスについて error C2664 MessageBoxW 2 番目の引数を const char [29] から LPCWSTR に変換できません。(新しい機能 ; ヘルプを参照) こんなこと言われた場合の解決方法。 WinAPIメッセージボックスについて 資料(引用元だったり) 書籍 ゲームコーディング vol.1 Direct3D編 Web テクスチャとは 【texture】 - 意味/解説/説明/定義 : IT用語辞典
https://w.atwiki.jp/htmlwiki/pages/29.html
hr要素で、ページに線を付けることができます。 hr要素には終了タグはありません。 属性 効果 補足 width で線の長さ(横の長さ)を指定できます。 属性値には、半角数字と1%から100%までの%で指定することができます。 size 線の太さ(縦の長さ)を指定できます。 属性値には半角数字のみ指定できます。 align 線の位置を指定できます。 属性値には、left(左寄)、center(中央寄)、right(右寄)のどれかを指定できます noshade 線を塗りつぶしにできます。 この属性に、属性値はありません。 !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http //www.w3.org/TR/html4/loose.dtd" html head title /title /head body hr ↑これは普通の線(何も指定なし)です。 hr width="450" ↑width属性を450にしています。 hr width="50%" ↑width属性を50%にしています。 hr size="20" ↑size属性を20にしています。 hr align="left" width="50%" ↑arign属性をleftにしています。 hr noshade ↑noshade属性にしています。 /body /html
https://w.atwiki.jp/opengl/pages/205.html
かなり回りくどいやり方ですが FreeGlut でも MDI を使う事はできます。 resource.h #define IDM_NEW 101 #define IDM_EXIT 102 #define IDM_CLOSE 103 #define IDM_CASCADE 104 #define IDM_TILE 105 #define IDM_CLOSEALL 106 #define IDM_ARRANGE 107 #define ID_STATUS 108 #define IDM_INVISIBLE 109 #define IDM_VISIBLE 110 menu.rc #include resource.h OWNERMENU MENU DISCARDABLE BEGIN POPUP ファイル BEGIN MENUITEM 新規作成 , IDM_NEW MENUITEM 終了 , IDM_EXIT END END DOCUMENT MENU DISCARDABLE BEGIN POPUP ファイル BEGIN MENUITEM 新規作成 , IDM_NEW MENUITEM 閉じる , IDM_CLOSE MENUITEM SEPARATOR MENUITEM 終了 , IDM_EXIT END POPUP ウィンドウ BEGIN MENUITEM クライアント領域を消す IDM_INVISIBLE MENUITEM クライアント領域を表示 IDM_VISIBLE MENUITEM 重ねて表示 , IDM_CASCADE MENUITEM 並べて表示 , IDM_TILE MENUITEM すべて閉じる , IDM_CLOSEALL MENUITEM アイコンの整列 , IDM_ARRANGE END END main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, comctl32.lib ) #include windows.h #include GL/freeglut/freeglut.h #include resource.h #include commctrl.h //CreateStatusWindow()のために必要 //FreeGlutのウインドウプロシージャを置き換える為の変数 WNDPROC WndProc=NULL; //元のウィンドウプロシージャ HWND hWnd2=NULL; //ウィンドウハンドル HMENU hMenu=NULL; //メニュー HWND hStatusbar; // ステータスバーのハンドル HMENU hMenuFirst, hMenuDoc; HMENU hMenuFirstWnd, hMenuDocWnd; HINSTANCE hInst; HWND hClient; int doc_no;//ドキュメントの番号 wchar_t ChildDoc[] = L document ; //ドキュメント bool flag = false; #define IDM_FIRSTCHILD 1000 #define WIDTH 640 #define HEIGHT 480 int width=0,height=0; int pos_x=100,pos_y=100; //回転用 float anglex = 0.0f; //白 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; LRESULT CALLBACK DocProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HWND hClient, hFrame; HWND hEdit; RECT rc; switch (msg) { case WM_CREATE hClient = GetParent(hWnd); hFrame = GetParent(hClient); GetClientRect(hWnd, rc); hEdit = CreateWindow( L EDIT , NULL, WS_VISIBLE | WS_CHILD | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hWnd, NULL, hInst, NULL); return 0; case WM_SIZE GetClientRect(hWnd, rc); hEdit = GetWindow(hWnd, GW_CHILD); MoveWindow(hEdit, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); break; case WM_MDIACTIVATE if (lp == (LPARAM)hWnd) SendMessage(hClient, WM_MDISETMENU, (WPARAM)hMenuDoc, (LPARAM)hMenuDocWnd); if (lp != (LPARAM)hWnd) SendMessage(hClient, WM_MDISETMENU, (WPARAM)hMenuFirst, (LPARAM)hMenuFirstWnd); DrawMenuBar(hFrame); return 0; } return (DefMDIChildProc(hWnd, msg, wp, lp)); } BOOL CALLBACK CloseAllProc(HWND hWnd, LPARAM lp){ SendMessage(GetParent(hWnd), WM_MDIDESTROY, (WPARAM)hWnd, 0); return TRUE; } int MyRegisterWC(WNDPROC lpfnWndProc, LPCWSTR lpszClassName, HBRUSH hbrBack){ WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = lpfnWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; //インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = hbrBack; wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = lpszClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return(RegisterClassEx( wc)); } //置き換えた後のプロシージャ LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ HWND hChild; CLIENTCREATESTRUCT ccs; MDICREATESTRUCT mdic; wchar_t str[64], *str_org = L No.%d ; RECT rc; switch( msg ){ case WM_SIZE width=LOWORD(lParam); height=HIWORD(lParam); GetWindowRect(hStatusbar, rc); height=height-(rc.bottom-rc.top); if(!flag){ ccs.hWindowMenu = hMenuFirstWnd; ccs.idFirstChild = IDM_FIRSTCHILD; hClient = CreateWindow(L MDICLIENT , NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, width, height, hWnd, (HMENU)1, hInst,(LPVOID) ccs); flag=true; } SendMessage( hStatusbar, WM_SIZE, wParam, lParam ); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case WM_COMMAND switch (LOWORD(wParam)){ case IDM_INVISIBLE MoveWindow(hClient,0,0,0,0,1); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_VISIBLE MoveWindow(hClient,0,0,width,height,1); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_NEW doc_no++; wsprintf(str, str_org, doc_no); mdic.szClass = ChildDoc; mdic.szTitle = str; mdic.hOwner = hInst; mdic.x = CW_USEDEFAULT; mdic.y = CW_USEDEFAULT; mdic.cx = 240; mdic.cy = 120; mdic.style = 0; mdic.lParam = 0; MoveWindow(hClient,0,0,width,height,1); hChild = (HWND)SendMessage(hClient, WM_MDICREATE, 0,(LPARAM) mdic); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_CLOSE hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0); if (hChild)SendMessage(hClient, WM_MDIDESTROY, (WPARAM)hChild, 0); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_EXIT SendMessage(hWnd, WM_CLOSE, 0, 0); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_CLOSEALL EnumChildWindows(hClient, CloseAllProc, 0); doc_no=0; return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_TILE MoveWindow(hClient,0,0,width,height,1); SendMessage(hClient, WM_MDITILE, 0, 0); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_CASCADE MoveWindow(hClient,0,0,width,height,1); SendMessage(hClient, WM_MDICASCADE, 0, 0); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); case IDM_ARRANGE SendMessage(hClient, WM_MDIICONARRANGE, 0, 0); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); default hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0); if (IsWindow(hChild))SendMessage(hChild, WM_COMMAND, wParam, lParam); return DefFrameProc(hWnd,hClient,msg,wParam,lParam); } case WM_CLOSE SendMessage(hWnd, WM_COMMAND, IDM_CLOSEALL, 0); if (GetWindow(hClient, GW_CHILD))return 0; PostQuitMessage(0); return 0; case WM_DESTROY PostQuitMessage(0); return 0; default if(WndProc){ return CallWindowProc(WndProc,hWnd , msg , wParam , lParam); }else{ return DefFrameProc(hWnd,hClient,msg,wParam,lParam); } } } //ウィンドウの検索 BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){ HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE); if(GetModuleHandle(NULL)==hModule){ wchar_t ClassName[256]; GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0])); if(wcsncmp(ClassName,L FREEGLUT ,wcslen(ClassName))==0){ hWnd2=hWnd; return FALSE; } } return TRUE; } void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, WIDTH, HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(150.0,150.0,-150.0, 0.0,0.0,0.0, 0.0,1.0,0.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, white); //回転 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転 glutSolidSphere(40.0,16,16); glutSwapBuffers(); } void idle(void){ anglex+=2.0f; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glEnable(GL_DEPTH_TEST); //ワイヤーフレーム glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); } bool main(int argc, char *argv[]){ glutInitWindowPosition(pos_x, pos_y); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( MDI ); //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える EnumWindows(enumWindowsProc,0); hInst = (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE); if(!MyRegisterWC(WndProc2, L test ,(HBRUSH)(COLOR_APPWORKSPACE + 1)))return FALSE; if(!MyRegisterWC(DocProc, ChildDoc, (HBRUSH)GetStockObject(WHITE_BRUSH)))return FALSE; if(hWnd2){ WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC); SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2); }else{ return false; } hMenuFirst = LoadMenu(GetModuleHandle(NULL), L OWNERMENU ); hMenuFirstWnd = GetSubMenu(hMenuFirst, 0); hMenuDoc = LoadMenu(GetModuleHandle(NULL), L DOCUMENT ); hMenuDocWnd = GetSubMenu(hMenuDoc, 1); //メニューを作成 if(hMenuFirst){ SetMenu(hWnd2,hMenuFirst); }else{ return false; } // コモンコントロール関係の初期化 InitCommonControls(); // ステータスバーを作成 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, L メニューの新規作成でウインドウを作成してください。 ,hWnd2,ID_STATUS); MoveWindow(hWnd2,pos_x,pos_y,WIDTH,HEIGHT,1); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return true; }
https://w.atwiki.jp/kidscindy/pages/235.html
シンディモード ツールバーの「軸」をクリックする。作図中でも可能である。 最初の表示より目盛りを小さくすしたければ、アイコンの「縮小」を、大きくしたければ、「拡大」をクリックする。 また、軸上に打った点の座標を指定したいときは、メニューの編集から「スクリプトの編集」を選び、指定すればよい。 KSEGモード シンディモードと同様。
https://w.atwiki.jp/opengl/pages/27.html
ポリゴンを描画すると言っても、実は既に図形描画関連のページや 画像表示関連のページでも使っています。 DirectXとは違い、OpenGLでは三角ポリゴンだけではなく四角ポリゴンも 使用可能です。 三角ポリゴンしか描画できないDirectXでは、3Dモデルファイルなども全て、 四角ポリゴンを三角ポリゴンに分割しなくてはなりませんでした。 すると四角ポリゴンの数だけ変換後のポリゴン数が増えて描画速度に影響します。 当然、ワイヤーフレームで表示したいときも四角ポリゴンが使用できないと 意図する映像が作れなかったりします。 ここだけ見てもOpenGLの方が優れていると言っても過言ではありません。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 float anglex=0.0f; float angley=0.0f; float anglez=0.0f; void DrawTriangle() { glBegin(GL_TRIANGLES); glColor4f(1.0, 0.0, 0.0, 1.0f); glVertex3f(50 , 30, 0); glColor4f(0.0, 1.0, 0.0, 1.0f); glVertex3f(10 , 100, 0); glColor4f(0.0, 0.0, 1.0, 1.0f); glVertex3f(90 , 100, 0); glEnd(); } void DrawQuadrangle() { glBegin(GL_QUADS); glColor4f(1.0, 1.0, 0.0, 1.0f); glVertex3f(100 , 180, 0); glColor4f(1.0, 1.0, 1.0, 1.0f); glVertex3f(200 , 180, 0); glColor4f(0.0, 1.0, 1.0, 1.0f); glVertex3f(200 , 220, 0); glColor4f(0.0, 0.0, 0.0, 1.0f); glVertex3f(100 , 220, 0); glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotated(angley, 0.0, 1.0, 0.0); glRotated(anglex, 1.0, 0.0, 0.0); glRotated(anglez, 0.0, 0.0, 1.0); glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0); DrawTriangle(); DrawQuadrangle(); glutSwapBuffers(); } void idle(void) { angley+=0.05f; anglex+=0.0025f; anglez+=0.03f; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.3, 0.3, 0.3, 1.0); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( 板ポリゴンを表示 ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/opengl/pages/108.html
FreeGlut のウインドウハンドルを取得してウインドウプロシージャを置き換えると win32api のメニューが使えます。 resource.h #define IDR_MENU1 100 #define ID_EXIT 101 #define ID_TEST 102 #define ID_A 103 #define ID_B 104 #define ID_Menu 105 #define ID_Whats 106 #define ID_Help 107 menu.rc #include resource.h IDR_MENU1 MENU BEGIN POPUP File BEGIN MENUITEM Exit , ID_EXIT END POPUP Test BEGIN MENUITEM てすつ , ID_TEST END POPUP Option BEGIN MENUITEM A , ID_A MENUITEM B , ID_B MENUITEM めにゅ~ , ID_Menu MENUITEM whats? , ID_Whats END MENUITEM ヘルプ , ID_Help END main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include resource.h //FreeGlutのウインドウプロシージャを置き換える為の変数 WNDPROC WndProc=NULL; //元のウィンドウプロシージャ HWND hWnd2=NULL; //ウィンドウハンドル HMENU hMenu=NULL; //メニュー //Windowのサイズ int width = 320; int height = 240; //回転用 float anglex = 0.0f; //白 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; //置き換えた後のプロシージャ LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ switch (msg) { case WM_SIZE return 0; case WM_COMMAND switch (LOWORD(wParam)){ case ID_EXIT PostQuitMessage(0); } return 0; case WM_DESTROY exit(0); break; default if(WndProc){ return CallWindowProc(WndProc,hWnd , msg , wParam , lParam); }else{ return DefWindowProc(hWnd,msg,wParam,lParam); } } } //ウィンドウの検索 BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){ HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE); if(GetModuleHandle(NULL)==hModule){ wchar_t ClassName[256]; GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0])); if(wcsncmp(ClassName,L FREEGLUT ,wcslen(ClassName))==0){ hWnd2=hWnd; return FALSE; } } return TRUE; } void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(150.0,150.0,-150.0, 0.0,0.0,0.0, 0.0,1.0,0.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, white); //回転 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転 glutSolidSphere(40.0,16,16); glutSwapBuffers(); } void idle(void){ anglex+=2.0f; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glEnable(GL_DEPTH_TEST); //ワイヤーフレーム glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); } bool main(int argc, char *argv[]){ glutInit( argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(width, height); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( メニュー表示 ); //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える EnumWindows(enumWindowsProc,0); if(hWnd2){ WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC); SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2); }else{ return false; } hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1)); if(hMenu){ SetMenu(hWnd2,hMenu); }else{ return false; } glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return true; }
https://w.atwiki.jp/opengl/pages/67.html
BMP画像を表示します。 BMPと言っても今回は24bit画像に限定します。 知っての通り、最もポピュラーで広く使われている画像形式ですが BMP形式は種類が複数存在し、データサイズも大きいので 最近では、あまり使われなくなってきました。 ファイル main.cpp sample.bmp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 320 #define HEIGHT 240 class BMP { public unsigned long sizeX; //横 unsigned long sizeY; //縦 char *Data; //画像データ格納 bool Load(char *filename); GLuint texture; void TexSet(); BMP(char *FileName); }; BMP BMP(char *FileName){ Load(FileName); TexSet(); } bool BMP Load(char *FileName) { FILE *File; unsigned long size;// イメージのバイトサイズ unsigned long i;// カウンタ unsigned short int planes; //デバイス面数 unsigned short int bpp; // ピクセル数 char temp; // カラー関係作業用 //ファイルオープン if ((File = fopen(FileName, rb ))==NULL){ printf( ファイルがありません ); return false; } //ビットマップの幅データ部分へ移動 fseek(File, 18, SEEK_CUR); //横幅を読み込む if ((i = fread( sizeX, 4, 1, File)) != 1) { printf( 読み込みエラー ); return false; } //縦幅を読み込む if ((i = fread( sizeY, 4, 1, File)) != 1) { printf( 読み込みエラー ); return false; } //画像サイズの計算 size = sizeX * sizeY * 3;//プレーン数を読み込む if ((fread( planes, 2, 1, File)) != 1) { //bmpは「1」になる printf( プレーン数が読み込めません ); return false; } if (planes != 1) { printf( プレーン数が1以外です ); return false; } //ピクセル値を読み込む if ((i = fread( bpp, 2, 1, File)) != 1) { printf( ビット数が読めません ); return false; } if (bpp != 24) {//24bppでなければエラー printf( 24ビット画像ではありません ); return false; } //24ビット飛ばして、カラーデータ(RGB)部分へ fseek(File, 24, SEEK_CUR); //データ読み込み Data = (char *) malloc(size); if (Data == NULL) { printf( メモリが確保できません ); return false; } if ((i = fread(Data, size, 1, File)) != 1) { printf( データが読めません ); return false; } for (i=0;i size;i+=3) { //bgr - rgb temp = Data[i]; Data[i] = Data[i+2]; Data[i+2] = temp; } return true; } void BMP TexSet() { glEnable( GL_TEXTURE_2D ); glGenTextures( 1, texture ); glBindTexture( GL_TEXTURE_2D, texture ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexImage2D( GL_TEXTURE_2D, 0, 3, sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Data ); glBindTexture( GL_TEXTURE_2D, 0 ); } BMP *bmp; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0); glEnable(GL_TEXTURE_2D);//テクスチャ有効 glBindTexture( GL_TEXTURE_2D, bmp- texture ); glEnable(GL_ALPHA_TEST);//アルファテスト開始 glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex2d(10 , 230);//左下 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 10);//左上 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 10);//右上 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 , 230);//右下 glEnd(); glDisable(GL_ALPHA_TEST);//アルファテスト終了 glDisable(GL_TEXTURE_2D);//テクスチャ無効 glutSwapBuffers(); } void idle(void) { glutPostRedisplay(); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); bmp = new BMP( sample.bmp ); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( BMP画像を読み込んで表示 ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/a3mi22/pages/103.html
隠しファイルを表示する 1)エクスプローラの[ツール(T)] → [フォルダオプション(O)] 2)[表示]タブ → 「隠しファイルおよび隠しフォルダを表示しない」のチェックをはずす 合計: -
https://w.atwiki.jp/aspmvc/pages/15.html
文字を表示する
https://w.atwiki.jp/shibacho/pages/31.html
フレームの表示 Frameの表示ですっ!簡単に言えば枠の大きさを設定して画面に表示しているだけです。各行にそれぞれコメントで説明も書いてあるので説明の必要もなぃかと思いますっv補足としてsetSize(320,320)はそれぞれ(横,縦)の大きさの指定になります。setLocationRelativeTo(null)で画面位置を中央に指定する時ゎ、必ずフレームのサイズを設定してからにしてくださぃ。先に中央に位置指定した後でサイズを設定するとフレームの左上が画面の中央に来てしまいますΣ(´▽`ノ)ノ public static void main(String[] args) { FrameTest frame=new FrameTest(); //フレームのタイトルを設定 frame.setTitle("フレームを表示"); //フレームのサイズを設定 frame.setSize(320,320); //フレームの表示位置を画面中央に設定 frame.setLocationRelativeTo(null); //終了ボタンを押したときの動作を設定 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //フレームの表示 frame.setVisible(true); } サンプルのJARファイルはスポンサーリンクの↓に張ってあるので自由にダウンロードしてくださぃ♪