デベロップ掲示板
このフォームからは投稿できません。
name
e-mail
url
subject
comment

HOME HELP 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

ツリー一括表示

Nomal 2D座標から3D座標への変換 他 /さとしん (08/03/11(Tue) 23:16) #474
Nomal Re[1]: 2D座標から3D座標への変換 他 /オノデラ (08/03/11(Tue) 23:46) #475
│└Nomal Re[2]: 2D座標から3D座標への変換 他 /オノデラ (08/03/11(Tue) 23:48) #476
│  └Nomal Re[3]: 2D座標から3D座標への変換 他 /さとしん (08/03/21(Fri) 13:21) #480
│    └Nomal Re[4]: 2D座標から3D座標への変換 他 /オノデラ (08/03/23(Sun) 09:51) #481
│      └Nomal Re[5]: 2D座標から3D座標への変換 他 /さとしん (08/03/25(Tue) 11:51) #482
│        └Nomal Re[6]: 2D座標から3D座標への変換 他 /オノデラ (08/03/25(Tue) 12:33) #483
│          └Nomal Re[7]: 2D座標から3D座標への変換 他 /さとしん (08/03/25(Tue) 14:30) #484
│            └Nomal Re[8]: 2D座標から3D座標への変換 他 /オノデラ (08/03/25(Tue) 23:52) #485
│              └Nomal Re[9]: 2D座標から3D座標への変換 他 /さとしん (08/03/27(Thu) 08:01) #486
│                └Nomal Re[10]: 2D座標から3D座標への変換 他 /オノデラ (08/03/28(Fri) 09:50) #487
Nomal 最新入荷のカナダグース ダウン /カナダグース メンズ 激安通販 (16/09/13(Tue) 11:25) #578
Nomal Re[1]: 2D座標から3D座標への変換 他 /オメガスーパーコピー (16/09/26(Mon) 18:25) #579


親記事 / ▼[ 475 ] ▼[ 578 ] ▼[ 579 ]
■474 / 親階層)  2D座標から3D座標への変換 他
□投稿者/ さとしん Lv 1(5回)-(2008/03/11(Tue) 23:16:52)
    以前3D座標から2D座標への変換の質問をしていましたが、逆の質問です。
    質問1 スクリーン上のマウス座標(2D座標)から3D座標へ変換する方法
    質問2 質問1ができたとして、3D空間内にいくつかの球体がある場合、球体のどの部分でもマウスを置いた場合に、球体を認識(識別)する方法。(つまり球体の中心以外でも球体を認識できるようにしたい)

    質問1については、前にオノデラさんから教えてもらった方法の逆を考えて・・・
    Vector2クラスのTransformCoordinateを使用するのでしょうか?

    質問2については、すみません全く方法が思いつきません。

    ご存知の方ご指導よろしくお願いします。。
[ □ Tree ] 返信 削除キー/

▲[ 474 ] / ▼[ 476 ]
■475 / 1階層)  Re[1]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(221回)-(2008/03/11(Tue) 23:46:59)
http://sorceryforce.com/
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 475 ] / ▼[ 480 ]
■476 / 2階層)  Re[2]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(222回)-(2008/03/11(Tue) 23:48:50)
http://sorceryforce.com/
     すみません、直接リンクができないようなので、BBX(http://bbx.hp.infoseek.co.jp/index.html)のページに移動して、検索に「クライアント領域をクリックしてメッシュを選択する」を入力して検索してみてください。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 476 ] / ▼[ 481 ]
■480 / 3階層)  Re[3]: 2D座標から3D座標への変換 他
□投稿者/ さとしん Lv 1(6回)-(2008/03/21(Fri) 13:21:10)
    オノデラさま

     いろいろ試してみたのですが、うまくいきませんでした。
     3D座標から2D座標変換の場合は、モデルの位置を射影変換して、スクリーン座標に投影しました。

    Vector3 transformed = Vector3.TransformCoordinate(Pos, device.Transform.View * device.Transform.Projection);
    Vector2 screenPos = new Vector2((transformed.X +1) / 2* ScreenWidth, (-transformed.Y + 1) / 2 + ScreenHeight);

     オノデラさんの紹介したHPでは、その逆処理をすればいいと書いていたのですが、Vector2からVector3の処理方法がわかりませんでした。都合のいいときで結構ですので、教えていただけないでしょうか? よろしくお願いします。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 480 ] / ▼[ 482 ]
