龍神録「3D背景を作ってみよう」

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
non

龍神録「3D背景を作ってみよう」

#1

投稿記事 by non » 15年前

3Dについて勉強中です。
DirectX9かOpenGLか、何がいいのかと調べていたら、龍神録にUPされているではありませんか。
おお、DxLibでも使えるのね・・・ってことで、さっそく試してみました。
UPされたのは新しいのに、DxLibのバージョンは古いのねと思いながら・・・・
これから、勉強する人のためには、やっぱり新しいバージョンの方がよろしいかと思い
チェックしてみました。

>DXライブラリは2D専用ライブラリです。
>しかし、1つだけ3Dが利用出来る関数があります。

いまは、使用できる3D関数が増えたのでは?

>DrawPolygon3Dという関数です。(関数の仕様について、出来るだけまずはリンクから本家リファレンスをご覧下さい)

リンクが違っています。

>2,4,8,16,32,64,256,512...そういうサイズの画像しか扱えません

画像は8ピクセル以上ですので、2,4は使えません。

>VERTEX_3D
これは、旧バージョンで、最新バージョンではVERTEX3Dです。

ついでにプログラムも変えました。
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
    int GrHandle ;
    float Z, ZAdd ; 
    VERTEX3D Vertex[6] ;    // ポリゴン2枚なので、頂点は6個
    
    ChangeWindowMode(TRUE);

    // DXライブラリ初期化処理
    if( DxLib_Init() == -1 )    
         return -1 ;    // エラーが起きたら直ちに終了

    // 描画先を裏画面にする
    SetDrawScreen( DX_SCREEN_BACK ) ;

    // テクスチャの読み込み
    GrHandle = LoadGraph( "mydat/img/kabe.png" ) ; 

    // Z値の初期化
    Z = 0.0F ;

    // Z値の加算値を初期化(最初は近づける)
    ZAdd = -1.0F ;

    // 何かキーが押されるまでループ
    while( CheckHitKeyAll() == 0 )
    {
        // メッセージ処理
        if( ProcessMessage() != 0 ) break ;

        // 画面の初期化
        ClearDrawScreen() ;

        // Z値の処理
        Z += ZAdd ;

        // 一定のラインを越えていたら進行方向を反転する
        if( Z < -300.0F || Z > 300.0F ) ZAdd = -ZAdd ;

        // 頂点情報のセット
        {
            // 画面の中央に幅・高さ100で描画
            Vertex[0].pos.x = 320.0F - 50.0F ;    Vertex[0].pos.y = 240.0F + 50.0F ;    Vertex[0].pos.z = Z ;
            Vertex[0].u = 0.0F ;
            Vertex[0].v = 0.0F ;

            Vertex[1].pos.x = 320.0F + 50.0F ;    Vertex[1].pos.y = 240.0F + 50.0F ;    Vertex[1].pos.z = Z ;
            Vertex[1].u = 1.0F ;
            Vertex[1].v = 0.0F ;
    
            Vertex[2].pos.x = 320.0F - 50.0F ;    Vertex[2].pos.y = 240.0F - 50.0F ;    Vertex[2].pos.z = Z ;
            Vertex[2].u = 0.0F ;
            Vertex[2].v = 1.0F ;

            Vertex[3].pos.x = 320.0F + 50.0F ;    Vertex[3].pos.y = 240.0F - 50.0F ;    Vertex[3].pos.z = Z ;
            Vertex[3].u = 1.0F ;
            Vertex[3].v = 1.0F ;

            Vertex[4].pos.x = 320.0F - 50.0F ;    Vertex[4].pos.y = 240.0F - 50.0F ;    Vertex[4].pos.z = Z ;
            Vertex[4].u = 0.0F ;
            Vertex[4].v = 1.0F ;

            Vertex[5].pos.x = 320.0F + 50.0F ;    Vertex[5].pos.y = 240.0F + 50.0F ;    Vertex[5].pos.z = Z ;
            Vertex[5].u = 1.0F ;
            Vertex[5].v = 0.0F ;

            // 輝度は全要素100% 
            for(int i=0;i<6;i++){
                Vertex.dif = GetColorU8(255,255,255,255) ;
                Vertex.norm = VGet(0.0f,0.0f,-1.0f) ;
                Vertex.spc = GetColorU8(0,0,0,0) ;
                Vertex.su=0.0f;
                Vertex.sv=0.0f;
            }
            
        }

        // ポリゴンを透過色無しで2枚描画
        DrawPolygon3D( Vertex, 2, GrHandle, TRUE ) ;

        // 裏画面の内容を表画面に反映
        ScreenFlip() ;
    }

    // DXライブラリ使用の終了処理
    DxLib_End() ;

    // ソフトの終了
    return 0 ;
}


