• 締切済み

描画

DirectXで扇形を描画する質問です。 60度の角度で上方向に扇形を描画さしたいのですが(円弧の方が上) 開始地点は275から半径50の扇形を描画さしたいのですが pD3Device->SetTexture(0, pTexture[0]); pt[0].x = 250.0f; pt[1].x = 300.0f; pt[3].x = 275.0f; pt[2].x = 275.0f; pt[0].y = 225.0f; pt[1].y = 225.0f; pt[2].y = 275.0f; pt[3].y = 275.0f; pt[0].tu = pt[3].tu = 0.0f  / 1024; pt[1].tu = pt[2].tu = 200.0f / 1024; pt[0].tv = pt[1].tv = 0.0f  / 1024; pt[2].tv = pt[3].tv = 200.0f / 1024; pD3Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pt,sizeof(CUSTOMVERTEX)); このままでは、斜面が50の三角形ができただけで・・・ pt[0].xとpt[1].xは、ただ単に50とゆうだけで角度で表していないので場所は変わるかと思いますがpt[2].xとpt[3].xは275から開始でお願いします。 これを扇形にしたいのですが、どなたかご教示ください。お願いします。

みんなの回答

回答No.1

 こんばんは。  私も「Direct3D」は、かじり程度でしか無いのですが、此れだと、二等辺三角形が出来上がるだけだと思います。  0~60度までに対応した、扇形の丸い部分の座標も必要なはずで、pt[n]の配列個数も、此の程度の数では済まないと思います。  pt[0]//点A  pt[1]//点B  pt[n]//点B~点Cを結ぶ円弧の点  //n~mまで沢山ある  pt[m]  pt[m+1]//点C  こんな感じでは無いのでしょうか?

