■drawLineの中身 void drawLine( const Vec3f &start, const Vec3f &end ) { float lineVerts[3*2]; glEnableClientState( GL_VERTEX_ARRAY ); //頂点配列有効 glVertexPointer( 3, GL_FLOAT, 0, lineVerts ); //3次元, 型, バイトオフセット, 配列名 lineVerts[0] = start.x; lineVerts[1] = start.y; lineVerts[2] = start.z; lineVerts[3] = end.x; lineVerts[4] = end.y; lineVerts[5] = end.z; glDrawArrays( GL_LINES, 0, 2 ); //0から始まって頂点数2 glDisableClientState( GL_VERTEX_ARRAY ); } ■直線描画 shaderの影響受ける gl::pushModelView(); gl::translate( getWindowCenter() ); gl::rotate( mRotate ); glColor4f( 1.0, 0.0, 0.0f, 1.0f ); gl::drawVector( Vec3f::zero(), Vec3f(500,500,500)); gl::popModelView(); ■塗りつぶし gl::clear(Color(0, 0, 0)); // 徐々に塗りつぶしもできる? gl::clear(Color(1.0f, 0.0f, 0.0f, 0.5f)); ■カラー Color myColor( 1.0f, 0.5f, 0.25f ); console() << "myColor = " << myColor << std::endl; ■円描画 gl::color( mColor ); gl::drawSolidCircle(Vec2f(15.0f, 25.0f), 50.0f); ■円の精度を小さくしてヘキサゴン描画 gl::drawSolidCircle( Vec2f( 15.0f, 25.0f ), 50.0f, 7 ); ■四角形描画 Rectf rect( mLoc.x, mLoc.y, mLoc.x + mRadius, mLoc.y + mRadius ); gl::drawSolidRect( rect ); ■テクスチャ描画 全画面 gl::Texture image(loadImage(loadResource("image.jpg"))); image.enableAndBind(); gl::draw(image, getWindowBounds()); ■テクスチャ読み込み&描画 別方法 gl::Texture texture = loadImage( "image.jpg" ); gl::draw( texture ); gl::draw( texture, getWindowBounds() ); ■テクスチャをURLから読み込み Url url( "http://www.libcinder.org/media/tutorial/paris.jpg" ); mImage = gl::Texture( loadImage( loadUrl( url ) ) ); ■マウスイベント時の位置取得 event.getPos() ■コンソール出力 console() << event.getPos() << endl; ■サーフェス 2次元の数値列 2種類の型 Surface8u regularSurface; // an empty 8 bit surface (Surface8U = Surface) Surface32f hdrSurface; // an empty 32 bit high dynamic range surface Surface mySurface( 640, 480, true ); // width, height, alpha? Surface mySurface( 640, 480, true, SurfaceChannelOrder::RGBA ); // width, height, alpha?, channel order ■サーフェスをテクスチャに変換 フィルターなどの加工はSurfaceで済ませておく Surface mySurface; // initialized elsewhere gl::Texture texture = gl::Texture( mySurface ); ■マウスイベント オーバーライドして用いる void mouseDown(MouseEvent event); void mouseUp(MouseEvent event); void mouseDrag(MouseEvent event); void mouseMove(MouseEvent event); void mouseWheel(MouseEvent event); ■マウスのボタン 左中右 void TutorialApp::mouseDown( MouseEvent event ) { if( event.isRight() && event.isShiftDown() ) { console() << "Special thing happened!" << std::endl; } } ■マウス位置 void TutorialApp::mouseMove( MouseEvent event ) { mMouseLoc = event.getPos(); } ■マウスムーブ時とマウスドラッグ時の挙動を合わせる void TutorialApp::mouseMove( MouseEvent event ) { mMouseLoc = event.getPos(); } void TutorialApp::mouseDrag( MouseEvent event ) { mouseMove( event ); } ■正規化 normalize() safeNormalize() mDirToCursor.safeNormalize(); ■ベクターの値変更 mAcc.set( 0, 0 ); ■二乗和 dir.lengthSquared(); ■矢印描画 Vec3f p1( mLoc, 0.0f ); Vec3f p2( mLoc + mDirToCursor * arrowLength, 0.0f ); float headLength = 6.0f; float headRadius = 3.0f; gl::drawVector( p1, p2, headLength, headRadius ); ■サーフェスのコピー newSurface = oldSurface.clone(); (こちらが主流 内部ではshared_ptr) newSurface = oldSurface; ■サーフェスの一部コピー Surface newSurface( oldSurface.getWidth() / 2, oldSurface.getHeight(), false ); newSurface.copyFrom( oldSurface, newSurface.getBounds() ); ■画像からサーフェス Surface myPicture = loadImage( "myPicture.png" ); ■テクスチャからサーフェス gl::Texture myTexture; // initialized elsewhere Surface fromTex( myTexture ); ■サーフェスの各ピクセルを処理 Surface bitmap( loadImage( "image.jpg" ) ); Area area( 0, 0, 500, 500 ); Surface::Iter iter = surface->getIter( area ); while( iter.line() ) { while( iter.pixel() ) { iter.r() = 255 - iter.r(); iter.g() = 255 - iter.g(); iter.b() = 255 - iter.b(); } } // iter.r(0,-1)で上のピクセル, iter.r(1,1)で右下のピクセルにアクセスできる ■チャネルとしてロード Url url( "http://www.flight404.com/_images/paris.jpg" ); mChannel = Channel32f( loadImage( loadUrl( url ) ) ); // 1.0 represents white and 0 represents black. ■チャネルのピクセルからカラー値 void Particle::update( const Channel32f &channel ) { float gray = channel.getValue( mLoc ); mColor = Color( gray, gray, gray ); } ■キーボードイベント void TutorialApp::keyDown( KeyEvent event ) { if( event.getChar() == '1' ){ mRenderImage = ! mRenderImage; } else if( event.getChar() == '2' ){ mRenderParticles = ! mRenderParticles; } } ■特別なキー arrow keys, shift, esc, ctrl if( event.getCode() == KeyEvent::KEY_RIGHT ) { console() << "Right Arrow pressed" << std::endl; } ■キーボード 押し続け void TutorialApp::keyDown( KeyEvent event ) { if( event.getChar() == 'w' ) { mIsMovingForward = true; } } void TutorialApp::keyUp( KeyEvent event ) { if( event.getChar() == 'w' ) { mIsMovingForward = false; } } ■タッチイベント(iPhone, iPad) void TouchTestApp::touchesBegan(TouchEvent event) {} void TouchTestApp::touchesMoved(TouchEvent event) {} void TouchTestApp::touchesEnded(TouchEvent event) {} ■ベクター型 ci::Vec2i ■乱数 Rand::randFloat(8.0f); Rand::randInt(50, 250); Rand::randVec2f(); ■カラー型 Color(1.0f, 1.0f, 1.0f) ■STL Listで最初から最後まで for (list<Particle>::iterator iter = particles.begin(); iter != particles.end();) {...} ■Listからの消去 if (iter->isDead()){ iter = particles.erase(iter); } ■Listへの追加 particles.push_back(Particle(mouseLocation)); ■マルチタッチ Settings *settings; settings->enableMultiTouch(); ■Windowサイズ getWindowWidth(), getWindowHeight() getWindowSize() // type Vec2i ■サーフェスとチャネルの変換 Surface surface( channel ); Channel channel( surface ); ■画像の青チャネルに対してSobelエッジ検出 gl::Texture createEdgeTexture( const Channel &src ) { Channel temp( src.getWidth(), src.getHeight() ); cinder::ip::edgeDetectSobel( src, &temp ); return gl::Texture( temp ); } myTexture = createEdgeTexture( simpleSurface.getChannelBlue() ); ■画像出力 writeImage( "/path/to/image.png", surfaceToBeWritten ); ■画像フォーマット writeImage( "output.png", loadImage( "input.jpg" ) ); ■サーフェスとテクスチャの違い サーフェスはon CPU テクスチャはon GPU 加工はサーフェスで行う ■テクスチャのラッピング GL_CLAMP_TO_EDGE, GL_REPEAT gl::Texture::Format fmt; fmt.setWrap( GL_REPEAT ); texture = gl::Texture( someSurface, fmt ); ■ミップマップ gl::Texture::Format fmt; fmt.enableMipmapping( true ); fmt.setMinFilter( GL_LINEAR_MIPMAP_LINEAR ); ■ファイルがロードされたら描画 if( myImage ) gl::draw( myImage, getWindowBounds() ); ■時間の経過 getElapsedSeconds() getElapsedFrames() ■コンストレイン template<typename T> T constrain( T val, T minVal, T maxVal ) { if( val < minVal ) return minVal; else if( val > maxVal ) return maxVal; else return val; } ■STL Listからの削除 p = mParticles.erase( p ); // pはイテレータ ■パーリンノイズ 緩やかに変わるノイズ #include "cinder/Perlin.h" mPerlin = Perlin(); ■ブラウン運動 float noise = perlin.fBm( Vec3f( mLoc * 0.005f, app::getElapsedSeconds() * 0.1f ) ); // return -1.0f ~ 1.0f ■連番保存 QuickTimeなどで動画に変換 if( mSaveFrames ){ writeImage( getHomeDirectory() + "image_" + toString( getElapsedFrames() ) + ".png", copyWindowSurface() ); } ■数字などを文字列に toString() ■ ■ ■ ■ ■ ■各パーティクルで相互作用 void ParticleController::repulseParticles() { for( list<Particle>::iterator p1 = mParticles.begin(); p1 != mParticles.end(); ++p1 ) { list<Particle>::iterator p2 = p1; for( ++p2; p2 != mParticles.end(); ++p2 ) { Vec2f dir = p1->mLoc - p2->mLoc; float distSqrd = dir.lengthSquared(); if( distSqrd > 0.0f ){ dir.normalize(); float F = 1.0f/distSqrd; p1->mAcc += dir * ( F / p1->mMass ); p2->mAcc -= dir * ( F / p2->mMass ); } } } } ■画像ファイルをユーザーが選択 try { std::string p = getOpenFilePath( "", ImageIo::getLoadExtensions() ); if( ! p.empty() ) { // an empty string means the user canceled myImage = gl::Texture( loadImage( p ) ); } } catch( ... ) { console() << "Unable to load the image." << std::endl; } ■エッシャー ?? void TwirlSampleApp::twirl( Surface *surface, Area area, float maxAngle ) { // make a clone of the surface Surface inputSurface = surface->clone(); // we'll need to iterate the inputSurface as well as the output surface Surface::ConstIter inputIter( inputSurface.getIter() ); Surface::Iter outputIter( surface->getIter( area ) ); float maxDistance = area.getSize().length() / 2; Vec2f mid = ( area.getUL() + area.getLR() ) / 2; while( inputIter.line() && outputIter.line() ) { while( inputIter.pixel() && outputIter.pixel() ) { Vec2f current = inputIter.getPos() - mid; float r = current.length(); float twirlAngle = r / maxDistance * maxAngle; float angle = atan2( current.y, current.x ); Vec2f outSample( r * cos( angle + twirlAngle ), r * sin( angle + twirlAngle ) ); Vec2i out = outSample - current; outputIter.r() = inputIter.rClamped( out.x, out.y ); outputIter.g() = inputIter.gClamped( out.x, out.y ); outputIter.b() = inputIter.bClamped( out.x, out.y ); } } } ■追加ライブラリ? CinderISO ■Cinderについて有用なサイト http://www.creativeapplications.net/tutorials/images-in-cinder-tutorials-cinder/ http://research.preferred.jp/2010/11/cinder-on-ipad/
writing...