Re: 地球を作りたいのですが・・・ ( No.1 ) |
- 名前:管理人 日時:2014/11/28 00:32
> 1つめ
> DrawSphere3D関数で3D空間に描画した球体の表面に
> テクスチャを貼り付けて地球を作りたいのですが、
> 任意の画像を貼り付けるためにどうすればいいのかが
> 全くわからず困っています。
すみません、DrawSphere3D 関数で描画する球にテクスチャを貼ることはできませんので
テクスチャを貼った球体の3Dモデルファイルをモデリングソフトを使用して作成して、
その3Dモデルファイルを MV1LoadModel で読み込んで使用してください
> 2つめ
> ウインドウモードで表示する際、表示ウインドウの初期位置を
> 任意に指定することはできるのでしょうか?
関数リファレンスには載っていませんが SetWindowPosition という関数を DxLib_Init を
呼ぶ前に実行すれば初期位置を変更することが出来ます
// メインウインドウの位置を設定する( 枠も含めた左上座標 )
int SetWindowPosition( int x, int y ) ;
よろしければお使いください
|
Re: 地球を作りたいのですが・・・ ( No.2 ) |
- 名前:ゆーすけ 日時:2014/11/28 01:48
管理人様
返信ありがとうございます。2つとも了解しました。
地球の作成については適当なモデリングソフトを使って試してみたいと思います。
SetWindowPosition関数についても教えていただきありがとうございました。
ついでと言ってはなんですが、もう2点ほど質問させていただきたいと思います。
1つ目として、非常に広大なクリップ空間を実装することは可能なのでしょうか?
カメラから注視点までの距離を1メートル以下〜数万キロのレベルで変化させるようにしたいので
クリップ空間のスケールをそのくらいのレベルで取りたいのですが、
そのままSetCameraNearFar関数でクリップ面の距離を指定すると
Zバッファの精度が足りず表示がめちゃくちゃになってしまいます。
何か上手く実装することでこれをクリアする方法があるのか、
それとも近距離もしくは遠距離については描画を諦める等の妥協が必要になるのか
よろしければ教えていただけると幸いです。
2点目として、指定した3D空間の座標上に常に一定の大きさに見える球を
描画する方法はありますでしょうか?
普通にDrawSphere3Dで球を配置した場合、カメラから注視点までの距離により
球の大きさが変化しますが、これが距離によって変わることがなく
同じ大きさに見えるようにしたいのです。
もしそのようなことが可能であれば方法を教えていただきたいと思います。
どうぞよろしくお願いします。
|
Re: 地球を作りたいのですが・・・ ( No.3 ) |
- 名前:ゆーすけ 日時:2014/11/28 01:58
申し訳ありません。もう1点忘れていましたので追加質問させてください。
最初に書いたWindowsフォームとDXライブラリのウインドウモードの併用についてですが、
3D描画処理を終わった後でDXライブラリのウインドウだけを閉じてWindowsフォームに戻り、
その後別のウインドウを開いて別の3D描画を行わせるといったことは可能でしょうか?
ウインドウを閉じた後はDxLib_End関数で終了処理を行うと認識しているのですが、
DxLib_Endの実行後は速やかにプログラム自体を終了させなければならないですよね?
そうすると私が考えているような
Windowsフォームからウインドウを呼び出して描画
↓
ウインドウだけを閉じてフォームに戻る
↓
フォームから再度ウインドウを呼び出して別の画像を描画
↓
ウインドウだけを閉じて再度フォームに戻る
といった流れは無理なのかなと思うのですが実際のところはどうなのでしょうか?
重ね重ね申し訳ないですがご教示よろしくお願いします。
|
Re: 地球を作りたいのですが・・・ ( No.4 ) |
- 名前:管理人 日時:2014/11/29 14:20
> 3D描画処理を終わった後でDXライブラリのウインドウだけを閉じてWindowsフォームに戻り、
> その後別のウインドウを開いて別の3D描画を行わせるといったことは可能でしょうか?
はい、可能です
DxLib_End を呼んだ後はプログラムを終了する、というのが私の想定している使い方ですが、
一応その後、再度 DxLib_Init を呼んでも問題なく動作します
( あまり確認はしていないので、正しくは「問題なく動作するようです」ですが・・・ )
ただ、最初の DxLib_End を呼ぶ前に
SetDxLibEndPostQuitMessageFlag( FALSE ) ;
を実行して、OSに「プログラムを終了する」というメッセージを送らないようにしてください
|
Re: 地球を作りたいのですが・・・ ( No.5 ) |
- 名前:管理人 日時:2014/11/29 18:52
すみません、最初の二つの質問にお答えしていませんでした
> 1つ目として、非常に広大なクリップ空間を実装することは可能なのでしょうか?
> カメラから注視点までの距離を1メートル以下〜数万キロのレベルで変化させるようにしたいので
> クリップ空間のスケールをそのくらいのレベルで取りたいのですが、
> そのままSetCameraNearFar関数でクリップ面の距離を指定すると
> Zバッファの精度が足りず表示がめちゃくちゃになってしまいます。
SetCameraNearFar 関数の引数は、Near の値が特に重要です
この値を表現で不都合の無い範囲でなるべく大きな値にしてみてください
それでも精度が足りない場合は、DxLib_Init の前に
SetZBufferBitDepth( 24 ) ;
という記述を増やしてみてください、描画負荷は上がりますが、Zバッファの精度が上がります
> 2点目として、指定した3D空間の座標上に常に一定の大きさに見える球を
> 描画する方法はありますでしょうか?
専用の機能はありませんが、工夫すると現状の機能でも実現できそうです・・・
関数リファレンスにはありませんが、指定の座標で指定の大きさの物体がスクリーン上で何ピクセルになるかを
取得するための関数 GetBillboardPixelSize があります
// ワールド空間上のビルボードのサイズからスクリーンに投影した場合のピクセル単位のサイズを取得する
float GetBillboardPixelSize( VECTOR WorldPos, float WorldSize ) ;
この関数を使用して、
WorldPos に指定の座標を、WorldSize に適当な値を渡して GetBillboardPixelSize を呼ぶ
↓
戻り値( ピクセルサイズ )が希望の値ではなかったら、WorldSize の値を変更して再度 GetBillboardPixelSize を呼ぶ
↓
これを戻り値が希望の値になるまで while などを使用して繰り返す
という方法で導き出した WorldSize の値を元に球モデルに対して MV1SetScale で拡大率を設定すれば
何処から見ても一定の大きさに見える球が実現できます
|
Re: 地球を作りたいのですが・・・ ( No.6 ) |
- 名前:ゆーすけ 日時:2014/11/29 21:48
管理人様
回答ありがとうございます。おかげで少しずつ最終目標のプログラムに向けて
必要な機能が使えるようになってきました。
クリップ空間のサイズについてはSetZBufferBitDepth(24)は試してみたのですが、
確かに精度は大きく改善されたものの私のやろうとしている実装には
それでも精度が足りないようです。
ですのでとりあえずクリップ空間のサイズについては現状では24bitで
確保できるだけ確保するという形で妥協しようと思います。
GetBillBoardPixelSizeについても教えていただきありがとうございます。
球についてはこの関数をうまく使えば実装できそうですね。
DxLib_End後のDxLib_Init再実行も問題なさそうなので助かりました。
長くなって申し訳ないですが新規スレッドも立てづらいので
こちらで追加の質問をさせていただきます。
いろいろ教えていただいたおかげで簡単な地球儀的なテストプログラムができたのですが、
今のところ実行ファイルと同じフォルダにモデルファイルとテクスチャ用の
画像ファイルを別途置かないとちゃんと表示されない状態になっています。
何とかこの2つのファイルを実行ファイル内にまとめられないかと
思っているのですが、ネット上の情報を当たってみてもDXライブラリ使用時に
どのように適用していいのか分からず困っています。
環境は最初に書いたとおりで、C#用の.NETライブラリを使って
VB2010(Pro版)で作っています。
2つめ、指定したワールド座標の点がポリゴン等の影に隠れているかどうかを
判定することはできるのでしょうか?
指定したワールド座標上に2Dの×印を描きたいのですが、
描画そのものはConvWorldPosToScreenPos関数を使うことで可能ですが、
この方法ですと指定した点が他の物体等の影に隠れてカメラから見えない場合でも
×印が描画されてしまいます。
単純にカメラの視界に入っているか否かはCheckCameraViewClip関数で
判定できるようですが、さすがに他のポリゴン等の陰になっているかどうかまでは
この関数では判断できないようです。
解決方法がありましたらご教示お願いします。
3つ目、DrawLineやDrawLine3Dで引く線分の太さや書式(実線or点線)は
変えられないのでしょうか?
だらだらとまとまりのない質問で申し訳ありませんが
どうぞよろしくお願いします。
|
Re: 地球を作りたいのですが・・・ ( No.7 ) |
- 名前:管理人 日時:2014/11/30 13:52
> クリップ空間のサイズについてはSetZBufferBitDepth(24)は試してみたのですが、
> 確かに精度は大きく改善されたものの私のやろうとしている実装には
> それでも精度が足りないようです。
> ですのでとりあえずクリップ空間のサイズについては現状では24bitで
> 確保できるだけ確保するという形で妥協しようと思います。
SetZBufferBitDepth( 24 ) でも駄目でしたか・・・
GPUの性能が十分で、且つ継ぎ目の部分に目を瞑れば何回かの描画に分けることで
更に精度を上げることができます
1.MakeScreen で画面サイズと同じサイズのサブ画面をアルファチャンネルつきで作成
2.SetDrawScreen で 1 で作成したサブ画面を描画対象に
3.ClearDrawScreen で 1 で作成したサブ画面をクリア
4.SetCameraNearFar で一番奥側の領域を設定
5.3D空間のものを描画
6.SetDrawScreen で裏画面を描画対象に
7.1で作成した画像を裏画面に透過処理つきで描画
8.2に戻る、この際 4 の SetCameraNearFar の領域は一つ手前の領域になる
9.全ての領域の描画が完了したら終了
SetCameraNearFar で分ける領域の数だけ3Dの描画を繰り返すので
処理負荷は増大しますが、こんな方法もあるにはあるということで・・・
> 今のところ実行ファイルと同じフォルダにモデルファイルとテクスチャ用の
> 画像ファイルを別途置かないとちゃんと表示されない状態になっています。
> 何とかこの2つのファイルを実行ファイル内にまとめられないかと
> 思っているのですが、ネット上の情報を当たってみてもDXライブラリ使用時に
> どのように適用していいのか分からず困っています。
.NETのアプリで実行ファイルに画像ファイルなどを埋め込む方法はちょっと分かりません
実行ファイルのあるフォルダに新たにフォルダを作って、その中に画像ファイルや
モデルファイルを入れるのでは駄目でしょうか?
> 2つめ、指定したワールド座標の点がポリゴン等の影に隠れているかどうかを
> 判定することはできるのでしょうか?
できます
まずワールド座標をスクリーン座標に変換します
VECTOR ScreenPos ;
ScreenPos = ConvWorldPosToScreenPos( WorldPos ) ;
そしてそのスクリーンの座標のスクリーン面でのワールド座標を取得します
VECTOR WorldPosNear ;
WorldPosNear = ConvScreenPosToWorldPos( VGet( ScreenPos.x, ScreenPos.y, 0.0f ) ) ;
上記の WorldPosNear と WorldPos の2座標を使った線分とワールド空間上のモデル全てと
MV1CollCheck_Line で当たり判定を行い、どのモデルとも当たっていなければ
「ポリゴン等に隠れていない」と判断することができます
> 3つ目、DrawLineやDrawLine3Dで引く線分の太さや書式(実線or点線)は
> 変えられないのでしょうか?
線分の書式を変更することはできません
DrawLine はリファレンスには載っていない第 6 引数で線分の太さを指定することができます
// 太さ4ピクセルの線を描画する
DrawLine( 0, 0, 100, 100, GetColor( 255,255,255 ), 4 ) ;
DrawLine3D には線分の太さを変更することはできません
|
Re: 地球を作りたいのですが・・・ ( No.8 ) |
- 名前:ゆーすけ 日時:2014/12/01 07:39
ありがとうございます。
DXライブラリについては使い始めたばかりでまだ慣れていないので、
MakeScreenを使う方法については後で試してみたいと思います。
2つ目の質問についても回答ありがとうございます。
教えていただいたやり方を実装したらうまくいきました。
3D空間上の線分の書式設定については仕様のようなので
諦めるほかないようですね。
またMakeScreenを使う方法の実装で疑問点等出てきましたら
新規にスレッドを立てて質問させていただきます。
長々とありがとうございました。
|