質問: ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/3b4d8bb78e36872219e33a4973507b24.png) //ループの始まり for( int i=0; i<6841; ++i) //6841 { int b[3]; b[0]=MeshNormals_id[3*i+0]; b[1]=MeshNormals_id[3*i+1]; b[2]=MeshNormals_id[3*i+2]; opengl glNormal3f(MeshNormals[3*b[0]+0],MeshNormals[3*b[0]+1],MeshNormals[3*b[0]+2]); glNormal3f(MeshNormals[3*b[1]+0],MeshNormals[3*b[1]+1],MeshNormals[3*b[1]+2]); glNormal3f(MeshNormals[3*b[2]+0],MeshNormals[3*b[2]+1],MeshNormals[3*b[2]+2]); ``` ```opengl glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDisable(GL_LIGHTING); ``` 光を当てたら上のようになった。どこか間違えてるのだろうが、オブジェクトでかけている部分が何なのか教えてほしいです。
回答: カリングという言葉があります. 「描画不要なポリゴンの描画を省いて処理を軽くする」機能全般を表す言葉ですが, 単に「カリング」とだけ呼んだ場合「裏面カリング」...つまりポリゴンの裏面を描画を省く機能を指します. で, 恐らくモデルのポリゴンで裏表が正常でないために, カリングでの省略対象となってしまって描画されなくなっているのかなと思います. とりあえず楽な対策としては, カリングを無効にすることかなと思います. OpenGL であれば `glDisable(GL_CULL_FACE);`. あと, しばしばあるのが裏表が逆のパターン. その場合はカリングは有効なままにして, `glFrontFace(GL_CW);` と `glFrontFace(GL_CCW);` のどちらかと, `glCullFace(GL_FRONT);` と `glCullFace(GL_BACK);` のどちらかの, 良い組み合わせを使いましょう. この場合, `glCullFace()` は `GL_BACK` 固定にして `glFrontFace()` が `GL_CW` と `GL_CCW` のどちらが良いか判別するのがベターでしょうか. とは言え最終的には, やっぱりモデルのポリゴンの表裏が正常か, が大事です. 全モデルがその設定で描画できるならそれでもいいですが, 1 つの例外的なモデルのためにいちいち設定を切り替えるべきではないと思いますので. ポリゴンの表裏を決める要素は 2 つあり, 1 つは法線です. ただ法線はどちらかと言えばカリングではなく, 実際に描画される段階でライトなどとの関係性から描画色を決める際に使われるデータです. カリングに強く影響するであろう要素はもう 1 つの「頂点の記述順序」です. ポリゴンは頂点の記述順序が時計回りか, 反時計回りかによっても表裏が決まります. `GL_CW` の CW とは ClockWise, つまり時計回りのことで, `GL_CCW` の CCW とは Counter-ClockWise, つまり反時計回りのことです.