fwadrogic tek

主にプログラミングや開発ログなどを中心にお送りします

ぶれいんふぁっくでHello, world!

な、なんなんだー!!と思いそうですがこれでHello, world!が出てくるみたいです。初見のときになにこれ魔術!?とか思っちゃいましたが仕様見たら意外と分からなくもなさそう。

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<
++++++++.--------.+++.------.--------.>+.

codeiqにそんな問題があったのでメモ。


+++++++++

ここでptr[0]が9になる。後のループのイテレータになる模様

[>++++++++>+++++++++++>+++++<<<-]

ptr[1]+=8,ptr[2]+=11,ptr[3]+=5を9回繰り返している。最終的には'H','c',45が入る。
ああそういうことか、制御文字らへん用と大文字らへん用と小文字らへんを用の値に分けとけば

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.

みたいにコードが長くならずに済むってことなんですね。

あとは'e'に7足して'l'を2つ出力して・・・・という感じでASCII文字コード見て頑張って書けばよさそうです。コードゴルフやったら面白そうな言語ですねw

DirectX11のチュートリアルサイトでつまづいたこと

RasterTek(http://www.rastertek.com/tutdx11.html)というDirectX11を学ぶのに良さそうなサイトがあったので、つまづいたところをメモ。

Could not initialize Direct3Dと表示されてしまう。

これは今自分が使ってるグラフィックボードがDirectX11に対応していないため。
http://pc.watch.impress.co.jp/docs/topic/spec/gpu_spec.html
ここを見ると最低でもGeForce GT 430/Radeon HD 5450クラスのボードが必要みたいです(;´Д`)
というわけで解決法その一。

CPUに処理してもらう。

d3dclass.cppの205行目付近にデバイスとスワップチェインを作成するところがあります。以下のコードを見てください

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

D3D11CreateDeviceAndSwapChain()関数の第2引数をD3D_DRIVER_TYPE_REFERENCEにすると、すべての描画処理をCPUに託すことができます。(参考:http://www.gamedev.net/topic/635168-could-not-initialize-direct3d/)

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

ただし、このモードにすると処理速度が1000分の1くらいまでガタ落ちするんですね。。。そこでDirectX10.1までの機能制限付きでもっと高速にする方法が次。

WARPデバイスを作る。

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

第2引数をD3D_DRIVER_TYPE_WARPに変えるだけです。ちなみに僕はこれを解消するだけで丸1日かかりました\(^o^)/
参考: http://wlog.flatlib.jp/item/1220

Microsoft Kinect v2がデベロッパー向けに限定販売してる模様です

マイクロソフト、「Kinect for Windows v2」を日本でも開発者向けに販売 -INTERNET Watch
Xbox Oneの新Kinectは大幅進化、表情や心拍も認識。6人同時に全身キャプチャ - Engadget Japanese


開発者限定で約20kでMicrosoftから直販で買えるようです。形状が大きく変わってカメラらしいカメラは左側にある1つだけ・・・?なんだかスッキリして前よりもスタイリッシュなっているような気がする。

音声、深度、カラーに続く4番目のセンシング機能として、アクティブIR(赤外線)も実装された。

ということですが「アクティブIR」とはなんなんだ!?!?ということで調べたら、RGBカメラとこれを併用すると心拍数や脈拍が測れるらしい。脈拍が上がるにつれてレティクルがずれるFPSとかあったら面白そう。

・ハードウェア・ソフトウェアの強化により、骨格認識の精度が向上。指や手首まで認識できる(どこまで認識するかは距離による)。

これなんかもすごい。今までは指のセンシングはRGBカメラからのOpenCVでしか得られなかったはずですが(それかLeap Motionを使う)、それがKinectだけで完結できるようになると思っても良さそうですかね。認識距離制限がどのへんまで来るかは置いといて。たまげました。

他にもいろいろ機能追加あり。これは欲しい! 以前Kinectを少しいじったことがあるのですが、古い方のKinectは、ポーズの検出はそれなりにやってくれるようには思います。例えばゲーセンにダンスエボリューションというダンスゲームがありますが、あれはポージングと簡単なジェスチャーで構成されてたはずです。しかし複雑なジェスチャーはノイズが大きさゆえか若干読み取りづらさがあって、実現には至らなかったのでしょう・・・(?)そんなわけでもしKinect v2買ったらそのジェスチャーの感度を真っ先に確認したいところであります。(けど金がない><)開発にはwin8が必要らしい。僕は7しか持ってないのでまずは新しいPCを買わねば・・・\(^o^)/(14/07/28追記)

ゲームプログラミング:シーン遷移のテンプレ

スマートポインタ
・unique_ptrは、プログラムがunique_ptrが存在しているスコープを抜けた時に自動的にdeleteしてくれる賢いやつ。万一ゲームループ中で例外が起こってもだいじょうぶ!そして、その名の通りuniqueであるからpTmp = pState;みたいなことはできない。これによって開放されたメモリ領域の参照によるセグフォがおそらくなくなるんでしょう。
仕様
・IStateは状態のInterfaceという意味で、各シーンのクラスの基底クラス
・Applicationはシーンの状態名のenum
・DXライブラリ使ってる跡が見えます
・なぜかFpsクラスのDrawメソッドだけ頭文字Dが大文字できもちわるい
・大規模化したらswitch~caseどーなるの状態

std::unique_ptr<IState> pState(new Title);
if (pApp->init()) EXIT();

/* ゲームループ */
while (ScreenFlip() == 0 && 
       ProcessMessage() == 0 && 
       ClearDrawScreen() == 0 && 
       CheckHitKey(KEY_INPUT_ESCAPE) == 0){
  fps.Update();
  pState->update();
  pState->draw();
  fps.Draw();
  if (pState->next() != Application::NoChange){
    switch (pState->next()){
    case Application::Title:
      pState.reset(new Title);
      break;
    case Application::Stage1:
      pState.reset(new Stage1);
      break;
    }
    if (pState->init()) DxLib_End();
  }
  fps.Wait();
}

ベジェ曲線で真円は描けない不思議

最近知りました。

そうだったんですね。気になったので調べてみると

wikipedia先生によるとベジェ曲線

N 個の制御点から得られる N - 1 次曲線である。

 とのことです。

円を書くときは4つ上下左右の点を打って書くから3次曲線が描かれるってことか。

gnuplotでグラフ作成してみました(^ω^)

 

f:id:fwadro:20140716011805p:plain

第1象限を見てみるとわかりますがベジェで描かれる円が上の3乗のグラフとするとだいぶデカ目の円になるんですね。一応比較で2.5乗と4乗も載せてみました。

( ・∀・)つ〃∩ ヘェーヘェーヘェー

 

終わり

 

※このsqrt(1-x^2)というグラフ、gnuplot立ち上げ直後のデフォルトのままだとサンプルの数が少なすぎてx=1付近のグラフが切れてしまいます。。これはgnuplotの名前通りグラフの点をプロットしてそれを折れ線グラフのように繋げてるだけなのでそれによるもののようです。

set samples 100000

 などしてなめらかにすれば綺麗に出てくる。