Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.1 ) |
- 名前:管理人 日時:2022/01/19 01:16
視点を変更すると色が変わるのはスペキュラカラーによる反射色が反映されている場合なので、
ディフューズカラーのみに有効な値( 0以上の値 )が代入されている場合は視点を変更しても色は変わりません
プログラムを拝見してみないと断言はできませんが、恐らく
VERTEX3D構造体のスペキュラカラーの色を指定する為のメンバー変数 spc の rgb に 200 等の
値を入れていただければ視点を変更した時に色が変わるようになると思いますので、よろしければお試しください m(_ _)m
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.2 ) |
- 名前:匿名 日時:2022/01/19 02:34
その現象のプログラムを作ってみました。
VERTEX3D Vertex[3];
SetGraphMode(640, 480, 32);
ChangeWindowMode(TRUE);
DxLib_Init();
auto s = GetColorU8(200, 200, 200, 200);
Vertex[0].pos = VGet(100.0f, 100.0f, 0.0f);
Vertex[0].norm = VGet(0.0f, 0.0f, -1.0f);
Vertex[0].dif = GetColorU8(255, 0, 0, 255);
Vertex[0].spc = s;
Vertex[0].u = 0.0f;
Vertex[0].v = 0.0f;
Vertex[0].su = 0.0f;
Vertex[0].sv = 0.0f;
Vertex[1].pos = VGet(250.0f, 100.0f, 0.0f);
Vertex[1].norm = VGet(0.0f, 0.0f, -1.0f);
Vertex[1].dif = GetColorU8(0, 255, 0, 255);
Vertex[1].spc = s;
Vertex[1].u = 0.0f;
Vertex[1].v = 0.0f;
Vertex[1].su = 0.0f;
Vertex[1].sv = 0.0f;
Vertex[2].pos = VGet(100.0f, 300.0f, 0.0f);
Vertex[2].norm = VGet(0.0f, 0.0f, -1.0f);
Vertex[2].dif = GetColorU8(0, 0, 255, 255);
Vertex[2].spc = s;
Vertex[2].u = 0.0f;
Vertex[2].v = 0.0f;
Vertex[2].su = 0.0f;
Vertex[2].sv = 0.0f;
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet(100.0f, 100.0f, 0.0f);
Vertex[0].norm = VGet(-1.0f, 0.0f, 0.0f);
Vertex[0].dif = GetColorU8(255, 0, 0, 255);
Vertex[0].spc = s;
Vertex[0].u = 0.0f;
Vertex[0].v = 0.0f;
Vertex[0].su = 0.0f;
Vertex[0].sv = 0.0f;
Vertex[1].pos = VGet(100.0f, 100.0f, 250.0f);
Vertex[1].norm = VGet(-1.0f, 0.0f, 0.0f);
Vertex[1].dif = GetColorU8(0, 255, 0, 255);
Vertex[1].spc = s;
Vertex[1].u = 0.0f;
Vertex[1].v = 0.0f;
Vertex[1].su = 0.0f;
Vertex[1].sv = 0.0f;
Vertex[2].pos = VGet(100.0f, 300.0f, 0.0f);
Vertex[2].norm = VGet(-1.0f, 0.0f, 0.0f);
Vertex[2].dif = GetColorU8(0, 0, 255, 255);
Vertex[2].spc = s;
Vertex[2].u = 0.0f;
Vertex[2].v = 0.0f;
Vertex[2].su = 0.0f;
Vertex[2].sv = 0.0f;
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
WaitKey();
DxLib_End();
return 0;
Zバッファが有効では無いので、奥の方にある二番目の三角形で上書きされています。
お互いに90度だから、当然光源からみて角度が違うはずですが、頂点の色が同じです。
なお、スペキュラカラーというのは指摘に従って
auto s = GetColorU8(200, 200, 200, 200);
にしました。確かにサンプルでは全部ゼロでしたから変更しました。
こういうことではないのでしょうか。
DXライブラリは最近ダウンロードしたもの。
Win10ノートパソコンでVS2017です。
また、別のプログラムの話ですが、裏面は描写されないハズなのに同じ色で描写されます。色を3頂点とも白にすると面は灰色になります。
画像は次です
ttps://dotup.org/uploda/dotup.org2700943.gif.html
asdfase
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.3 ) |
- 名前:通りすがり 日時:2022/01/19 11:07
このライブラリを知らない人の戯言ですが…
---
> お互いに90度だから、当然光源からみて角度が違うはずですが
光源ってどこにあるんでしょうか? 種類は? 光の方向は?
という光源関係の設定らしき記述が全く見当たらないので,おそらくは「何らかのデフォルト設定」な状態なのでしょうけど
そのデフォルトってどういう設定状態なのかを把握していますか?
…っていうのが気になりました.
↓
いやまぁ当然把握されているのでしょうけども,
光源設定の状況というのは暗黙の了解として省略するのではなくて明記される方が良いのではないかな? と.
「光源の設定はこうなっていて,オブジェクト側のパラメータがこうなっているんだから → 理屈では結果はこうなるハズ」という検証を行っているのだ,
というのを具体的に述べないと,他者は成否等(?)を判断しにくいでしょう.
---
「三角形は1個だけにして,その頂点パラメータの何れかを時々刻々と変化させてみる(入力操作で変化させるなり適当に自動更新させるなり)」といった形の方が
何が変われば→結果がどう変わる という因果関係を見やすいのではないでしょうか.
(「2つの三角形」だと三角形間で複数パラメータに差異が生じるので何が結果にどう影響しているのかを把握するのが難しいでしょう)
---
「色」の係数的なパラメータの値が いかにも飽和しやすそうな値 にも見えるのが気になります.
{ambient, diffuse, specular} のうちのどれか1つとか2つの成分だけ色が飽和してしまうような場合には残りの成分の影響は観測できない可能性もあります.
そこらへんの塩梅は大丈夫なのでしょうか?
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.4 ) |
- 名前:通りすがり 日時:2022/01/19 11:16
あと,(少なくとも最初は){赤,緑,青}と,いろんな色をごちゃごちゃと使うのではなく,
全頂点の色味のパラメータは統一して明度変化だけを観測する形にした方が見やすいと思います.
黒→白 なグレースケールな世界にするのがわかりやすいでしょう.
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.5 ) |
- 名前:通りすがり 日時:2022/01/19 13:41
(連投Sorry)
Specular に関して "Shininess" に相当するパラメータに関する設定らしき記述も見当たらないですね.
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.6 ) |
- 名前:管理人 日時:2022/01/20 02:47
> 匿名さん
> お互いに90度だから、当然光源からみて角度が違うはずですが、頂点の色が同じです。
通りすがりさんも仰られていますが、
Vertex[0].dif 〜 Vertex[2].dif に代入する値を GetColorU8( 255,255,255,255 ) で
統一してみてください、二つの三角形の色が違う事がわかります
( 2つ目の DrawPolygon3D の三角形のほうが、1つ目の三角形よりも若干暗く描画されます )
法線の角度によるライトの影響の受け方の違いが分かるプログラムを組んでみましたので
よろしければ実行してご確認ください( スペキュラは逆に結果がわかりにくくなるので 0 にしました )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3D Vertex[3];
SetGraphMode(640, 480, 32);
ChangeWindowMode(TRUE);
DxLib_Init();
// 変化しない値を最初に代入
Vertex[0].dif = GetColorU8(255, 255, 255, 255);
Vertex[0].spc = GetColorU8( 0, 0, 0, 0 );
Vertex[0].u = 0.0f;
Vertex[0].v = 0.0f;
Vertex[0].su = 0.0f;
Vertex[0].sv = 0.0f;
Vertex[1].dif = GetColorU8(255, 255, 255, 255);
Vertex[1].spc = GetColorU8( 0, 0, 0, 0 );
Vertex[1].u = 0.0f;
Vertex[1].v = 0.0f;
Vertex[1].su = 0.0f;
Vertex[1].sv = 0.0f;
Vertex[2].dif = GetColorU8(255, 255, 255, 255);
Vertex[2].spc = GetColorU8( 0, 0, 0, 0 );
Vertex[2].u = 0.0f;
Vertex[2].v = 0.0f;
Vertex[2].su = 0.0f;
Vertex[2].sv = 0.0f;
// 法線の角度を 22.5度づつ変化させて6個三角形を描画
Vertex[0].pos = VGet( 0.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( 0.0f, 0.0f, -1.0f);
Vertex[1].pos = VGet(50.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( 0.0f, 0.0f, -1.0f);
Vertex[2].pos = VGet( 0.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( 0.0f, 0.0f, -1.0f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet( 50.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( -0.383f, 0.0f, -0.924f);
Vertex[1].pos = VGet(100.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( -0.383f, 0.0f, -0.924f);
Vertex[2].pos = VGet( 50.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( -0.383f, 0.0f, -0.924f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet(100.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( -0.707f, 0.0f, -0.707f);
Vertex[1].pos = VGet(150.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( -0.707f, 0.0f, -0.707f);
Vertex[2].pos = VGet(100.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( -0.707f, 0.0f, -0.707f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet(150.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( -0.924f, 0.0f, -0.383f);
Vertex[1].pos = VGet(200.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( -0.924f, 0.0f, -0.383f);
Vertex[2].pos = VGet(150.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( -0.924f, 0.0f, -0.383f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet(200.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( -1.0f, 0.0f, 0.0f);
Vertex[1].pos = VGet(250.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( -1.0f, 0.0f, 0.0f);
Vertex[2].pos = VGet(200.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( -1.0f, 0.0f, 0.0f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
Vertex[0].pos = VGet(250.0f, 0.0f, 0.0f);
Vertex[0].norm = VGet( -0.924f, 0.0f, 0.383f);
Vertex[1].pos = VGet(300.0f, 0.0f, 0.0f);
Vertex[1].norm = VGet( -0.924f, 0.0f, 0.383f);
Vertex[2].pos = VGet(250.0f, 50.0f, 0.0f);
Vertex[2].norm = VGet( -0.924f, 0.0f, 0.383f);
DrawPolygon3D(Vertex, 1, DX_NONE_GRAPH, FALSE);
WaitKey();
DxLib_End();
return 0;
}
> また、別のプログラムの話ですが、裏面は描写されないハズなのに同じ色で描写されます。色を3頂点とも白にすると面は灰色になります。
『裏面は描写されないハズ』というのはどちらから得られた情報でしょうか?
DXライブラリでは、デフォルトでは面の向きが裏でも表でも描画されます
( リファレンスには載っていませんが、SetUseBackCulling という関数で設定を変更できます
SetUseBackCulling( DX_CULLING_NONE ); // カリング無し( デフォルト設定 )
SetUseBackCulling( DX_CULLING_LEFT ); // 左回りカリング
SetUseBackCulling( DX_CULLING_RIGHT ); // 右回りカリング )
> 通りすがりさん
> 光源ってどこにあるんでしょうか? 種類は? 光の方向は?
DXライブラリではデフォルトのライトとして
種類:ディレクショナルライト
方向:x=0.577f, y=-0.577f, z=0.577f
↑このような上から斜め下に光がさしているようなライトが設定されています
> {ambient, diffuse, specular} のうちのどれか1つとか2つの成分だけ色が飽和してしまうような場合には残りの成分の影響は観測できない可能性もあります.
> そこらへんの塩梅は大丈夫なのでしょうか?
デフォルトでは ambient は 0、diffuse は上記プログラムの dif へ代入している値( 0〜255 → 0.0f〜1.0f )
specular は上記プログラムの spc へ代入している値( 0〜255 → 0.0f〜1.0f ) となります
> Specular に関して "Shininess" に相当するパラメータに関する設定らしき記述も見当たらないですね.
DXライブラリでは Direct3D 9 まであった固定機能パイプラインに沿った Specular 計算を行っていて、
その計算式では Shininess というパラメータは登場しないのですが、似たような効果のある Power という
パラメータではデフォルトでは 20.0f を設定しています
( Specular の計算式についてはこちら↓をご参照ください )
<反射光 (Direct3D 9)>
https://docs.microsoft.com/ja-jp/windows/win32/direct3d9/specular-lighting
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.7 ) |
- 名前:通りすがり 日時:2022/01/20 10:40
> 管理人様
デフォルト値の情報に感謝します.
"Shininess" という語は Phongの反射モデルでの語を意図して記したものです.
spacularの広がりを制御する用の指数なので,示されたリンク先での P と同一かと見えます.
さて,提示いただいた情報を鑑みるに,
・匿名氏の示したコードでは,平行光源の光の方向と,三角形の(頂点に設定されている)法線との内積値が,2つの三角形で同一となってしまっているので,
diffuse の差を見れない状態になっていると見えます.
・(ambientが0:無視できるとして) diffuse+specular の複合効果を見たいのであれば,
一方だけで最大値に達する状況が生じ得るような係数を用いることはわざわざしないのが無難と思えます(飽和の話)
0〜255 の世界であれば,255なんて値を用いずに.例えば128だとかそういう中間値にしておくのが良いのではないかと.
(e.g. diffuseの係数を255とかにした場合,前記内積が1.0付近となる状況では Specular 側の影響を観測できないことになるのでは)
#要は,「確認したい事柄があるのなら,理屈の上でそれを 確認できるハズの/最も確認しやすいような/etc テストをするべきなのでは?」っていう…
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.8 ) |
- 名前:通りすがり 日時:2022/01/20 11:32
> 視点を変更しても色が変化しません
に関しては,既に述べられているように,視点位置で変わるのは specular 成分だけなわけですが,
> 似たような効果のある Power というパラメータではデフォルトでは 20.0f を設定しています
とのことですので,
今回テストに用いられている三角形のような 固定的に配置した平面 のシェーディング結果では
specularの影響が明確に視認できるような視点の位置というのは 相応に狭い立体角範囲内 に限られるだろうと思うので
「視点を変更して」色の変化を観測するには,その範囲を狙って視点位置を設定してやらないと,なかなか影響を観測できないのではないかと.
(当該範囲の外側で視点位置を変えている間は色の変化を見れない可能性)
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.9 ) |
- 名前:匿名 日時:2022/01/20 12:50
返答ありがとうございます。
VERTEX3D Vertex[3];
SetGraphMode(640, 480, 32);
ChangeWindowMode(TRUE);
DxLib_Init();
SetCameraPositionAndTarget_UpVecY(VGet(0,0,-400), VGet(0.0, 0.0, 0.0));
//SetCameraPositionAndTarget_UpVecY(VGet(400 * 1.73 / 2, 0, -400 * 1 / 2), VGet(0.0, 0.0, 0.0));
SetupCamera_Ortho(600);
DrawSphere3D(VGet(-100, 0, 0), 100, 32, GetColor(255, 0, 0), GetColor(255, 255, 255), TRUE);
// 変化しない値を最初に代入
以下同じ
と、カメラ位置と見え方を変更します。
結果が次です。
ttps://dotup.org/uploda/dotup.org2701821.gif.html
adfeqqwerq
後から考えると原点からの距離を400に揃える必要はなかったです。
球の様子を見ると左上の方から光が当たっています。
見る場所を右に移動してX軸近くにすると、画像下の方となり球の影の部分が大きくなります。よくできています。移動した側からすると光源の位置が変わったからです。
ところが三角形の方は、形は変化するが、色が変わりません。
私(この分野に詳しくない)としては、ポリゴンで描かれたその三角形も色が変わって然るべきかと感じるのですが、そうではないのでしょうか。
最初の私の質問の意図はこれです。
もしかして、ポリゴンの明るさは光源の位置には無関係で視点と法線の角度だけで決まるのでしょうか?
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.10 ) |
- 名前:通りすがり 日時:2022/01/20 13:19
・ambient は単なる定数であるから,{光源設定,物体側の法線,視点位置}のいずれにも影響を受けない
・diffuse は 光の方向 と 物体側の法線 の関係から算出される(すなわち,視点位置の影響を受けない)
・spacular は {光の方向,物体側の法線,視点位置}の関係から算出される.
上記の3つの成分の和として最終的な色が定まる,という点は大丈夫ですか?
で,繰り返しになりますが,
この3つの中で視点の位置で変化するのは specularだけ なわけです.
なので,
あなたの三角形のレンダリングに関して
【specular 成分が(設定的に)存在しない状態であるか,あるいは存在はしているけれどもその影響を実質的に観測できない状況にある場合】においては,
あなたが観測する三角形の色とは ambient と diffuse に支配されているわけですから,
視点を変えても色の変化は{無い or 微小すぎて見た目にはわからん}という状態となります.
---
> (この分野に詳しくない)
とのことですが,その分野の機能をうまいこと使いたいのであれば,少しは学ぶべきでしょう.
ライブラリが便利なのは「自分でその機能を実装しなくていい」というところなのであって,
「話を全く知らなくてもその機能を使いこなせるのかどうか」っていうのはまた別の話です.
残念ながら(?) 3Dグラフィクス関係の処理というのは,少しは話を知ってないと使えないタイプの分野だと思います.
#{ ambient, diffuse, specular }なんて単語が何度も出てきているなら,それらが何なのかを検索してみるとか.
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.11 ) |
- 名前:通りすがり 日時:2022/01/20 13:32
良く晴れた日にてきとーな色のプラスチック製の板みたいなの(例えば下敷きとか)を屋外に持ち出して地面の上にでも置くとするじゃん?
で,それをある方向から見たときには,すっごい反射がまぶしいけども
それ以外の方向から見るなら,どっち方向から見ようが見た目の色は変わらないよね.
多分,今の三角形はそんな感じ.
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.12 ) |
- 名前:管理人 日時:2022/01/25 22:14
> 匿名さん
> 球の様子を見ると左上の方から光が当たっています。
> 見る場所を右に移動してX軸近くにすると、画像下の方となり球の影の部分が大きくなります。よくできています。移動した側からすると光源の位置が変わったからです。
> ところが三角形の方は、形は変化するが、色が変わりません。
> 私(この分野に詳しくない)としては、ポリゴンで描かれたその三角形も色が変わって然るべきかと感じるのですが、そうではないのでしょうか。
はい、そうではありません
DXライブラリのデフォルトの光源はディレクショナルライトと言って、位置の無い光源です( 『方向』だけの光源です )
なので視点( カメラ )の位置を変えても光源の位置( 視点に対する相対的な位置 )は変わりません( 『方向』しか無いので )
通りすがりさんも仰られている通り、三角形の見た目の色を決める要素は幾つかあります
光源と面の向きや位置など全く関係の無く色が決まる要素 = Ambient
光源と面の向きで色が決まる要素 = Diffuse
光源と面の向きと視点と面の位置で色が決まる要素 = Specular
この3つの要素で決まった色を合成したものが見た目の色となります
( 通りすがりさんのご説明の言い方を変えただけですが… )
そして、三角形には Diffuse の要素しかないので視点の位置をいくら変えても変化はありません
( Diffuse は視点の位置は関係ないので )
球には Diffuse と Specular の要素があるので、視点の位置を変えると Specular の色要素が変化して球に映り込むハイライトの位置が変わります
それ以外には Diffuse だけなので視点の位置を変えても球体の各面の Diffuse の色は変わりませんが
視点を移動すると球体の見えている『面』が変化するので見た目が大きく変わります
視点を移動することで、移動する前には隠れていた『面』の一部が新たに見え、移動する前には見えていた『面』の一部は逆に隠れることになります
各『面』は Diffuse の影響が異なる( 球体の『面』の法線( 向き )はそれぞれ異なる )ので、見えている面が変化するということは
球体の見え方も大きく変わるということです
対して三角形は視点をどこに移動しても見えている面は同じなので、見た目の変化が無い( Specular の要素も無いので変化が完全に無い )というわけです
DrawSphere3D で描画した球と DrawPolygonIndexed3D で描画した箱の周りをキーボードの左右キーで周れる
というプログラムを組んでみましたので、よろしければお手元で実行してみてください
球と箱、どちらも Diffuse は赤色、Specular は緑色にしたので、赤色部分は視点を移動しても変わらず、
緑色部分は視点が移動すると緑色部分も移動するのが分かると思います
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
VERTEX3D Vertex[ 24 ] ;
unsigned short Index[ 36 ] ;
int CameraHAngle = -90 ;
SetGraphMode( 640, 480, 32 ) ;
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() < 0 )
{
return -1 ;
}
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// Zバッファを有効化
SetUseZBufferFlag( TRUE ) ;
SetWriteZBufferFlag( TRUE ) ;
// バックカリングを有効化
SetUseBackCulling( DX_CULLING_LEFT ) ;
// マテリアルをセット
MATERIALPARAM Material ;
Material.Diffuse = GetColorF( 0.8f, 0.8f, 0.8f, 1.0f ) ;
Material.Specular = GetColorF( 0.8f, 0.8f, 0.8f, 0.0f ) ;
Material.Ambient = GetColorF( 0.2f, 0.2f, 0.2f, 0.0f ) ;
Material.Emissive = GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ;
Material.Power = 20.0f ;
SetMaterialParam( Material ) ;
// 24頂点で共通のパラメータをセット
for( int i = 0 ; i < 24 ; i ++ )
{
Vertex[ i ].dif = GetColorU8( 255, 0, 0, 255 ) ;
Vertex[ i ].spc = GetColorU8( 0, 255, 0, 0 ) ;
Vertex[ i ].u = 0.0f;
Vertex[ i ].v = 0.0f;
Vertex[ i ].su = 0.0f;
Vertex[ i ].sv = 0.0f;
}
// 24頂点の座標と法線をセット
Vertex[ 0 ].pos = VGet( -100.0f, 100.0f,-100.0f ) ; Vertex[ 0 ].norm = VGet( 0.0f, 0.0f,-1.0f ) ;
Vertex[ 1 ].pos = VGet( 100.0f, 100.0f,-100.0f ) ; Vertex[ 1 ].norm = VGet( 0.0f, 0.0f,-1.0f ) ;
Vertex[ 2 ].pos = VGet( -100.0f,-100.0f,-100.0f ) ; Vertex[ 2 ].norm = VGet( 0.0f, 0.0f,-1.0f ) ;
Vertex[ 3 ].pos = VGet( 100.0f,-100.0f,-100.0f ) ; Vertex[ 3 ].norm = VGet( 0.0f, 0.0f,-1.0f ) ;
Vertex[ 4 ].pos = VGet( -100.0f, 100.0f, 100.0f ) ; Vertex[ 4 ].norm = VGet( 0.0f, 0.0f, 1.0f ) ;
Vertex[ 5 ].pos = VGet( 100.0f, 100.0f, 100.0f ) ; Vertex[ 5 ].norm = VGet( 0.0f, 0.0f, 1.0f ) ;
Vertex[ 6 ].pos = VGet( -100.0f,-100.0f, 100.0f ) ; Vertex[ 6 ].norm = VGet( 0.0f, 0.0f, 1.0f ) ;
Vertex[ 7 ].pos = VGet( 100.0f,-100.0f, 100.0f ) ; Vertex[ 7 ].norm = VGet( 0.0f, 0.0f, 1.0f ) ;
Vertex[ 8 ].pos = VGet( -100.0f, 100.0f,-100.0f ) ; Vertex[ 8 ].norm = VGet( -1.0f, 0.0f, 0.0f ) ;
Vertex[ 9 ].pos = VGet( -100.0f, 100.0f, 100.0f ) ; Vertex[ 9 ].norm = VGet( -1.0f, 0.0f, 0.0f ) ;
Vertex[ 10 ].pos = VGet( -100.0f,-100.0f,-100.0f ) ; Vertex[ 10 ].norm = VGet( -1.0f, 0.0f, 0.0f ) ;
Vertex[ 11 ].pos = VGet( -100.0f,-100.0f, 100.0f ) ; Vertex[ 11 ].norm = VGet( -1.0f, 0.0f, 0.0f ) ;
Vertex[ 12 ].pos = VGet( 100.0f, 100.0f,-100.0f ) ; Vertex[ 12 ].norm = VGet( 1.0f, 0.0f, 0.0f ) ;
Vertex[ 13 ].pos = VGet( 100.0f, 100.0f, 100.0f ) ; Vertex[ 13 ].norm = VGet( 1.0f, 0.0f, 0.0f ) ;
Vertex[ 14 ].pos = VGet( 100.0f,-100.0f,-100.0f ) ; Vertex[ 14 ].norm = VGet( 1.0f, 0.0f, 0.0f ) ;
Vertex[ 15 ].pos = VGet( 100.0f,-100.0f, 100.0f ) ; Vertex[ 15 ].norm = VGet( 1.0f, 0.0f, 0.0f ) ;
Vertex[ 16 ].pos = VGet( -100.0f, 100.0f, 100.0f ) ; Vertex[ 16 ].norm = VGet( 0.0f, 1.0f, 0.0f ) ;
Vertex[ 17 ].pos = VGet( 100.0f, 100.0f, 100.0f ) ; Vertex[ 17 ].norm = VGet( 0.0f, 1.0f, 0.0f ) ;
Vertex[ 18 ].pos = VGet( -100.0f, 100.0f,-100.0f ) ; Vertex[ 18 ].norm = VGet( 0.0f, 1.0f, 0.0f ) ;
Vertex[ 19 ].pos = VGet( 100.0f, 100.0f,-100.0f ) ; Vertex[ 19 ].norm = VGet( 0.0f, 1.0f, 0.0f ) ;
Vertex[ 20 ].pos = VGet( -100.0f,-100.0f, 100.0f ) ; Vertex[ 20 ].norm = VGet( 0.0f,-1.0f, 0.0f ) ;
Vertex[ 21 ].pos = VGet( 100.0f,-100.0f, 100.0f ) ; Vertex[ 21 ].norm = VGet( 0.0f,-1.0f, 0.0f ) ;
Vertex[ 22 ].pos = VGet( -100.0f,-100.0f,-100.0f ) ; Vertex[ 22 ].norm = VGet( 0.0f,-1.0f, 0.0f ) ;
Vertex[ 23 ].pos = VGet( 100.0f,-100.0f,-100.0f ) ; Vertex[ 23 ].norm = VGet( 0.0f,-1.0f, 0.0f ) ;
// ポリゴンの頂点リストをセット
Index[ 0 ] = 0 ; Index[ 1 ] = 1 ; Index[ 2 ] = 2 ;
Index[ 3 ] = 3 ; Index[ 4 ] = 2 ; Index[ 5 ] = 1 ;
Index[ 6 ] = 5 ; Index[ 7 ] = 4 ; Index[ 8 ] = 7 ;
Index[ 9 ] = 6 ; Index[ 10 ] = 7 ; Index[ 11 ] = 4 ;
Index[ 12 ] = 9 ; Index[ 13 ] = 8 ; Index[ 14 ] = 11 ;
Index[ 15 ] = 10 ; Index[ 16 ] = 11 ; Index[ 17 ] = 8 ;
Index[ 18 ] = 12 ; Index[ 19 ] = 13 ; Index[ 20 ] = 14 ;
Index[ 21 ] = 15 ; Index[ 22 ] = 14 ; Index[ 23 ] = 13 ;
Index[ 24 ] = 16 ; Index[ 25 ] = 17 ; Index[ 26 ] = 18 ;
Index[ 27 ] = 19 ; Index[ 28 ] = 18 ; Index[ 29 ] = 17 ;
Index[ 30 ] = 22 ; Index[ 31 ] = 23 ; Index[ 32 ] = 20 ;
Index[ 33 ] = 21 ; Index[ 34 ] = 20 ; Index[ 35 ] = 23 ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// カメラの角度操作処理
if( CheckHitKey( KEY_INPUT_LEFT ) )
{
CameraHAngle-- ;
if( CameraHAngle <= -180 )
{
CameraHAngle += 360 ;
}
}
if( CheckHitKey( KEY_INPUT_RIGHT ) )
{
CameraHAngle++ ;
if( CameraHAngle > 180 )
{
CameraHAngle -= 360 ;
}
}
// カメラの位置と向きを設定
float Rad = CameraHAngle * 3.14159265f / 180.0f ;
SetCameraPositionAndTarget_UpVecY( VGet( cos( Rad ) * 600.0f, 0.0f, sin( Rad ) * 600.0f ), VGet( 0.0f, 0.0f, 0.0f ) ) ;
// 球を描画
DrawSphere3D( VGet( -200, 0, 0 ), 100, 32, GetColor( 255, 0, 0 ), GetColor( 0, 255, 0 ), TRUE);
// 箱を描画
DrawPolygonIndexed3D( Vertex, 24, Index, 12, DX_NONE_GRAPH, FALSE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
DxLib_End();
return 0;
}
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.13 ) |
- 名前:匿名 日時:2022/01/24 11:32
返答ありがとうございます。
ヘルプファイル
dxfunc_3d_draw.html
によると
// 2ポリゴン分のインデックスデータをセット
Index[ 0 ] = 0 ;
Index[ 1 ] = 1 ;
Index[ 2 ] = 2 ;
Index[ 3 ] = 3 ;
Index[ 4 ] = 2 ;
Index[ 5 ] = 1 ;
// 2ポリゴンの描画
DrawPolygonIndexed3D( Vertex, 4, Index, 2, DX_NONE_GRAPH, FALSE ) ;
からDrawPolygonIndexed3Dの第四引数は2です。三角形が二つだから。
返答最後のプログラムでは
// 箱を描画
DrawPolygonIndexed3D( Vertex, 24, Index, 36, DX_NONE_GRAPH, FALSE ) ;
となっています。それが36ですが、箱が6面で一つの面に三角形が二つだから6*2=12ではないでしょうか。そうしないと表示が乱れます。
それとは別に質問です。
そのプログラムを試してみました。
すこし改造して上下方向にも視点を変えられるようにしました。
そして、画像
ttps://dotup.org/uploda/dotup.org2705085.gif.html
dffaeaad
白い網はxz平面の座標です。気にしないでください。
その視点位置からだと箱の輪郭が無くなります。
どの角度から見ても、それが箱だと判別できるようにする手段はないのですか。
せめて、同時に見える最大面数3の全ての色が互いに異なるようになって貰いたいです。
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.14 ) |
- 名前:通りすがり 日時:2022/01/24 13:23
これまで出てきた話を読んでいるならば(その内容を完全に理解していないとしても),
その観測結果に影響している設定値がどれどれなのかくらいはわかるハズ.
そしたらそれらのうちのいずれかの設定値を適当に変えてみるくらいはできるだろうし,やってみるのがふつーじゃないかい?
現時点で
> 手段はないのですか
という訊き方をしているのはどうなのかなー,と.
複数の面が同じ色になっているのは何故なのか,その理由や理屈を自身で把握する気は1ミリもない,ということかな?
と見えてしまうよ.
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.15 ) |
- 名前:管理人 日時:2022/01/25 22:30
> 匿名さん
> 箱が6面で一つの面に三角形が二つだから6*2=12ではないでしょうか。そうしないと表示が乱れます。
ご指摘ありがとうございます、修正しました m(_ _;m
> どの角度から見ても、それが箱だと判別できるようにする手段はないのですか。
全ての面の色が同一の場合は手段はないと思います
面ごとに色を変えたり、テクスチャを貼って形状を認識しやすくする等するとどの角度から見ても箱だと判別できるようになるかもしれません
|
Re: DrawTriangle3D()とDrawPolygonIndexed3D()で三角形 ( No.16 ) |
- 名前:匿名 日時:2022/01/27 14:01
返答ありがとうございます。
色を変える方法にします。
|
|