トップページ > 記事閲覧
DrawGraph関数系での3次元回転の方法
名前:けいじ 日時: 2018/07/24 20:17

的外れな内容かもしれませんが、ご助力をお願いいたします。 やりたいことは、1枚の魔法陣絵を奥行方向に45度傾けた状態で回転させたい というイメージです。 DrawRoteGraphのような関数で3軸回転はできませんか。引数にangleX,angleY,angleZのような単純な指定だと助かります。 DrawModiGraphで座標を歪ませながらやってもうまくいかず、 DrawPolygon3D等の3D描画関数を使うしかないのかなと思っています。 以上、よろしくお願いいたします。
メンテ

Page: 1 |

Re: DrawGraph関数系での3次元回転の方法 ( No.1 )
名前:kanamaru 日時:2018/07/25 15:57

実行確認してないですが、 int DrawRotaGraph4(int x,int y,double rate,double anglex,double angley,double anglez,int handle,int tranflag,int turnflag) { int sx=0, sy=0; GetGraphSize(handle,&sx,&sy); MATRIX m = MMult(MMult(MGetRotX(anglex),MGetRotY(angley)),MGetRotZ(anglez)); VECTOR v = VTransform(VGet(rate*sx/2,rate*sy/2,0),m); int x2 = x + v.x; int x3 = x - v.x; int y2 = y + v.y; int y3 = y - v.y; if (turnflag == FALSE) { int lux = x3, luy = y3; int ldx = x3, ldy = y2; int rux = x2, ruy = y3; int rdx = x2, rdy = y2; } else { int lux = x2, luy = y3; int ldx = x2, ldy = y2; int rux = x3, ruy = y3; int rdx = x3, rdy = y2; } DrawModiGraph(lux,luy,rux,ruy,rdx,rdy,ldx,ldy,handle,tranflag); } でどうでしょう。anglex,angley,anglezで三軸回転するはず。 DrawRotaGraphを例に挙げていたのでそれと同じような使い方ができるようにしてみました。 とりあえずこの関数使えばできますが、たぶん3D描画関数使った方が動作が軽いような気がします。 もしも動作が正しくなかったらすいません。
メンテ
Re: DrawGraph関数系での3次元回転の方法 ( No.2 )
名前:けいじ 日時:2018/07/27 00:26

アドバイスありがとうございます。 ご提示のコードを一部変更して、目的の動作ができました。 自前のModiGraphがダメだったのは計算間違いと、ご提案のコードはZ軸回転時に不具合がございました。 3D描画関数の方が奥行も出るのでよいのですが、描画画像にLoadDivGraphが使えなくなる等が気になるところです。 あとは、回転順序で関数を分けるなどすれば、簡易的に3軸回転ができそうです。 基本2Dゲームで、一部エフェクト類で奥行方向へも回転させたい時などに、他によい手法があれば教えて頂けると幸いです。 int DrawRotaGraph4(int x, int y, double rate, double anglex, double angley, double anglez, int handle, int tranflag, int turnflag) { int sx = 0, sy = 0; MATRIX m; VECTOR v; GetGraphSize(handle, &sx, &sy); // m = MMult(MMult(MGetRotX(anglex), MGetRotY(angley)), MGetRotZ(anglez)); m = MMult(MGetRotZ(anglez), MGetRotX(anglex)); m.m[0][0] *= rate; m.m[0][1] *= rate; m.m[0][2] *= rate; m.m[1][0] *= rate; m.m[1][1] *= rate; m.m[1][2] *= rate; int lux, luy, rux, ruy, rdx, rdy, ldx, ldy; if (turnflag == FALSE) { v.x = sx / 2; v.y = -sy / 2; v.z = 0.0; v = VTransform(v, m); rux = x + v.x, ruy = y + v.y; ldx = x - v.x, ldy = y - v.y; v.x = -sx / 2; v.y = -sy / 2; v.z = 0.0; v = VTransform(v, m); lux = x + v.x, luy = y + v.y; rdx = x - v.x, rdy = y - v.y; } else { v.x = -sx / 2; v.y = -sy / 2; v.z = 0.0; v = VTransform(v, m); rux = x + v.x, ruy = y + v.y; ldx = x - v.x, ldy = y - v.y; v.x = sx / 2; v.y = -sy / 2; v.z = 0.0; v = VTransform(v, m); lux = x + v.x, luy = y + v.y; rdx = x - v.x, rdy = y - v.y; } DrawModiGraph(lux, luy, rux, ruy, rdx, rdy, ldx, ldy, handle, tranflag); return 1; }
メンテ
Re: DrawGraph関数系での3次元回転の方法 ( No.3 )
名前:8127 日時:2018/07/26 13:09

こんにちは。 >他によい手法があれば教えて頂けると幸いです。 私は、MakeScreen()で描画対象にできるハンドルAを作ってそこに魔法陣を回転して描画し、 ハンドルAを拡大縮小して裏画面に描画する二段構えの方法を取っています。(当然描画負荷は2Dの場合の倍になります) ハンドルAの確保は毎frameではなく初めに一度だけやることに注意してください。
メンテ
Re: DrawGraph関数系での3次元回転の方法 ( No.4 )
名前:けいじ(解決) 日時:2018/07/27 10:10

ありがとうございます。 回転だけ先にやってしまう方法はいいですね。場面でも使えそうです。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存