質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

解決済

2回答

1674閲覧

モデルを滑らかにする方法がわからない

txty

総合スコア298

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2021/11/18 06:43

編集2023/12/02 10:00

[リンク先を参考に、実装したいのですが]
リンク
グーローシェーダーらしいので、このコードを試してみたかったです。

追記:一定時間たって、質問のコードが正しくないのと進展がないという理由
から、ソースコードは、削除します。
追記: }は忘れてました。

追記...何を聞ききたいか分からなくなったので削除。
隣接する面の法線を平均したものになるって普通だと思うけど。

意図的に内容が抹消された質問とありましたので追記します。

最後に読み込むデータが2列ぐらいあるのですが、printfしても表記されません。forループをこれ以上増やすと、アプリケーションが落ちます。とありますように、データの読み取りにミスがあると思います。

で修正したものが、fscanf_s(fp,%f %f%f",&v[(i3)+0],&v[(i3)+1],&v[(i*3)+2]);とな

り、(ここ何でこうなるか分かっていないところだった。数値の読み取りを書きたい。)

//使い方 fscanf_s(fp, "%d", &num) // ファイルから整数
//を読み込む
// printf("%d\n", num); // 読み込んだ整数を表示する
//でした。

//fscanf_s(fp,%f%f%f ",&v[(i3)+0],&v[(i3)+1],&v[(i*3)+2]);
//ファイルに改行があったらfscanf_sにスペースをいれるそう。
//(やはりわかりません。自分で調べてください)
//ファイルに空白があったらfscanf_sにスペースを1個いれるそう。

//ファイルに,があったら fscanf_sに,をいれるそう。
%[^,]は、カンマ以外の文字列
fscanf_s("%[^,],%d,%lf", s, sizeof(s), &n, &x)
chatで調べた。ファイルは確認してない。間違えてたらすいません。自分で調べて。責任とりません。
//vやvnなどは読み飛ばすかどうするかは自分でなんかして。

法線は、objファイルなら法線をglNormal関数に直接値をいれても大丈夫です。objファイル以外は知らないです。修正しました。

1例。fscanf_sのスペースは考慮してない。

1.fscanf_s(fp,%f %f %f ,&v[(i3)+0],&v[(i3)+1],&v[(i3)+2]);
....頂点の数値を読み取る。
2.fscanf_s(fp,"%d//%d//%d%d//%d",&vertex[((3
k)+0],&housen[3k+0],&vertex[(3k+1)],&housen[.....省略 番号を読み取る

3.f[0]=vertex[(3k)+0];
f[1]=vertex[(3
k)+1];
f[2]=vertex[(3*k)+2];  番号としました。

4. (例) glVertex3f(v[(3 * (a[0]-1))+0 ], v[(3 * (a[0]-1)) +1], v[(3 * (a[0] -1))+2]);

// printf("%f=v[3 * 21216 +0],v[3 * (21216) +1] =%f,v[3 * 21216 +2]=%f\n",v[3 * (21216) +0],v[3 * 21216 +1], v[3 * 21216 +2]); //f 21217 glVertex3f(v[(3 * (a[1]-1))+0], v[(3 * (a[1]-1))+1], v[(3 * (a[1]-1))+2]); // printf("%f=v[3 * 21215 +0],v[3 * (21215) +1] =%f,v[3 * 21215 +2]=%f\n",v[3 * (21215) + 0], v[3 * 21215 + 1], v[3 * 21215 + 2]); //f21216 glVertex3f(v[(3 * (a[2]-1))+0], v[(3 * (a[2]-1)) +1], v[(3 * (a[2]-1)) +2]); // printf("%f=v[3 * 20399 +0],v[3 * (20399) +1] =%f,v[3 * 20399 +2]=%f\n", v[3 * (20399) + 0], v[3 * 20399 + 1], v[3 * 20399 + 2]); // // //f 20400 glEnd();

4は自己責任でお願いします。全体を通して間違えてても責任とれません.間違えていましたら教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2022/02/25 06:10 編集

削除
txty

2022/03/04 07:51 編集

削除
guest

回答2

0

ベストアンサー

リンク先のページで書かれている頂点の法線計算方法は、その頂点が含まれる各面の法線を平均して求めるというやり方なのではないかなと思います。
立方体の場合は各頂点は3つの面に含まれていてそれぞれの法線ベクトルを足してからベクトルの長さが1になるように正規化するという感じでしょうか。

3Dモデルには頂点データに法線ベクトルが含まれていることが多いので自分でこのような計算をしなくてもいい場合もあります。

投稿2021/12/03 12:39

tkaaad97

総合スコア64

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2021/12/04 10:45 編集

回答ありがとうございます。 3Dモデルには頂点データに法線ベクトルが含まれてるとありますが,webfront.obj形式に、不都合があったでしょうか。(あったら知りたい。) 立方体で一度確かめようと思います。また、質問するかもしれませんが、ありがとうございます。
tkaaad97

2021/12/04 10:59

wavefront形式はあまり知らないんですがvnが法線データで面要素のスラッシュで分けられた三つ目が法線データのインデックスのようです。 https://ja.wikipedia.org/wiki/Wavefront_.obj%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F https://ja.wikipedia.org/wiki/Wavefront_.obj%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#%E9%A0%82%E7%82%B9%E6%B3%95%E7%B7%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9 描画された面がそれぞれ同じ明るさで平坦になってしまっているとすると下のような原因が考えられるかなと思います。 - どこかでプログラムに間違いがあってそれぞれ面の各頂点の法線ベクトルが同じになってしまっている - 三角形の描画部分で頂点ごとに法線を指定できていないか、何かOpenGLのオプションなどが違っている 1つ目の場合は計算した法線ベクトルを標準出力にだしてみるなどして確認できるかなと思います。
txty

2021/12/18 17:06 編集

ありがとうございました。
guest

0

for (int i=0;i<(12439-7472)/3)+1;++i){

カッコの数があってませんよ

投稿2021/11/18 06:47

y_waiwai

総合スコア87782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

txty

2021/11/18 06:51

手入力で忘れてしまいました。追記します。すいません。
txty

2022/01/02 15:46 編集

最後に読み込むデータが2列ぐらいあるのですが、printfしても表記されません。forループをこれ以上増やすと、アプリケーションが落ちます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問