■481 / 4階層)  Re[4]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(224回)-(2008/03/23(Sun) 09:51:34)
http://sorceryforce.com/
    2008/03/23(Sun) 09:52:37 編集(管理者)

    # すみませんちょっと時間がないので簡単に

     前に示したリンク先をそのまま引用すると

    > 以下のコードで2D->3Dへ変換できます

    > D3DXVECTOR3 p1(マウスの位置X, マウスの位置Y, 0);
    > D3DXVECTOR3 p2(マウスの位置X, マウスの位置Y, 1);
    > D3DVIEWPORT9 vp;
    > m_pd3dDevice->GetViewport(&vp);
    > D3DXMATRIX mat;
    > D3DXMatrixIdentity(&mat);
    > D3DXMATRIX matProj = カメラの射影行列;
    > D3DXMATRIX matView = カメラのビュー行列;
    > D3DXVec3Unproject(&p1, &p1, &vp, &matProj, &matView, &mat);
    > D3DXVec3Unproject(&p2, &p2, &vp, &matProj, &matView, &mat);

     C++ で書かれたコードなのですが、これを Managed DirectX に置き換えるといいと思います。クラス名や関数名を見れば Managed DirectX のどれに対応しているかが大体わかると思います。

     あらかじめ理解していただきたいのは 3D 空間の点から 2D スクリーンの点は求まりますが、 2D スクリーンの点から 3D 空間の「点」はどうやっても求まらないところに注意してください。ただし、3D 空間の「線」は求まります。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 481 ] / ▼[ 483 ]
■482 / 5階層)  Re[5]: 2D座標から3D座標への変換 他
□投稿者/ さとしん Lv 1(7回)-(2008/03/25(Tue) 11:51:15)
    先に示されました、C++のコードを自分なりにC#にしてみました。

    > > D3DXVECTOR3 p1(マウスの位置X, マウスの位置Y, 0);
    > > D3DXVECTOR3 p2(マウスの位置X, マウスの位置Y, 1);
    > > D3DVIEWPORT9 vp;
    > > m_pd3dDevice->GetViewport(&vp);
    > > D3DXMATRIX mat;
    > > D3DXMatrixIdentity(&mat);
    > > D3DXMATRIX matProj = カメラの射影行列;
    > > D3DXMATRIX matView = カメラのビュー行列;
    > > D3DXVec3Unproject(&p1, &p1, &vp, &matProj, &matView, &mat);
    > > D3DXVec3Unproject(&p2, &p2, &vp, &matProj, &matView, &mat);

    Vector3 p1 = new Vector3(Convert.ToSingle(e.X), Convert.ToSingle(e.Y), 0.0f);
    Vector3 p2 = new Vector3(Convert.ToSingle(e.X), Convert.ToSingle(e.Y), 1.0f);
    Viewport vp = new Viewport();
    //m_pd3dDevice->GetViewport(&vp);に対応するC#コードがわからない!!
    Matrix mat = Matrix.Identity;
    Matrix matProj = device.Transform.Projection;
    Matrix matView = device.Transform.View;
    Vector3 vNear = Vector3.Unproject(p1, vp, matProj, matView, mat);
    Vector3 vFar = Vector3.Unproject(p2, vp, matProj, matView, mat);

    1行だけC++のコードがわからないのですが、他はいいのでしょうか?
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 482 ] / ▼[ 484 ]
■483 / 6階層)  Re[6]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(225回)-(2008/03/25(Tue) 12:33:44)
http://sorceryforce.com/
    > Viewport vp = new Viewport();
    > //m_pd3dDevice->GetViewport(&vp);に対応するC#コードがわからない!!

     ここはデバイスに設定されている Viewport を取得しているところなので

    Viewport vp = this.device.Viewport;

    でいいと思います。

     後は算出された vNear, vFar を使うことによってマウスポインタが指す方向(3Dベクトル)が求められると思います。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 483 ] / ▼[ 485 ]
■484 / 7階層)  Re[7]: 2D座標から3D座標への変換 他
□投稿者/ さとしん Lv 1(8回)-(2008/03/25(Tue) 14:30:27)
    とりあえず動きました。

    //マウスポインタ座標
    Vector3 p1 = new Vector3(Convert.ToSingle(e.X), Convert.ToSingle(e.Y), 0.0f);
    Vector3 p2 = new Vector3(Convert.ToSingle(e.X), Convert.ToSingle(e.Y), 1.0f);
    Viewport vp = this.device.Viewport;
    Matrix mat = Matrix.Identity;
    Matrix matProj = device.Transform.Projection;
    Matrix matView = device.Transform.View;
    Vector3 vNear = Vector3.Unproject(p1, vp, matProj, matView, mat);
    Vector3 vFar = Vector3.Unproject(p2, vp, matProj, matView, mat);
    Vector3 vDir = Vector3.Normalize(vFar - vNear);
    //結果表示(デバッグウィンドウ)
    Debug.WriteLine(String.Format("X: {0, 5} Y: {1, 5}", e.X.ToString(), e.Y.ToString()));
    Debug.WriteLine(String.Format("Near: X{0, 5} Y{1, 5} Z{2, 5}\r\nFar: X{3, 5} Y{4, 5} Z{5, 5}\r\nDir: X{6, 5} Y{7, 5} Z{8, 5}\r\n",
    vNear.X.ToString(), vNear.Y.ToString(), vNear.Z.ToString(),
    vFar.X.ToString(), vFar.Y.ToString(), vFar.Z.ToString(),
    vDir.X.ToString(), vDir.Y.ToString(), vDir.Z.ToString()));

    ・・・で、動かしてみたのですが。マウスを動かしてもvNearの値が変わらないので、何か変だなという印象です。vFarについても値は出るのですが、いいか悪いか判断できません。

     とりあえずこのようなソースで問題ないのでしょうか?
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 484 ] / ▼[ 486 ]
■485 / 8階層)  Re[8]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(226回)-(2008/03/25(Tue) 23:52:51)
http://sorceryforce.com/
     はい、問題ありません。

     vNear と vFar についてですが、プロジェクション変換に使用するカメラ距離範囲の Near と Far をイメージしてもらえばいいと思います。

     2Dのスクリーンでマウスをクリックしても3D空間での方向は定まりますが、奥行きを認識できないので、カメラの前後視野範囲で最も近い点である nNear と最も遠い点である vFar を算出しています。この2つの点を結ぶことで線分を算出することができます。

     前にも書きましたが、2Dから3Dに変換した場合、点を求めることができないけど、線は求めることができるというのはこのことです。マウスクリックでは奥行きを決められませんからね。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 485 ] / ▼[ 487 ]
