読者です 読者をやめる 読者になる 読者になる

ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

windows + google日本語入力 環境で全角/半角切り替えを Ctrl+Space にする

windows トラブルシューティング

この記事は

以下の環境下で 全角/半角切り替え を Alt+` から Ctrl + Space に切り替える方法のメモです。

続きを読む

SAKURAスキップ(NU-Pan)

正社員は給料を安くするための法の抜け穴だってそれ一番言われてるから


f:id:NU_Pan:20160917153941p:plain

続きを読む

C90ですよ!(DREAMING WITH YOU)

やりました


f:id:NU_Pan:20160811160614j:plain

3日目 西-q42 だぞ!

ラーメン部のアルバムにDREAMING WITH YOUという曲で参加しました。
な、なんと! BPM128のエレクトロポップと、それを原曲とするセルフリミックスの同時リリースだぁ! うひょー!

曲のほうは、可愛いメイドさんがかわいい感じの曲です。NIGHTLYなのは突貫作業で徹夜で編曲を仕上げたからです。正直すまんかったと思ってる。歌詞が難産だったんや…。
ボーカルはミクさんにお願いしました。えへへ。

続きを読む

右手系と左手系と回転の話

TODO

まぎらわしいよね

 3次元の回転行列とクォータニオンオイラー角の3つの話でもすでにめんどくさいのにそれに右手系と左手系の話が入ってくるともう脳細胞の活動が止まって気持ちええんじゃ。ということで、ここらへんのよく知られている事実をまとめてみようと思います。

右手系と左手系の違い

X軸とY軸が同じ向きで、Z軸だけが逆を向いている、とする。

行列・ベクトルの積については

  • <右手系>列ベクトルに左から行列をかける
  • <左手系>行ベクトルに右から行列をかける

とする。

右からかける系と左からかける系の相互変換

行列を転置すればOK

TODO : くわしく

回転行列の逆行列は転置行列

回転行列は転置で逆行列が求まります。正確には「逆行列=転置行列」を満たす行列を直交行列と言って、回転行列はこの条件をみたします。
また、直交行列は

  • <右手系>各列のベクトルは互いに直交
  • <左手系>各行のベクトルは互いに直交

という性質を持ちます。

回転行列は基底ベクトルのあつまり

  • <右手系> 回転行列の各列のベクトルは回転後の座標系の基底ベクトル
  • <左手系> 回転行列の各行のベクトルは回転後の座標系の基底ベクトル

「ほげほげ座標系の基底ベクトル」というのはほげほげ座標系の各軸に沿う方向ベクトルのことです。
3次元の回転行列だと、回転後のXYZ軸に沿う3本の単位ベクトルのことで、この3つのベクトルは互いに直交します。
そして、互いに直交する3つの単位ベクトルの場合、基本ベクトルと呼びます。

つまり、何らかの姿勢が基本ベクトルで与えられたとき、それは姿勢を表す回転行列を与えられたのと同義。その逆も同様。

位置ベクトルの右手系<->左手系相互変換

Z要素の符号を反転すればよい。

回転行列の右手系<->左手系相互変換

  • <右手系> 回転行列の3列目の符号を反転する
  • <左手系> 回転行列の3行目の符号を反転する

「Z軸基本ベクトルを反転する」と覚えればよいでしょう。

オイラー角の逆変換

X軸でx度->Y軸でy度->Z軸でz度の順番で回転させたときの逆変換は
Z軸で-z度->Y軸で-y度->X軸で-x度の順番。
回転をかける順番を逆にして、回転角度の符号を反転させる必要がある。
このとき、回転角度が(-180, +180)の範囲でなければならないことに注意。

std::numeric_limits<float>::min()について重大な思い違いをしていた話

C++ Tips

何があった

線形探索で最大値を探すコードを書いていた。
簡単化するとこんな感じ。

using namespace std;

float FindMax(const vector<float>& source)
{
	float max = numeric_limits<float>::min();	// floatの最小値で初期化してるつもり
	for(const auto& value : source)
	{
		if( max < value )
		{
			max = value; //maxは最小値で初期化してるから必ず一度はここを通るはず
		}	
	}
	return max;
}

でも動かしてみるとなんだか挙動がおかしい。
なんか負数しかないデータ列が来た時に一度もmaxが更新されない。
おかしいと思ってデバッガで初期値を見てみると「1.17549e-38」になってる。
よく見たら正の数なんですがそれは。

どういうことなのか

numeric_limit::min() は確かに「最小値」を返すんです。
でも浮動小数点に限っては「最小値」っていうのは「表現可能な中で絶対値的に最も小さい値」みたいなものを指してるんですね。
正確には「正の正規化数のうち最小のもの」みたいです。
なのでマイナスの絶対値がすごくでっかい値が帰ってくるわけではないんですね。

じゃあどうするのか

numeric_limits::lowest() を使いましょう。
こっちはちゃんと最小値を返してくれます。
ちなみに、qnan みたいな無効値で初期化すると max < value が必ず false と評価されるのでうまく行きません。

HIGH FREE SPIRITS(NU-Pan Makina Bootleg)

アニソンRemix やりました

みけちゃんパパ…

 その…お父さんみたいな…。

続きを読む