とりあえず日記

2016-01-08 あけましておめでとうございます。

あけましておめでとうございます。

本業が忙しいため日記は放置気味ですが管理はしています。

昨年はノートPCをLenovo T540Pへ更新しましたが、トラブルが多く困り気味です。

以上、生存報告でした。


レノボ・ジャパン 20BE00BHJP ThinkPad T540p

レノボ・ジャパン 20BE00BHJP ThinkPad T540p

2015-06-06

OmniSharpServer備忘録

自分用の備忘録

exeの生成

https://github.com/OmniSharp/omnisharp-server

コマンドラインからexeを作成する。

omnisharp.exe --help

Usage: omnisharp [-s /path/to/sln] [-p PortNumber]

Options:
  -s, --solution=VALUE       The path to the solution file
  -p, --port=VALUE           Port number to listen on
  -c, --client-path-mode=VALUE
                             The path mode of the client (Cygwin, Windows or
                               Unix)
  -v, --verbose=VALUE        Output debug information (Quiet, Debug, Verbose)
  -h, --help                 Show this message and exit
      --pid, --hostPID=VALUE The processId of the editor to watch
      --config=VALUE         The path to the server config.json file

2015-04-24 Euler angle(xyz/zxy/xzy/yxz/yzx/zyx) to quaternion.

Euler angle(xyz/zxy/xzy/yxz/yzx/zyx) to quaternion.

オイラーの各軸(X/Y/Z軸)からクォータニオンへ変換する。

void	XToQuaternion(Quaternion& q, float  x){
	q.x = sin(x * 0.5f);
	q.y = 0.0f;
	q.z = 0.0f;
	q.w = cos(x * 0.5f);
};

void	YToQuaternion(Quaternion& q, float  y){
	q.x = 0.0f;
	q.y = sin(y * 0.5f);
	q.z = 0.0f;
	q.w = cos(y * 0.5f);
};

void	ZToQuaternion(Quaternion& q, float  z){
	q.x = 0.0f;
	q.y = 0.0f;
	q.z = sin(z * 0.5f);
	q.w = cos(z * 0.5f);
};

数式は「実例で学ぶゲーム3D数学」を参照。

実例で学ぶゲーム3D数学

実例で学ぶゲーム3D数学

Euler angle(xyz/zxy/xzy/yxz/yzx/zyx) to quaternion.

void	XYZToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cy*cz*sx-cx*sy*sz;
	q.y=cy*sx*sz+cx*cz*sy;
	q.z=cx*cy*sz-cz*sx*sy;
	q.w=sx*sy*sz+cx*cy*cz;
};


void	ZXYToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cx*sy*sz+cy*cz*sx;
	q.y=cx*cz*sy-cy*sx*sz;
	q.z=cx*cy*sz-cz*sx*sy;
	q.w=sx*sy*sz+cx*cy*cz;
};


void	XZYToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cx*sy*sz+cy*cz*sx;
	q.y=cy*sx*sz+cx*cz*sy;
	q.z=cx*cy*sz-cz*sx*sy;
	q.w=cx*cy*cz-sx*sy*sz;
};


void	YXZToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cy*cz*sx-cx*sy*sz;
	q.y=cy*sx*sz+cx*cz*sy;
	q.z=cx*cy*sz+cz*sx*sy;
	q.w=cx*cy*cz-sx*sy*sz;
};


void	YZXToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cy*cz*sx-cx*sy*sz;
	q.y=cx*cz*sy-cy*sx*sz;
	q.z=cx*cy*sz+cz*sx*sy;
	q.w=sx*sy*sz+cx*cy*cz;
};


void	ZYXToQuaternion(Quaternion& q, float  x, float  y, float  z){
	float cx = cos(x * 0.5f);
	float cy = cos(y * 0.5f);
	float cz = cos(z * 0.5f);
	float sx = sin(x * 0.5f);
	float sy = sin(y * 0.5f);
	float sz = sin(z * 0.5f);

	q.x=cx*sy*sz+cy*cz*sx;
	q.y=cx*cz*sy-cy*sx*sz;
	q.z=cx*cy*sz+cz*sx*sy;
	q.w=cx*cy*cz-sx*sy*sz;
};

数式の導出

Euler angle(xyz/zxy/xzy/yxz/yzx/zyx)からクォータニオンへ変換する数式は、wxMaximaで導出しています。

qmul(l,r) := [
l[1]*r[4] + l[4]*r[1] + l[2]*r[3] - l[3]*r[2] ,
l[2]*r[4] + l[4]*r[2] + l[3]*r[1] - l[1]*r[3] ,
l[3]*r[4] + l[4]*r[3] + l[1]*r[2] - l[2]*r[1] ,
l[4]*r[4] - l[1]*r[1] - l[2]*r[2] - l[3]*r[3] ];

qx:[sx  ,0      ,0      ,cx];
qy:[0       ,sy ,0      ,cy];
qz:[0       ,0      ,sz ,cz];

printf(false,"==== xyz ====");
xyz:qmul(qmul(qz,qy),qx);

printf(false,"==== zxy ====");
zxy:qmul(qmul(qy,qx),qz);

printf(false,"==== xzy ====");
xzy:qmul(qmul(qy,qz),qx);

printf(false,"==== yxz ====");
yxz:qmul(qmul(qz,qx),qy);

printf(false,"==== yzx ====");
yzx:qmul(qmul(qx,qz),qy);

printf(false,"==== zyx ====");
zyx:qmul(qmul(qx,qy),qz);

f:id:ohtorii:20150524220109p:image:w640


リンク

Euler から Quaternion へ変換する数式など。

Maths - Conversion Euler to Quaternion - Martin Baker

2015-03-24

wxMaximaでクォータニオンの積を計算する。

wxMaxima version

/* quaternion qmul(quaternion l, quaternion r);
*/
qmul(l,r) := [ l[1]*r[4] + l[4]*r[1] + l[2]*r[3] - l[3]*r[2] ,
               l[2]*r[4] + l[4]*r[2] + l[3]*r[1] - l[1]*r[3] ,
               l[3]*r[4] + l[4]*r[3] + l[1]*r[2] - l[2]*r[1] ,
               l[4]*r[4] - l[1]*r[1] - l[2]*r[2] - l[3]*r[3] ];

q1:[x,y,z,w];
q2:[0,0,0,1];

/* ans = q1 * q2; 
*/
ans:qmul(q1,q2);

f:id:ohtorii:20150524135025p:image:w640

C++ version

元になったクォータニオンの積は以下コード。

class Quaternion{
public:
    float x,y,z,w;

    inline void Mul(const Quaternion& r) {
        Quaternion result;
        result->x = x*r.w + w*r.x + y*r.z - z*r.y;
        result->y = y*r.w + w*r.y + z*r.x - x*r.z;
        result->z = z*r.w + w*r.z + x*r.y - y*r.x;
        result->w = w*r.w - x*r.x - y*r.y - z*r.z;
        *this = result;
    }
}

2015-01-25

遅くなりましたが、おけおめ。

本業が忙しくブログは放置気味ですが、

マクロバグや要望があればお気軽にお問い合わせ下さい。

では。