iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
任意のビューコントローラの表示内容をキャプチャするメソッドを作成してみた。
- (UIImage *)imageScreenShot:(UIViewController *)viewController
{
UIGraphicsBeginImageContextWithOptions(viewController.view.frame.size, 1.0, 0.0);
[viewController.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
先日のMSM2012の抽選会で『OpenGL+GLSLによる物理ベースCGアニメーション』をいただいてしまった。これは自分に対する宿題と考え、OpenGLについて取り組んでみることにする。
ただ、この書籍はサンプルコードで動きを確認しながら学習していく内容なのだが、Windows環境向けで、OS XのXcodeで動かすのは困難な為、一つずつ、進める事にした。
GLUTのアプリケーションをXcodeでビルドするには、以下のヘッダーファイルをインクルードする必要がある。
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
そして、以下の内容でMakefileを記述すればいい。
cc -framework GLUT -framework OpenGL -framework Cocoa glutapp.c -o glutapp
ただ、折角のOSXなので、Xcodeを利用したい。ということで、著者は以下の手順でプロジェクトを作成した。
とりあえず、main.mmを以下の内容にして、GLUTウィンドウが開くことを確認する。
#import <iostream>
#import <Foundation/Foundation.h>
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#import <GLUT/glut.h>
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
glutInit(&argc, (char **)argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(600, 500);
glutInitWindowPosition(500, 100);
glutCreateWindow("GL_Affine");
glutDisplayFunc(display);
glutMainLoop();
}
return 0;
}
『OpenGL+GLSLによる物理ベースCGアニメーション』では、独自の動物の物体を描画していたが、これを動かすようにするのは大変と思うし、本質的でないのでGLUTで用意されているティーポットを使うことにした。
このティーポットはソリッドとワイヤーフレームの二種類が用意されているので、wキーが押下されるとトグルで切り替わるようにした。
int width = 600;
int height = 500;
BOOL isWireframe = NO;
void resize(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
width = w;
height = h;
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (! isWireframe)
glutSolidTeapot(0.5);
else
glutWireTeapot(0.5);
glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
switch((unsigned char)key) {
case 'w':
isWireframe = !isWireframe;
break;
}
}
void idle(void)
{
glutPostRedisplay();
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
glutInit(&argc, (char **)argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(width, height);
glutInitWindowPosition(500, 100);
glutCreateWindow("IRIS GL");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(special);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutIdleFunc(idle);
init();
glutMainLoop();
}
return 0;
}
まだ、平面なのでワクワク感が足らないが。
立体に見せるには?ライトを当てれば!
以下のコードを初期化処理に追加する。
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat position[4] = {0.0, 0.0, -1.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, position);
これだと、手前からライトを当てだけで面白みがないので、X軸方向に角度をつけてみる。
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat position[4] = {0.5, 0.0, -1.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, position);
Subversionでtrunkとbranchのdiffをとる方法が分からなかったので、二つのディレクトリ間のdiffをとるスクリプトを書いた。
#!/bin/sh
TRUNK=../trunk/proj
BRANCH=../branches/branch01/proj
#diff -r ${TRUNK} ${BRANCH}
files=`ls ${TRUNK}/*.[hm]`
for filepath in ${files}; do
file=${filepath##*/}
echo '####' $file '####'
diff ${TRUNK}/${file} ${BRANCH}/${file}
echo '###############'
done
# End Of File