3Dプログラミング一般
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG質問、テクニックなど。
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNGところでハイトフィールドって一般的な用語なの? ハジメテキイタヨ
00042
NGNG法線の平均って外積で良いんですよね。
下のようにしてみたのですが、どうにもうまくいきません。
m_pHightFieldは各位置での高さを収めた行列です。
D3DXVECTOR3 getPointNormal(int x, int z)
{
D3DXVECTOR3 triNorm[6], ptNorm;
float hight[7];
hight[0] = (m_pHightField[(z - 1) * w + x ] - 192) / 4;
hight[1] = (m_pHightField[(z - 1) * w + x - 1] - 192) / 4;
hight[2] = (m_pHightField[ z * w + x - 1] - 192) / 4;
hight[3] = (m_pHightField[ z * w + x ] - 192) / 4;
hight[4] = (m_pHightField[ z * w + x + 1] - 192) / 4;
hight[5] = (m_pHightField[(z + 1) * w + x - 1] - 192) / 4;
hight[6] = (m_pHightField[(z + 1) * w + x ] - 192) / 4;
if(x < 0) hight[2] = hight[5] = 0.0f;
if(z < 0) hight[0] = hight[1] = 0.0f;
if(x >= w) hight[1] = hight[4] = 0.0f;
if(z >= h) hight[5] = hight[6] = 0.0f;
D3DXVec3Cross(&triNorm[0], &D3DXVECTOR3(x , hight[0], z - 1), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[0], &triNorm[0] , &D3DXVECTOR3(x - 1, hight[2], z ));
D3DXVec3Cross(&triNorm[1], &D3DXVECTOR3(x + 1, hight[1], z - 1), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[1], &triNorm[1] , &D3DXVECTOR3(x , hight[0], z - 1));
D3DXVec3Cross(&triNorm[2], &D3DXVECTOR3(x + 1, hight[4], z ), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[2], &triNorm[2] , &D3DXVECTOR3(x + 1, hight[1], z - 1));
D3DXVec3Cross(&triNorm[3], &D3DXVECTOR3(x - 1, hight[2], z ), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[3], &triNorm[3] , &D3DXVECTOR3(x - 1, hight[5], z + 1));
D3DXVec3Cross(&triNorm[4], &D3DXVECTOR3(x - 1, hight[5], z + 1), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[4], &triNorm[4] , &D3DXVECTOR3(x , hight[6], z + 1));
D3DXVec3Cross(&triNorm[5], &D3DXVECTOR3(x , hight[6], z + 1), &D3DXVECTOR3(x , hight[3], z ));
D3DXVec3Cross(&triNorm[5], &triNorm[5] , &D3DXVECTOR3(x + 1, hight[4], z ));
D3DXVec3Normalize(&triNorm[0], &triNorm[0]);
D3DXVec3Normalize(&triNorm[1], &triNorm[1]);
D3DXVec3Normalize(&triNorm[2], &triNorm[2]);
D3DXVec3Normalize(&triNorm[3], &triNorm[3]);
D3DXVec3Normalize(&triNorm[4], &triNorm[4]);
D3DXVec3Normalize(&triNorm[5], &triNorm[5]);
D3DXVec3Cross(&ptNorm, &triNorm[0], &triNorm[1]);
D3DXVec3Cross(&ptNorm, &ptNorm , &triNorm[2]);
D3DXVec3Cross(&ptNorm, &ptNorm , &triNorm[3]);
D3DXVec3Cross(&ptNorm, &ptNorm , &triNorm[4]);
D3DXVec3Cross(&ptNorm, &ptNorm , &triNorm[5]);
D3DXVec3Cross(&ptNorm, &ptNorm , &triNorm[6]);
D3DXVec3Normalize(&ptNorm, &ptNorm);
return ptNorm;
}
0005デフォルトの名無しさん
NGNG>ところでハイトフィールドって一般的な用語なの? ハジメテキイタヨ
http://www.povray.org/docs/pov30005.htm#section%204.4.3
00073
NGNG>法線の平均って外積で良いんですよね。
ちゃうだろ。単にベクトルの総和を正規化すればよし。
数学的には意味不明な操作だけど、グラフィック屋さんの常套手段だね。
(普通は注目頂点に接続している角度で重み付け平均するけど、メッシュだから
あんまり差はないでしょう。たぶん)
コードはダメなニオイがするので見てません。
>>2
>ハイトフィールドから頂点の法線を求める効率的なアルゴリズム教えてください。
「効率的な」と書いたら、非効率的なアルゴリズムは実装できていると
思われるよ。4を見ると効率云々の問題ではないのでは?
正確にことばを使ってね。
>>5
さんきゅー
#ネタだったら笑って許して
00084
NGNGネタじゃないんですが、、、
ダメなのはわかってます。
正常に出来てないんですから。
とりあえず、こんなレベルでわかるように説明して欲しいな、と思ったので。
00095
NGNGその前に、コード中の height field 想像図。
表示がずれるのでエディタにコピペとかして。
Z
↑
| FG
|----CDE
| BA
| |
◎------------→X
Y(手前方向+)
原点(0,0,0)をO
点ABCDEFGの座標値はそれぞれコード中の
(x ,height[0],z-1)
(x-1,height[1],z-1)
(x-1,height[2],z )
(x ,height[3],z )
(x+1,height[4],z )
(x-1,height[5],z+1)
(x ,height[6],z+1)
と対応する。
00105
NGNGZ
↑
| FG
|----CDE
| BA
| |
◎------------→X
Y(手前方向+)
00115
NGNGD3DXVec3Cross(&triNorm[0],&D3DXVECTOR3(x,height[0],z-1),&D3DXVECTOR3(x,height[3],z));
は何をやってるのかというと、これは OA×OD だよね?
つまり、三角形OADの法線を求めてることになるけど、
本当にこれでいいのかい?
00124
NGNG外積とか全然関係なかったです。
現在とりあえず用意しているハイトフィールドは64x64です。
それで、ソースを書き直してみました。
何度も紙に図を書きながら書いて、おおむねうまく表示されているようなのですが、
ちょっと一部おかしいところがあるんです。
ソースばかり貼ってウザイと思いますが、時間が空いたらで良いのでよろしくお願いします。
D3DXVECTOR3 v1, v2, triNorm[6], ptNorm;
// とりあえず、淵の処理は保留
if(x == 0 || z == 0 || x == w - 1 || z == h - 1)
{
return D3DXVECTOR3(0.0f, 1.0f, 0.0f);
}
D3DXVec3Normalize(&v1, &D3DXVECTOR3( 0, m_pHeightField[ x + (z - 1) * w], -1));
D3DXVec3Normalize(&v2, &D3DXVECTOR3(-1, m_pHeightField[(x - 1) + (z - 1) * w], -1));
D3DXVec3Cross(&triNorm[0], &v1, &v2);
D3DXVec3Normalize(&triNorm[0], &triNorm[0]);
v1 = v2;
D3DXVec3Normalize(&v2, &D3DXVECTOR3(-1, m_pHeightField[(x - 1) + z * w], 0));
D3DXVec3Cross(&triNorm[1], &v1, &v2);
D3DXVec3Normalize(&triNorm[1], &triNorm[1]);
v1 = v2;
D3DXVec3Normalize(&v2, &D3DXVECTOR3( 0, m_pHeightField[ x + (z + 1) * w], 1));
D3DXVec3Cross(&triNorm[2], &v1, &v2);
D3DXVec3Normalize(&triNorm[2], &triNorm[2]);
v1 = v2;
D3DXVec3Normalize(&v2, &D3DXVECTOR3( 1, m_pHeightField[(x + 1) + (z + 1) * w], 1));
D3DXVec3Cross(&triNorm[3], &v1, &v2);
D3DXVec3Normalize(&triNorm[3], &triNorm[3]);
v1 = v2;
D3DXVec3Normalize(&v2, &D3DXVECTOR3(+1, m_pHeightField[(x + 1) + z * w], 0));
D3DXVec3Cross(&triNorm[4], &v1, &v2);
D3DXVec3Normalize(&triNorm[4], &triNorm[4]);
v1 = v2;
D3DXVec3Normalize(&v2, &D3DXVECTOR3( 0, m_pHeightField[ x + (z - 1) * w], -1));
D3DXVec3Cross(&triNorm[5], &v1, &v2);
D3DXVec3Normalize(&triNorm[5], &triNorm[5]);
D3DXVec3Add(&ptNorm, &triNorm[0], &triNorm[1]);
D3DXVec3Add(&ptNorm, &ptNorm , &triNorm[2]);
D3DXVec3Add(&ptNorm, &ptNorm , &triNorm[3]);
D3DXVec3Add(&ptNorm, &ptNorm , &triNorm[4]);
D3DXVec3Add(&ptNorm, &ptNorm , &triNorm[5]);
D3DXVec3Normalize(&ptNorm, &ptNorm);
00134
NGNGm_pHeightField[]はfloat型のハイトフィールドです。
で、求めたい頂点を含むポリゴン6つの法線を求めて、
その平均値を点の法線としています。
00144
NGNGhttp://medlem.tripodnet.nu/cszpom/test.jpg
影のつき方がおかしいのですが
00154
NGNGどうにか、できたようなので結果を報告します。
|// ポリゴンの法線を求める
|D3DXVec3Normalize(&v1, &D3DXVECTOR3( 0.0f, m_pHeightField[x + (z - 1) * w] - m_pHeightField[x + z * w], -1.0f));
|D3DXVec3Normalize(&v2, &D3DXVECTOR3(-1.0f, m_pHeightField[x - 1 + (z - 1) * w] - m_pHeightField[x + z * w], -1.0f));
|D3DXVec3Cross(&triNorm[0], &v1, &v2);
|D3DXVec3Normalize(&triNorm[0], &triNorm[0]); (*1)
|(各ポリゴンにつき繰り返し)
|
|D3DXVec3Add(&ptNorm, &triNorm[0], &triNorm[1]);
|(各法線につき繰り返し)
|
|D3DXVec3Normalize(&ptNorm, &ptNorm);
このような感じでできるようになりました。
しかし、ひとつだけまだわからないことがあります。
*1の時点で、正規化するのが正しいのでしょうか?
oct.2000のCマガ47ページには
>・ベクトルの外積
>(中略)
>もしAとBがともに正規化されている場合、
>この間の外積で求めたベクトルも大きさが1となります。
とあるのですが、正規化しないと大きさが1ではないようなのですが。
どうか、知恵をお貸しください。
00165
NGNG|x×y|=|x||y|sinθ
だから2ベクトルのなす角で大きさは変わるね
θ≒0 や θ≒π のときの計算結果には注意したほうがいい
※そのCマガ10月号の記事は大ウソ
00175(訂正)
NGNGその雑誌が手元にないので何ともいえない
0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNGと、いうことで。
Cook-Torranceのモデルがよくわからないので
詳しい人教えてくれage
0022デフォルトの名無しさん
NGNG頭悪そう・・・。
0023くだらない質問
NGNGみなさんはIM・RMどっち使ってますか?
理由もお聞かせ下さい。
また、3DCGをDrawPrimitiveで書くとき
どんなコンバートツール使ってますか?
自分はIMでPGし始めたのですが、ここで詰まってます。
ちなみにLightWaveは高くて買えません。
0024デフォルトの名無しさん
NGNGOpen Inventor って使ってる人いないの?
http://oss.sgi.com/projects/inventor/
0025くだらない質問
NGNG今、他のスレ読んでて気づきました。
駄レスしてごめんなさい。
もうちょい自分で調べます。
以上、2chプログラム板初心者でした。
0026くだらない質問
NGNG・・・と、いきなりのレス。
ありがとうございます。
0027デフォルトの名無しさん
NGNGまともなスレ立てるなら普通は面倒見るよ
0028デフォルトの名無しさん
NGNGhttp://www.mic.atr.co.jp/dept2/inventcl/
002928
NGNGOpenGLスレの人たちに聞けばちゃんとした反応があると思う
0030デフォルトの名無しさん
NGNG分からない箇所を具体的に書いたほうが良いと思う。
0031デフォルトの名無しさん
NGNG「XZが平面」で「Yが標高」という3Dのマップで
人を歩かせたいのですがXZ平面での移動量と標高データで
高さをわりだして位置を決めるやり方だと高い山に登るとき
足が速くなってしまうのですが、他に何かいいやり方って
ないでしょうか?ちなみにポリゴンの頂点はXZ平面でみると
等間隔に並べてあります。Yの標高とはその頂点の高さを表して
います。
0032デフォルトの名無しさん
NGNGBlinnのモデルと同じじゃん
0033デフォルトの名無しさん
NGNG高校数学からやり直せ
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNGじゃあ、33ならどう作るの?
これって高校数学程度じゃできないと思うけど。
0036デフォルトの名無しさん
NGNGおいおい、速度ベクトルの大きさを一定して解決するじゃねーか。
ジサクジエンウザイネ
0037デフォルトの名無しさん
NGNGhttp://piza.2ch.net/test/read.cgi?bbs=tech&key=969984472&st=708&to=708&nofirst=true
0038デフォルトの名無しさん
NGNG0039糞スレの名無しさん
NGNGまともな書き込みする奴もみんなsageてるよ
0040デフォルトの名無しさん
NGNGだからそれができないんだって。
っていうかプログラム組んでみてくれよ。
一定の速度ベクトルぶんだけその方向に進んでも、
標高データから登り坂だったり下り坂だったりするだろ。
そうするとポリゴンを複数挟んで移動してしまったとき?????
になるんだよ。わっかんねーかなー。
0041age荒らしカッコワルイ
NGNGhttp://piza.2ch.net/test/read.cgi?bbs=tech&key=969984472&ls=10
■◇■◇■◇■◇■◇■◇ 終了 ■◇■◇■◇■◇■◇■◇
■ このスレッドは過去ログ倉庫に格納されています