関連するQ&A

  • 描画位置について

    描画を透明化する質問をしたものですが、もう1つ教えていただきたいことがあります。 void Draw(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture) { // クリア g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, g_clrBackgroundColor, 1.0f, 0); // 描画開始 if (FAILED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->Present(NULL, NULL, NULL, NULL); return; } // スプライトを描画 g_pSprite->Begin(D3DXSPRITE_ALPHABLEND); g_pSprite->Draw( g_pTexture->m_pTexture, // LPDIRECT3DTEXTURE9 pTexture NULL, // CONST RECT *pSrcRect &g_vCenter, // CONST D3DXVECTOR3 *pCenter NULL, // CONST D3DXVECTOR3 *pPosition g_pTexture->m_clrAlpha // D3DCOLOR Color ); g_pSprite->SetTransform(&g_mat); g_pSprite->End(); で描画範囲がCONST RECT *pSrcRectで、描画中心がCONST D3DXVECTOR3 *pPosition、描画位置がCONST D3DXVECTOR3 *pPositionのはずなのですが描画範囲も描画中心、描画位置も思い通りいきません。 描画範囲、中心、位置を指定するにはどうすればいいのでしょうか?

  • 描画を透明にする方法

    Directxの質問なのですがある色だけ透明にするにはどうしたらいいのでしょうか? void Draw(ID3DXSprite* g_pSprite,DDXTEX* g_pTexture) { // クリア g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, g_clrBackgroundColor, 1.0f, 0); // 描画開始 if (FAILED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->Present(NULL, NULL, NULL, NULL); return; } // スプライトを描画 g_pSprite->Begin(D3DXSPRITE_ALPHABLEND); g_pSprite->Draw( g_pTexture->m_pTexture, // LPDIRECT3DTEXTURE9 pTexture NULL, // CONST RECT *pSrcRect &g_vCenter, // CONST D3DXVECTOR3 *pCenter NULL, // CONST D3DXVECTOR3 *pPosition g_pTexture->m_clrAlpha // D3DCOLOR Color ); g_pSprite->SetTransform(&g_mat); g_pSprite->End(); // シーン描画の終了とバックバッファからの表示 g_pd3dDevice->EndScene(); g_pd3dDevice->Present(NULL, NULL, NULL, NULL); } g_pTexture->m_clrAlphaで半透明するはずだとは思うのですが。できません。わかる方いらしたらご教授のほどよろしくお願いします。

  • 円弧の描画について

    円弧の描画について お世話になります。 Visio2007を使用しています。 Visioで円を描画し、その円の情報を基に計算を行い、円弧の作成をしたいと考え ていますが、計算方法が分からずご質問させて頂きました。 以下の【元となる情報】から【求める情報】を計算にて求めます。 【元となる情報】 左上X座標:円の左上X座標 左上Y座標:円の左上Y座標 幅:円の幅 高さ:円の高さ 始点角度:円弧の始点の角度(円の中心から右方向を0度とし       時計回りの角度) 終点角度:円弧の終点の角度(始点角度を0度とし時計回りの角度) (始点角度と終点角度は1度単位で設定をします) 【求める情報】 http://msdn.microsoft.com/ja-jp/library/cc344284.aspx 例えば、 ・始点角度が0度、終点角度が90度の時は円の右下1/4の円弧が作成される ・始点角度が90度、終点角度が180度の時は円の左半分の円弧が作成される 以上の様な円弧を求めるような計算方法をご存知でしたらご教授 お願い致します。

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • 矢印を描画

    JAVAで矢印を描画したいのですが、どうしたらいいのかわかりません。 矢印の位置をFOR文でx、yの値を変えながら、いくつもつくりたいのですが・・・。また、角度も変えていきたいのですが・・・。 なにかそのような命令があるのでしょうか?? ないのなら、どう書いたらいいか教えてください。

    • ベストアンサー
    • Java
  • パラメトリック曲線の描画アルゴリズムについて

    x = f(t) y = g(t) のように表せるパラメトリック曲線を2次元のビットマップ画像に描画したいと考えています。 (たとえばNURBS) 描画アルゴリズムですが、tを適当に変化させてx,yの組を得てその点を打つことにより曲線 を書くことはできます。 ただこの場合tの増分の選び方が大きいと穴が開いてしまいますし、小さいと何度も同じx,yを 描画することになってしまい効率が悪いです。 x、yの適切な変化量(たとえばプラスマイナス1)となるtの増分を求められればいいのですが、 具体的なアルゴリズムが思い当たりません。 他の方法でも構いませんが、一般的にパラメトリック曲線を描画する高速なアルゴリズムをご存知 でしたらご教授いただけたらと思います。

  • C#で複数折れ線描画の際の違う色の塗布、各番号表示

    C#で複数折れ線描画の際の違う色の塗布、各番号表示 前に解答下さった方ありがとうございました。 前の折れ線描画ですが分かりづらかったので再度投稿します。 C#で折れ線の描画を行っているのですが 複数の折れ線を描画した際に ・各折れ線ごとに違う色をつける ・各折れ線ごとに番号をつけて表示する ということは可能なのでしょうか? 折れ線を描画する場所はpictureBoxです。 ちなみに任意の何個の折れ線を描くかという折れ線の個数と 1つの折れ線を何個の点で書くかという情報は任意の入力値となります。 そのため折れ線の描画はfor文制御による自動描画となっております。 そのため以下ソースのPens.BlackのBlackを"Red"と指定するということはできません。 ちなみに下記の kosu_iが何個の折れ線を描画したいか sampTが1つの折れ線を何個の点で描画したいか を表わしていて、 sampT=zigen_i/2となっております。 zigen_iも任意の入力値です。 途中、y座標を数学座標への変換も行っています。 data_dからの折れ線描画イメージとしては kosu_i =1, zigen_1=10 data_d[1, 10] = 0 1 2 3 4 5 6 7 8 9 の場合、 折れ線1を(0,1)(2.3)(4,5)(6,7)(8,9) として5(10/2=5)点で描きますということです。 このようにして任意の個数分だけ折れ線を描画するのですが 「この際に違う色をつける、折れ線ごとに番号をつける」 にはどうすればいいのか知りたいのです。 宜しくお願いいします。 以下ソース private void pictureBox1_Click(object sender, EventArgs e) { Point[] pt = new Point[100]; // 座標を格納する変数 double[,] data_d_axi = new double[100, 100]; int sampT; int x_axi = 0; int y_axi = 1; //描画準備 pictureBox1.Refresh(); // 念の為、描画した点を消去する //Graphicsオブジェクトの作成 Graphics g = pictureBox1.CreateGraphics(); //描画**データ毎に違う色を;; sampT = zigen_i / 2; Point[] po = new Point[sampT]; //x,yは整数 for (int i = 0; i < kosu_i; i++) { for (int j = 0; j < sampT; j++) { //y座標を数学座標系に変換 data_d_axi[i, y_axi] = pictureBox1.Height - data_d[i, y_axi]; pt[j].X = (int)data_d[i, x_axi]; pt[j].Y = (int)data_d_axi[i, y_axi]; po[j] = new Point(pt[j].X, pt[j].Y); x_axi = x_axi + 2; y_axi = y_axi + 2; } g.DrawLines(Pens.Black, po); x_axi = 0; y_axi = 1; } //brs.Dispose(); //brushオブジェクトの解放 //リソースを開放する g.Dispose(); }

  • テクスチャに半透明ポリゴンを描画すると透ける??

    DirectX9で不透明なテクスチャに半透明ポリゴンを描画すると、ポリゴンを描画した部分が透けてしまうのはなぜですか? 1.「D3DUSAGE_RENDERTARGET」指定したテクスチャを作成して白でクリア 2.そのテクスチャに半透明の青いポリゴンをDrawPrimitiveUPで描画 3.そのテクスチャをD3DXSaveTextureToFileでPNG等で保存 とした場合、私のイメージでは白地に薄い青の四角が描かれた不透明な画像ファイルができると思ったんですが、青の部分が半透明になりました。 なぜ不透明なテクスチャに半透明ポリゴンを描くと半透明になるのでしょうか・・・? ―――――――――――――――――――――――――――――――――――― //レンダリング用テクスチャの準備 { global.pDevice->CreateTexture( 512, 512, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTarget, NULL); pTarget->GetSurfaceLevel(0, &pSurface); global.pDevice->GetRenderTarget(0, &pBackBuffer); //バックバッファの取得 global.pDevice->SetRenderTarget(0, pSurface); //ターゲットの切り替え //白(不透明)にクリア global.pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0 ); } //テクスチャに半透明ポリゴンを描画 { VERTEX point[4] ={ D3DXVECTOR3(100, 200, 1), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(100, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 200, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255) }; global.pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); global.pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, point, sizeof(VERTEX)); global.pDevice->SetRenderTarget(0, pBackBuffer); //レンダリングターゲット戻す } //テクスチャを保存 { D3DXSaveTextureToFile("d:\\hoge.png", D3DXIFF_PNG, pTarget, NULL); } ―――――――――――――――――――――――――――――――― D3DTSS_ALPHAOPをADDにしてみたりしたのですが、変化がありません。 テクスチャが透ける理屈と、こうならないようにする手段(アルファ値は加算したい)を教えてもらえると助かります。

  • C# マップエディタの描画方法

    現在マップエディターを作ろうとして 色々試しているのですが かなり迷走してきたので質問させてください 現在RPGツクールなどでよく見られる マップチップの配置をするところの描画で悩んでいるのですが private void Picture_Main_Paint(object sender, PaintEventArgs e) { float fSize = 1.0f; //float fSize = 0.5f; //float fSize = 0.25f; e.Graphics.ScaleTransform(fSize, fSize); for (int z = 0; z < 4; z++) {   for (int j = 0; j < 100; j++) // ループ回数は適当です   {     for (int i = 0; i < 100; i++)     {       int X = (int)(32 * fSize) * i;       int Y = (int)(32 * fSize) * j;       e.Graphics.DrawImage(bitmapBase[0, 0], new Point(X, Y));     }   } } } といったようにしているのですが 等倍ならまだしも縮小したときは画面分のループを行うので 処理が重すぎて使い物になりません。 マップエディタのような描画で なにかヒントになるようなものがあれば何でもいいので 教えていただけないでしょうか よろしくお願いします。

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

専門家に質問してみよう