トップページ > 記事閲覧
大きさがない点の集合を3D空間へまとめて描画する方法
名前:ゆーすけ 日時: 2020/08/13 00:49

下記のリンク先のようなイメージの3Dグラフィックス i.imgur.com/kNBqjbo.png(URLが書き込めないので先頭のhttpsを省略しています) をDXライブラリを使用して描画したいと考えています。 (地球の表面に青いグリッドが並んでいて、地表から打ち出された物体の軌跡が黄色で表示されています) 現在、地球モデルや物体の軌跡をMV1DrawModel関数やDrawPrimitive3D関数で3D空間に描画した後、 グリッドを構成する各格子点のうちカメラの位置から見えるものについてワールド座標を ConvWorldPosToScreenPosD関数で2D画面の座標に変換してVERTEX2D型配列に格納し、3Dグラフィックに 上書きする形でDrawPrimitiveIndexed2D関数を用いてグリッドを描画しています。 ただ、この方法だと一応イメージ通りの結果が得られるのですが、一つ問題があります。 視点が地球モデルからあまりにも遠ざかった場合、グリッド同士が重なって地球全体が青く塗り潰されるため、 黄色の軌跡がグリッドに上書きされて見えなくなってしまいます。 DrawPrimitive3D関数で線ではなく点の集合を描画できればこの問題も解決するのではないかと思ったのですが、 DX_PRIMTYPE_POINTLISTを試してみても描画されないようです(DrawPrimitiveで2Dの関数を使っている理由です)。 どうにかして表面のグリッドを軌跡よりも低い表示優先度でまとめて描画する方法はないでしょうか?
メンテ

Page: 1 |

Re: 大きさがない点の集合を3D空間へまとめて描画する方法 ( No.1 )
名前:管理人 日時:2020/08/14 01:31

> DrawPrimitive3D関数で線ではなく点の集合を描画できればこの問題も解決するのではないかと思ったのですが、 > DX_PRIMTYPE_POINTLISTを試してみても描画されないようです(DrawPrimitiveで2Dの関数を使っている理由です)。 DrawPrimitive3D関数で問題なく点の集合を描画できると思いますが…駄目でしたか…? 手元で以下のような DrawPrimitive3D関数で DX_PRIMTYPE_POINTLIST を使用して画面に16個の点を描画する プログラムを組んで実行してみたのですが、問題なく画面に16個の点が描画されました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VERTEX3D Vertex[ 16 ] ; // ウィンドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // ライティングは行わない SetUseLighting( FALSE ) ; // 頂点データをセット for( int i = 0 ; i < 16 ; i ++ ) { Vertex[ i ].pos = VGet( i * 16.0f, i * 16.0f, 0.0f ) ; Vertex[ i ].norm = VGet( 0.0f, 0.0f, -1.0f ) ; Vertex[ i ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ i ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ i ].u = 0.0f ; Vertex[ i ].v = 0.0f ; Vertex[ i ].su = 0.0f ; Vertex[ i ].sv = 0.0f ; } // 点を描画 DrawPrimitive3D( Vertex, 16, DX_PRIMTYPE_POINTLIST, DX_NONE_GRAPH, FALSE ) ; // キー入力待ちをする WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } よろしければこちらのプログラムではゆーすけさんの環境でも正常に点が描画されるかお試しいただけないでしょうか? m(_ _)m ( 正常に動作すれば画面左下から右上に向かって16個の点が描画されます )
メンテ
Re: 大きさがない点の集合を3D空間へまとめて描画する方法 ( No.2 )
名前:ゆーすけ 日時:2020/08/14 07:03

>管理人様 早速の返信ありがとうございます。 貼っていただいたソースと自分のプログラムを見比べたところ、こちらではVERTEX3D型のメンバ変数のうち .pos、.norm、.difの3つしか初期化していなかったので、管理人様のソースの通り初期化してみたところ うまくいきました。 DrawPrimitive3D関数で軌跡を描いた時は上記3つだけ初期化しておけば描画されるので気づきませんでした。 せっかくなので追加で質問させていただきたいのですが、DrawPrimitive3D関数で点の集合を描画する場合、 最低限初期化が必要なメンバ変数はどれになるのでしょうか? リファレンスに載っていない隠し関数なので使い方を完全には理解できていないもので・・・
メンテ
Re: 大きさがない点の集合を3D空間へまとめて描画する方法 ( No.3 )
名前:管理人 日時:2020/08/14 23:46

> せっかくなので追加で質問させていただきたいのですが、DrawPrimitive3D関数で点の集合を描画する場合、 > 最低限初期化が必要なメンバ変数はどれになるのでしょうか? 恐らく .pos、.norm、.dif、.u、.v で大丈夫だと思いますが、 一応全部のメンバ変数を初期化しておいた方が良いと思います 不定な値が入っていると誤動作の原因となる可能性がありますので… (・・;
メンテ
Re: 大きさがない点の集合を3D空間へまとめて描画する方法 ( No.4 )
名前:ゆーすけ(解決) 日時:2020/08/15 11:54

>管理人様 やはり最初上手くいかなかったのは.uと.vが初期化されてなかったからのようですね。 今後は全てのメンバ変数を初期化するようにします。 どうもありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存