さて、質問なのですが・・・
画像が暗いのです。そこで、いろいろといじっておりましたら・・・・
Vertex.norm = VGet(0.0f,0.0f,-1.0f) ; の最後のZ方向の法線ベクトル値を
例えば -2.0f にしたら明るくなります。
これは、なぜなのでしょうか?
法線ベクトルは単位ベクトルではないのでしょうか?
まだ、勉強を始めたばかりで、ライティングも理解できておりませんが、お助けを。

Ma

Re:龍神録「3D背景を作ってみよう」

#2

投稿記事 by Ma » 15年前

古いのは、2010年ではなく2009年にかかれているためです。
法線ベクトルの件については、私はよく分かりません。
推測するなら、そのような仕様だということで(マテ

non

Re:龍神録「3D背景を作ってみよう」

#3

投稿記事 by non » 15年前

アップされたのは、今年の2/6でなく、昨年の2/6でしたか・・・・
それは、失礼しました。

御津凪

Re:龍神録「3D背景を作ってみよう」

#4

投稿記事 by 御津凪 » 15年前

> 法線ベクトル

単位ベクトルは正確な結果を出すためのものであり、
内部計算においては計算自体に問題は無く、正規化されていないベクトルでもそのまま計算されます。

法線ベクトルは、ライトの方を向いている(鋭角)ほど明るくなり、逆を向く(鈍角)ほど暗くなります。
法線ベクトルは主にポリゴンの影に影響しますが、色が明るくなったのはこの法線ベクトルの値が単純に大きくなったためです。
今回のような例だと、ベクトルは二倍の大きさになっているので、通常の結果の二倍の値になったと考えられます。

正確に明るく(本来の画像の色に)したいのならば、ライト色・(頂点カラーを使用する設定になっている場合は)頂点カラー値を白にするか、
マテリアルのエミッシブカラー(自己発光色)を白にすると恐らく解消するはずです。

白く飛んでしまう・真っ白になってしまう場合は、他のカラー値を黒にするなどして試していくと良いと思います。

DXライブラリを試した結果ではありませんが、 DirectX を使用している限り、上記の方法でうまくいくはずです。

softya

Re:龍神録「3D背景を作ってみよう」

#5

投稿記事 by softya » 15年前

>法線ベクトルは単位ベクトルではないのでしょうか?

わざわざライブラリで正規化していないです。時間の無駄ですから。
ってことで明るさが2倍になっただけだと推測されます。

DXLibのデフォルトライトはどうなっているか確認した方が良いと思います。デフォルトは、アンビエントライトだけって可能性もありますので。

non

Re:龍神録「3D背景を作ってみよう」

#6

投稿記事 by non » 15年前

御津凪さん、softyaさん、回答ありがとうございます。

正規化していない件、了解しました。

頂点カラー(ディフューズカラー)は白にしているつもりです。
スペキュラは使用しないがデフォルトなので、ディフューズカラーと同じはずです。

エミッシブやアンビェントはもうちょっと調べないとわかりません。

さて、おふたりとも3Dには詳しそうですね。
ライブラリは何がお勧めですか?
御津凪さんはDirectX9ですか。

何をやろうってのはいまのところないです。
とりあえず、お勉強です。
ただ、将来はウェブカメラ画像と3D画像を組み合わせたいと朧気ながら考えています。
その前にAerobeatのように画像処理もやってみたいのですが・・・
そこで、平行してOpenCVも勉強してます。

non

Re:龍神録「3D背景を作ってみよう」

#7

投稿記事 by non » 15年前

ライティング計算処理を使用するかどうかを設定する関数がありましたので、
使用しないにしたら、元のプログラムと同程度の明るさになりました。

SetUseLighting( FALSE ) ;

non

Re:龍神録「3D背景を作ってみよう」

#8

投稿記事 by non » 15年前

間違いがありました。

>スペキュラは使用しないがデフォルトなので、

スペキュラカラー使用するがデフォルトでした。

御津凪

Re:龍神録「3D背景を作ってみよう」

#9

投稿記事 by 御津凪 » 15年前

> 御津凪さんはDirectX9ですか。

今触っているのは DirectX 11 (と Direct2D & DirectWrite) ですが、
(DirectXに)慣れる為という意味では DirectX 9 → 10 or 11 が妥当だと思います。

3D 処理に関して薦めるライブラリは、今のところ薦めれるほど良いものは無いですね。
そのおかげでライブラリを自作してますから。


エフェクトに興味があるのでしたら、 DirectX のシェーダーを触ってみてはどうでしょうか。
慣れるまで少々難しいですが、DirectX 10 以降必須となっている言語です。

シェーダーでも画像処理が出来ますし、やろうと思えばカメラからキャプチャした画像やムービーもDirectX のテクスチャとして利用することが可能です。
これらを利用して Windows Media Player の視覚エフェクトのような効果も作れますよ。


> SetUseLighting( FALSE ) ;

ライトを無効にすると、遠近の要である明暗がなくなってしまいますが、問題は無いのでしょうか?
とあるポリゴンだけというのであれば、そのポリゴンを描画する時だけライティングを切る方法で出来ますが。

通りすがり

Re:龍神録「3D背景を作ってみよう」

#10

投稿記事 by 通りすがり » 15年前

過去ログからしてAerobeatはOpenCV使っていないようです。

softya

Re:龍神録「3D背景を作ってみよう」

#11

投稿記事 by softya » 15年前

私はPS1とか、あとごにょごにょ(守秘義務により伏せます)とかなら詳しんですけどね。
DirectXは、ちょっと遊んだだけで本格的には組んでません。

3Dを学習するのに、DXlibは悪い選択肢では無いとおもいます。
3Dの基本であるモデルの座標変換、カメラの透視変換、ライティングについては一通り関数が揃ってますから。ちゃんと細かい処理を理解したいなら、DirectXを少しづつやっていくのが良いでしょうね。

その他としては、C#+XNAも3Dを簡単に扱うことが出来ますし、HSPで良く使われているEasy3DのC/C++版も公開されているので試してみてはどうでしょうか?
http://www5d.biglobe.ne.jp/~ochikko/menuE3D.htm
※Easy3Dは試していないので、どのぐらいの事が出来るか分かりませんが。

DirectXの3D処理の概要です。
http://journal.mycom.co.jp/column/graph ... index.html


>ライティング計算処理を使用するかどうかを設定する関数がありましたので、
>使用しないにしたら、元のプログラムと同程度の明るさになりました。

じゃぁ、デフォルトライトが裏側にあるとかじゃないでしょうか?
3Dの勉強のためには、とりあえずライトOFFはやめた方が良いと思います。
ライトをちゃんとした位置にするか、ライトだけOFFにしてアンビエントだけだとどうなるかとか試してみて下さい。

non

Re:龍神録「3D背景を作ってみよう」

#12

投稿記事 by non » 15年前

>御津凪さん
DirectX のシェーダーですか、初めて聞きます。調べてみます。
>ライトを無効にすると、遠近の要である明暗がなくなってしまいますが、問題は無いのでしょうか?
もとのプログラムと同じだから良しとしましょう。

>通りすがりさん
OpenCVではなかったですか。じゃ、なんでしょ。ご存じですか?

softya

Re:龍神録「3D背景を作ってみよう」

#13

投稿記事 by softya » 15年前

No:48148の続きですが、DirectXとシェーダを詳しくなりたいなら「ゲームつくろー」の~DirectX9~のDirectX技術編とプログラマブルシェーダ編を読んでみると良いんじゃないでしょうか。
http://marupeke296.com/GameMain.html
ただ、いきなり読むと情報量に圧倒されると思います。

non

Re:龍神録「3D背景を作ってみよう」

#14

投稿記事 by non » 15年前

>softyaさん
まだ、専門用語についていけないので、ポチポチ進めていきます。
なんで、こんなにわからない用語が出てくるのだろう・・・
もうすこし、お二方が言われている意味がわかってきたら、また尋ねますね。
そのときはよろしく。

Justy

Re:龍神録「3D背景を作ってみよう」

#15

投稿記事 by Justy » 15年前

>OpenCVではなかったですか。じゃ、なんでしょ。ご存じですか
 普通に DirectShowだと思いますよ。

Dixq (管理人)

Re:龍神録「3D背景を作ってみよう」

#16

投稿記事 by Dixq (管理人) » 15年前

私は特に難しい事してませんよ、Justyさんのおっしゃる通り、ただDirectShowを使っただけです。形を覚えたりするわけじゃないので、自力で計算しても色検知位ならすぐ出来ました。

non

Re:龍神録「3D背景を作ってみよう」

#17

投稿記事 by non » 15年前

DirectShowですか、わかりました。

閉鎖

“C言語何でも質問掲示板” へ戻る