進捗が良くない

進捗が良くない.

あの青い山みたいなのを動かしたいんだけどうまくいかない.

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を更新する.

f:id:yuntan_t:20140922192833p:plain

できた.結構かかった.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();

f:id:yuntan_t:20140922134706p:plain

なめらか

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();
}

ここで,オブジェクト(平面)の向きが気になったので,反転させてみた.すると今度は真っ白になった.

f:id:yuntan_t:20140921214741p:plain

平行光源が効き過ぎたのかな?と思ったらこんな記事を見つけた.

OpenGL入門平面に光をあてるときの注意点

そこで,平面を分割すると

f:id:yuntan_t:20140921214820p:plain

望んでいたようになった.分割しないといけないことはなんとなく分かったが,真っ白になるのが解せない.

違う

色々間違ってた.法線ベクトルの計算と光源の配置が違ってた.直した.こうなった.いい感じ.

f:id:yuntan_t:20140922005746p:plain

Haskellをやってる(やってない)

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

読んでる.1-8読んで9,10飛ばしていま14.分かりやすく説明されている本だと思う.おかげで今モナドがどういうものか理解したつもりでいるが,どう使えばいいのか分からない.どう使えばいいのか分からないならとりあえず使ってみればいいのだ,ということでゲームを作ることにした.考えているのはn番煎じのライフゲームと3番煎じくらいのティッピーぴょんぴょん.Flappy Birdもどきとか絶対別の方法で作ったほうがいいだろと思ってる.うん.

ゲームを作ろうと

tmishima/Hinecraft · GitHub

とか

fumieval/free-game · GitHub

とか

Freeモナドでゲームを作ろう!第1回: Gameモナドの基本 - モナドとわたしとコモナド

とか見てる.のだが

Haskellが全く読めない

一番困っているのが,どの関数がどのモジュールのものなのか分からないことだ.import文ではデフォルトでfull importされてしまうため,全く見分けがつかない.C#とかだと関数は全てクラスに属しているし,Goだとimportのデフォルトの動作が名前付きインポートなので,どの関数が何を対象としたものかはっきり分かるのだが,Haskellは全くわからないのだ….全部import qualified A as Bされているなら別だが.

あとは,やはり親しんでいる手続き言語と比べて記法が独特で馴染めない.

Haskellの壁 - think and error

この方の言うように初学者には優しくないのかもなと思う.それとどこまで進んだのかわからないし,どこまで行けばいいのかもわからない,非常に混沌としている,というのも感じる.

Archにした

Kubuntuにさよならバイバイ 俺はArchと旅に出る

開発版含め最新のソフトウェアがすぐに手軽にインストールできる環境が手に入り,とても楽しい.yaourtは最高.

構築完了までにインストールしたソフトウェアや設定などをどっかに書いとこうと思ったんだが,やっぱり思った時にすぐ行動しないとダメだった.何したかもう覚えてない.

とりあえずちょびっといじったzshテーマでも貼っとこ

My Prezto Paradox theme

Gistの内容がすぐに貼り付けられるはてぶ素晴らしい