進捗が良くない
進捗が良くない.
あの青い山みたいなのを動かしたいんだけどうまくいかない.
QThread
を使ってデータを更新してやることを考えた.
QThread Class | QtCore 5.3 | Documentation | Qt Project
QThread
を継承したWaveCalculer
を作ってそんなかで計算させることにしたが,データの共有が問題になる.
shared_ptr (C++11) - cpprefjp - C++ Library Reference
shared_ptr
を使ってみた.
なかなか動き出さない.QThread
の使い方が良くないようだ.結局良く分からなかったので,QTimer
で16ms計ってシグナルを飛ばしてもらうことにした.シグナルが飛んだら計算しGLWidget
を更新する.
できた.結構かかった.CPUをすごく食う.1コアまるごと持って行かれる.
頂点法線ベクトル
昨日のは白い部分がギザギザになっていてあまり見栄えが良くなかった.光の反射をスムーズに描画するためには頂点法線法線ベクトルを使用するらしい.今回全ての点は4つの四角形に接している(端は無視).だから4つの四角形の法線ベクトルを足しあわせて正規化すればいい.適当だけど.
glBegin(GL_POLYGON); { if (!useVertexNormal) { auto n = face->normal(); glNormal3f(n.x(), n.y(), n.z()); } for (int j = 0; j < 4; j++) { if (useVertexNormal) { auto n = calcVertexNormal(i, j); glNormal3f(n.x(), n.y(), n.z()); } glVertex3f(v[j]->x(), v[j]->y(), v[j]->z()); } } glEnd();
なめらか
openGL難しい 〜光源〜
あるものを作ろうとしてCのopenGL APIを直接叩いている.Unityでもできるかもしれないが直接叩いている.
QtのウィンドウにGLWidgetを貼り付け,右にコントロールパネルを出す形にしようと思っている.
Qt をはじめよう! 第14回: GUI デザイナでのレイアウトに慣れよう! | Qt Japanese Blog
やはりopenGLは難しい.今日はまったのは(これ以外もあるけど)光源の設定.これまで光源を全く使ったことがなかった.
GLUTとOpenGLでライティングされた立方体を描画するプログラム | GLUTでOpenGL 3Dプログラミング
ここを参考にやったが,glEnable(GL_CULL_FACE);
すると何も表示されなくなった.
LWJGL で Hello world してみる(ポリゴン表示編) / 桃缶食べたい。
どうやらこれは表示しない面を決める関数らしい.使用しなければ問題なくなるので使用しないことにした.
// light1 平行光源 const GLfloat light1Position[4] = {-30.0f, 100.0f, -30.0f, 0.0f}; const GLfloat light1Diffuse[3] = {1.0f, 1.0f, 1.0f}; // white const GLfloat light1Specular[3] = {1.0f, 1.0f, 1.0f}; // white glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light1Position); glLightfv(GL_LIGHT0, GL_DIFFUSE, light1Diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light1Specular); // light2 環境光 const GLfloat light2Position[4] = {0.0f, 10.0f, 0.0f, 1.0f}; const GLfloat light2Ambient[3] = {0.5f, 0.5f, 0.5f}; glEnable(GL_LIGHT1); glLightfv(GL_LIGHT1, GL_POSITION, light2Position); glLightfv(GL_LIGHT1, GL_AMBIENT, light2Ambient); ... void GLWidget::paintObject() { static GLfloat diffuse[3] = {0.01960f, 0.40000f, 0.72157f}; // #0566b8 static GLfloat ambient[3] = {0.01960f, 0.40000f, 0.72157f}; // #0566b8 static GLfloat specular[3] = {1.0f, 1.0f, 1.0f}; static GLfloat shininess[1] = {125.0f}; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); glBegin(GL_POLYGON); { glNormal3f(0, 1, 0); glVertex3f(-50, 0, -50); glVertex3f(50, 0, -50); glVertex3f(50, 0, 50); glVertex3f(-50, 0, 50); } glEnd(); }
ここで,オブジェクト(平面)の向きが気になったので,反転させてみた.すると今度は真っ白になった.
平行光源が効き過ぎたのかな?と思ったらこんな記事を見つけた.
そこで,平面を分割すると
望んでいたようになった.分割しないといけないことはなんとなく分かったが,真っ白になるのが解せない.
違う
色々間違ってた.法線ベクトルの計算と光源の配置が違ってた.直した.こうなった.いい感じ.
Haskellをやってる(やってない)
- 作者: Miran Lipovaca
- 出版社/メーカー: オーム社
- 発売日: 2012/09/21
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る
読んでる.1-8読んで9,10飛ばしていま14.分かりやすく説明されている本だと思う.おかげで今モナドがどういうものか理解したつもりでいるが,どう使えばいいのか分からない.どう使えばいいのか分からないならとりあえず使ってみればいいのだ,ということでゲームを作ることにした.考えているのはn番煎じのライフゲームと3番煎じくらいのティッピーぴょんぴょん.Flappy Birdもどきとか絶対別の方法で作ったほうがいいだろと思ってる.うん.
ゲームを作ろうと
とか
とか
Freeモナドでゲームを作ろう!第1回: Gameモナドの基本 - モナドとわたしとコモナド
とか見てる.のだが
Haskellが全く読めない
一番困っているのが,どの関数がどのモジュールのものなのか分からないことだ.import
文ではデフォルトでfull importされてしまうため,全く見分けがつかない.C#とかだと関数は全てクラスに属しているし,Goだとimport
のデフォルトの動作が名前付きインポートなので,どの関数が何を対象としたものかはっきり分かるのだが,Haskellは全くわからないのだ….全部import qualified A as B
されているなら別だが.
あとは,やはり親しんでいる手続き言語と比べて記法が独特で馴染めない.
この方の言うように初学者には優しくないのかもなと思う.それとどこまで進んだのかわからないし,どこまで行けばいいのかもわからない,非常に混沌としている,というのも感じる.