■486 / 9階層)  Re[9]: 2D座標から3D座標への変換 他
□投稿者/ さとしん Lv 1(9回)-(2008/03/27(Thu) 08:01:12)
    なるほど、いろいろ難しいということがわかってきました。
    (質問1)
    vNearの値は視点の位置(カメラの位置)ということでしょうか? またvFarはNaN (非数値)となり、vDirが求められない場合があります。

    実際私のソフトは、絶えずカメラが視点移動しているので、どのようなケースでvFarが求められないか、よくわかっていません。

    (質問2)
    空間上の球体とマウスによって生成されたラインとの交差判定はどのようにするのでしょうか?

    いろいろ聞いてすみませんが、よろしくお願いします。。。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 486 ] / 返信無し
■487 / 10階層)  Re[10]: 2D座標から3D座標への変換 他
□投稿者/ オノデラ Lv20(227回)-(2008/03/28(Fri) 09:50:32)
http://sorceryforce.com/
    > vNearの値は視点の位置(カメラの位置)ということでしょうか?

     vNear はカメラの位置ではなく、カメラの位置からプロジェクト変換(Matrix.PerspectiveFovLH)で指定した znearPlane 分進めた位置になります。

    > またvFarはNaN (非数値)となり、vDirが求められない場合があります。

     変換に使用した各々のパラメータがどんな状態になったときに NaN になるのでしょうか?

    > 実際私のソフトは、絶えずカメラが視点移動しているので、どのようなケースでvFarが求められないか、よくわかっていません。

     プログラムとは関係なしに、この話は前にリンクした BBX などいろいろなサイトで話題になっているのでそれぞれのパラメータがどんな意味を持っているのか調べてみるといいでしょう。


    > (質問2)
    > 空間上の球体とマウスによって生成されたラインとの交差判定はどのようにするのでしょうか?

     Mesh.Intersect メソッドあたりを調べてみるといいでしょう・
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 474 ] / 返信無し
■578 / 1階層)  最新入荷のカナダグース ダウン
□投稿者/ カナダグース メンズ 激安通販 Lv 1(1回)-(2016/09/13(Tue) 11:25:19)
    デザインはシンプルで着回しやすく、冬のデイリーに活躍するブランド コピー 安心ダウン?ジャケット。 ダウン量が豊富で高い保温性を誇ります。カナダグース コピーhttp://www.kcfx.net/brand-149-c0.html取り外しが可能で、スタイルに合わせて使い回しが出来ます。ハリ感と無骨な風合いが特徴です。
[ 親 474 / □ Tree ] 返信 削除キー/

▲[ 474 ] / 返信無し
■579 / 1階層)  Re[1]: 2D座標から3D座標への変換 他
□投稿者/ オメガスーパーコピー Lv 1(1回)-(2016/09/26(Mon) 18:25:56)
http://www.relievedshop777.com/hkbrand/brand_45_1.html
    スーパーコピーブランド
    100%実物写真ですし、
    品質が完璧です。安全税関対策
    スーパーコピー販売業界最低価格に挑戦!
    http://www.relievedshop777.com/ スーパーコピー時計
    www.relievedshop777.com/hkbrand/brand_1_1.html ロレックススーパーコピー
    www.relievedshop777.com/hkbrand/brand_16_1.html パネライスーパーコピー
    www.relievedshop777.com/hkbrand/brand_24_1.html ウブロスーパーコピー
    www.relievedshop777.com/hkbrand/brand_30_1.html ブライトリングスーパーコピー

[ 親 474 / □ Tree ] 返信 削除キー/


Mode/  Pass/

HOME HELP 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -