OpenGL OBJファイル Zバッファ

OBJファイルをOpenGLで表示することを試みました。
ネットにはいくつかの方法が示されていますが、(私の環境:Win7)VC++2010Expressですんないり動いたのは次のサイトでした。
http://asura.iaigiri.com/OpenGL/gl15.html
ただ、ここで提供されているものはマウスで自在に視点を変えられるものです。私が必要としているものは、視点は自分のプログラムで制御するので、表示だけをやってくれるものです。
そこで、上記のプログラムを出来るだけ手をかけずに利用する方法を考えました。(同サイトでは新旧2つの方式が示されています。私は古い方を使いました)

その結果をまとめておきます。(VC++2010Expressを前提とします)
ステップ1:上のサイトの下の方にあるダウンロードからOBLMesh.lzhをダウンロードする。
ステップ2:OBJMesh.lzhを解凍し、OBJMeshフォルダーの中にあるOBJMeshフォルダーの中からOBJLoader.cppとOBJLoader.hを拝借する。
ステップ3:自分で作ったOpenGLのメインとなるcppファイルとOBJLoader.cppとOBJLoader.hをVC++2010の一つのプロジェクトに入れる。
ステップ3:自分メインプログラムを、OBJファイルを読み込むために6点修正する。

自分で作るOpenGLのメインプログラムの例を2つ示す。6つの修正点は、①から⑥に示す。

読み込むOBJファイルとmtlファイルは、cppファイルのあるフォルダーの中のMeshというフォルダーに入っているとしている。(④で指定)

プログラム1(上記サイトのメインを単純化したもの)
// include
#include //①
#include <GL/glut.h>
#include “OBJLoader.h”//②

// global
int WindowWidth = 512;
int WindowHeight = 512;
char WindowTitle[] = “OBJファイルの読み込み画像”;
GLfloat lightColor[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lightPosition[4] = { 0.0, 100.0, 0.0, 0.0 };

OBJMesh mesh; //③

//————————————————————-
//  SetLighting ライティング
//————————————————————-
void SetLighting() {
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightColor);
}

//————————————————————-
//  Initialize 初期化処理
//————————————————————-
void Initialize() {
glClearColor(0.3, 0.3, 1.0, 1.0); // 塗りつぶし色
glEnable(GL_DEPTH_TEST); // 深度テスト有効
SetLighting();
mesh.Load(“Mesh/box.obj”); // ④ OBJファイルの読み込み
}

//————————————————————-
//  Display ウィンドウへの描画
//————————————————————-
void Display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, WindowWidth, WindowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (double)WindowWidth/(double)WindowHeight, 0.1, 1000.0);
gluLookAt(5.5,5.0,5.3,0.0,0.0,0.0,0.0,1.0,0.0);⑤視点を直接指定
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// glPushMatrix();

mesh.Render(1.0); // ⑥ OBJファイルを描画(数値は大きさ)

// glPopMatrix();
glutSwapBuffers(); // ダブルバッファ
}

//——————————————————-
//  Idle アイドリング時の処理
//——————————————————-
void Idle() {
glutPostRedisplay();
}

//———————————————————
//  Reshape サイズ変更
//———————————————————
void Reshape(int x, int y) {
WindowWidth = x;
WindowHeight = y;
if ( WindowWidth < 1 ) WindowWidth = 1;
if ( WindowHeight < 1 ) WindowHeight = 1;
}

//——————————————————-
//  main
//——————————————————-
int main( int argc, char **argv ) {
glutInit(&argc, argv);
glutInitWindowSize(WindowWidth, WindowHeight);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutCreateWindow(WindowTitle);
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(Idle);
Initialize();
glutMainLoop();
return 0;
}
//——————————————————-

プログラム2:これはz_buffer(デプスバッファ)の値を表示するプログラムである。
(//z_buffer表示begin….//z_buffer表示endを、はずせば普通の表示になる)

#include <iostream>//①
#include <GL/glut.h>
#include “OBJLoader.h”//②

OBJMesh mesh;  //③

void disp(void ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
//   glPushMatrix();
mesh.Render(1.0); // ⑥ OBJファイルを描画(数値は大きさ)

// z_buffer 表示begin
float *data = new float[500*500];//z_buff read read data
glReadPixels(0, 0, 500,500,GL_DEPTH_COMPONENT,GL_FLOAT,data);

unsigned char bimage[500][500][3];//z_buff write data
for(int b=0 ; b<500 ; b++){
for(int a=0 ; a<500 ; a++){
bimage[b][a][0] = bimage[b][a][1] = bimage[b][a][2]=(unsigned char)(data[b*500+a]*255);
}
}

glDrawPixels(500, 500, GL_RGB, GL_UNSIGNED_BYTE, &bimage[0][0][0]);
// z_buffer 表示end
glDisable(GL_DEPTH_TEST);
//   glPopMatrix();
glutSwapBuffers();
}

void resize(int w,int h){
glViewport(0,0,w,h);
glLoadIdentity();
glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0);⑤正射影を使用
}

int main(int argc , char ** argv) {
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow(“OBJfile”);
mesh.Load(“Mesh/dosei.obj”); // ④ OBJファイルの読み込み
glutDisplayFunc(disp);
glutReshapeFunc(resize);
glutMainLoop();
return 0;
}

左が(上記サイトの)オリジナル、右がz(デプス)バッファを表示したものです(手前ほど黒くなっています)。

  

==OBJファイルのサンプル(ネットから拾った)
box.objとbox.mtl
===box.obj
# Created by Metasequoia

mtllib box.mtl

v -100.000000 100.000000 100.000000
v -100.000000 -100.000000 100.000000
v 100.000000 100.000000 100.000000
v 100.000000 -100.000000 100.000000
v 100.000000 100.000000 -100.000000
v 100.000000 -100.000000 -100.000000
v -100.000000 100.000000 -100.000000
v -100.000000 -100.000000 -100.000000
# 8 vertices

vt 0.00000 0.00000
vt 1.00000 0.00000
vt 1.00000 1.00000
vt 0.00000 1.00000
# 4 texture vertices

vn 0.00000 0.00000 1.00000
vn 1.00000 0.00000 0.00000
vn 0.00000 0.00000 -1.00000
vn -1.00000 0.00000 0.00000
vn 0.00000 1.00000 0.00000
vn 0.00000 -1.00000 0.00000
# 6 normal vertices

usemtl default
f 2/4/1 4/3/1 3/2/1 1/1/1
f 4/4/2 6/3/2 5/2/2 3/1/2
f 6/4/3 8/3/3 7/2/3 5/1/3
f 8/4/4 2/3/4 1/2/4 7/1/4
f 1/4/5 3/3/5 5/2/5 7/1/5
f 8/4/6 6/3/6 4/2/6 2/1/6
# 6 elements
===
====boxmtl
# Created by Metasequoia

newmtl default
Ka 0.60000 0.60000 0.60000
Kd 0.80000 0.80000 0.80000
Ks 0.00000 0.00000 0.00000
Ns 5.00000

========
(objとmtlの行の開始部にスペースが入っているとダメ)

UB,UG

私の知り合いは、担当医が変わった時、先生からカルテを見せられ、「UBと書いてあるので、難しい患者さんのようですね」と言われたそうです。

UBって何の略かと思ってネットで調べたら「うるさいババァ」だそうです。UBと書かれたその人は、「今度インク消しを持っていって消してやる」、って言ってました。

お医者さんは患者にマークを見せて自覚を促したのでしょう。私も今度カルテを渡されたら見てみます。「UG」と書かれていたら、インク消しを使わなくっちゃ!

===
新京成「新鎌ヶ谷駅」からは、富士山とスカイツリーのツーショットが見えることを最近発見しました。

(これは、ズームを最大にして撮っています。人の目にはもっとはっきりと綺麗に見えるんですが)

小松菜

9/15の書き込みに「小松菜の種まき」があります。
9/14と9/21の2回に分けて種を撒きました。 その後の経過報告がリーダーから来ていたので紹介します。

報告1(10/14)
10月6日はキュウリ栽培耕地に後期栽培実習の「コマツナ」を作る為、前期に 続きNさんの圃場をお借りして2m×1mの畑を耕した。PH検査では6.5~7 の数値が出たので、苦土石灰を400g投入して元肥と一緒によく鋤き込んだ。10月14日に再度PH検査した結果、あまり改善されていない事が判り更に30 0g程度苦土石灰を投入した。よく鋤き込んだ後、篩をかけて表土から深さ10cm までを細かな土粒にし、表面を平らに均して20cm間隔で6条の種蒔き溝を作成 3cm間隔で1粒ごと種蒔きをした。銘柄は「楽天」で恩田種苗店で購入した。尚、コマツナはひと月程度で生育して栽培期間が短いので、畑の半分は1週間ずら して種蒔きし、11月いっぱいは栽培を続ける事に決定した。次回種蒔きは21日。

報告2(11/12)
先発組は種蒔き後28日経過、後発組は21日経過。先発組は丈が10~15cm本葉が4~6枚。後発組は丈が5cm前後、本葉が2~4枚。本日、両方共間引く。 最近一週間の気温は昼間で18~21℃、夜間で9~13℃と比較的低くなっている。その為か成長速度が鈍いように感ずる。特に後発は21日目で初間引きという状態で、先発と比べても相当遅いことが判る。先発組から8本間引いた。後発組からは多数間引く。何れも土寄せをして作業終了。ネキリムシの被害が1本出ていたので、掘り返したところ1匹発見し写真を撮って捕殺した。トンネル寒冷紗継続。

報告3(11/19)
先発組は種蒔き後35日経過。成長にバラつきがあるものの葉身25cmのものは収穫し、見劣りするものは間引きした。後発組も順調に生育しており、混み合うものを間引きした。防虫ネットの効果で虫害は僅少。一株ネキリムシにやられている位である。犯人は「カブラヤガ」で老齢幼虫を1匹発見して捕殺した。先発組は来週日曜日に収穫する予定。収穫数15本。トンネル寒冷紗は引き続き実施する。

報告4(12/10)
12月9日でコマツナを全量収穫して全作業を終了した。種蒔き先発組は本日で56日目、後発組が49日目。後発組は本日が初収穫。葉身は略25cm高で葉数は7~8枚。株の直径は約2cm前後、根の長さはバラツキはあるが長いもので25cmを越えていた。後発組は条間を15cmにしたがもう少し狭くても問題は無さそうであった。夜間、昼間共に気温が低くなるに従い作物の成長は遅れ、収穫までに時間を要した。今後について検討の結果休耕する事とし、消石灰を撒いて来春を待つ。Nさんから3月に畑の一部をお借りしてから10か月、長い一年でした。

つづき

 昨日は病院への付き添いで休みました。夜、書き込みを開始したら今日の授業の準備をしていないことに気付き、明日早く出て行ってやろうと思い、書き込みを中断して寝ました。そんなわけで昨日は尻切れでした。

===
昨日、病院で耳にした会話(70歳位のおばあさんが友達に話している)。
「山中さん、燕尾服来て立派だったよ」と、とても嬉しそうに誇らしげに話していました。
最近インターネットの普及などで世界が小さくなりましたが、このおばあさんのような「おらが村のほまれ」とか「わしらの代表が世界で立派に振舞ってくれた」みたいな感覚ってあったな、って思い出しました。私もうれしく思います、おめでとうございます山中先生。

丸岡城(別名:霞ケ城)

丸岡城は、現存天守閣では最古の建築様式を持つ平山城です。 二重三階望楼型独立式という形式で、 通し柱はなく、1階が2・3階を支える構造となっています。 また、屋根瓦は全国的にも珍しい石製の瓦(笏谷石)が使用されています。

==

今日は、一寸、用があり ました。明日、追加します。

福井県立恐竜博物館

福井県立恐竜博物館は、恐竜に関する資料を展示した、恐竜に関する国内最大級の博物館です。
40体以上もの恐竜骨格をはじめとして千数百もの標本の数々、大型復元ジオラマや映像などを見ることができます。

揺り返し?

(1)今、すごい地震がありましたね。原発の使用済み核燃料など大丈夫か心配です。

(2)今週は、2ウインドウズprocessingで卒研卒業かと思いきや、そうは問屋が卸ませんでした。今日は1日その対応に追われてんてこ舞でした。

(3)金森長近と大野城

越前大野城からの大野市

その他

 

 

妙立寺,越前大野城

1.妙立寺(忍者寺)
寛永二十年(1643年)、三代藩主前田利常公の命により、
城内にあった祈願所を移し、運上町に創建された。
万一の場合の出城として、その中心的役割を持たせたと言われる。
そのため、建物全体が迷路状となり極めて複雑な構造を有し、
今日では『忍者寺』の別称持つ。
 

2.越前大野城
越前大野城は、天正4年頃(1576)、
織田信長より大野郡の3分の2を与えられた金森長近により、
4年の歳月をかけて築城されました。
大野城は2層3階建の大天守、2層2階の小天守、二の丸、三の丸があり、
外堀・内堀をめぐらし城を守っていました。
その石垣は、石を立てず、横に寝かせ、大きい石を奥に押し込んで積む、
野面積みという工法で、貴重な史跡といわれています。
現在の城は、昭和43年に再建されたものです。

||||rz

(1)このところ急に寒くなってきました。超ミニスカートの女子高生は寒さを感じないのだろうと思っていましたが、最近はマフラーを頭の方までグルグル巻きにしている学生をよく見かけるようになりました。ああいうのを、「頭隠して尻隠さず」って言うんだな、と思っています。

(2)今日は、情報科でない学生さんに「スマホのプログラミング」を教えます。ちょっと挑戦的な試みなので、期待半分、不安半分です。教員も毎年同じことを教えていると緊張感がなくなって元気が出ないので、色々スリリングな要素を取り入れモチベーションを維持するよう努めています。

(3)processingで、メインの他にもう一つウインドウを開き、そこにカメラ画像を表示するプログラムを作りました(卒研サポート)。
import processing.video.*;
Capture video;
PFrame f;
secondApplet s;

void setup() {
video = new Capture(this, 320, 240);
PFrame f = new PFrame();
}

void draw() {   
video.read();
background(255,200,200);//main windowをpinkにしてみた
  s.image(video,0,0);
  s.redraw();
}

public class PFrame extends Frame {
   public PFrame() {
      setBounds(0,0,320,240);
      s = new secondApplet();
      add(s);
      s.init();
      show();
    }
}

public class secondApplet extends PApplet {
public void draw() {}
}

appinventorサンプルプログラム

今日もBUSYでした。

(1)スマホアプリ簡単作成ツール(AppInventor)のサンプルプログラムを作る。
http://fry.no.coocan.jp/lecture/IS/AppInv.pdf
明日からの授業で使用。

(2)POV-Rayによる3DCG作品(来年の年賀状)をチェックしました。
(割と気に入った作品)

(あまり好みではないけど、どうやって模様を貼り付けたのかな?と思う)

(3)これから、明日の計算機実習室での動作確認