参考サイト3.2ですがその式を実装してしました///コメント部のコードです。なぜ数値が0.0いくつかという数字時なるのでしょうか?またクォータニオンの計算式は数式上での説明が多くプログラム上でどうなっているかわかりません**+という記号が引っかかるんですけどこれは数式上のものだと考えました。**
座標系は画面の左下が0で上、右がプラスになる座標系です。
※座標ではなく向きということは理解しています
参考サイト: https://kamino.hatenablog.com/entry/rotation_expressions#sec2_1
#include "stdio.h" #include "math.h" class Position { public: float x; float y; float z; public: Position(float xx = 0, float yy = 0, float zz = 0) { x = xx; y = yy; z = zz; } //掛け算 Position operator* (Position pos) { this->x = pos.x * this->x; this->y = pos.y * this->y; this->z = pos.z * this->z; return *this; } //掛け算 Position operator- (Position pos) { this->x = this->x - pos.x; this->y = this->y - pos.y; this->z = this->z - pos.z; return *this; } static Position Cross(Position a,Position b) { Position temp; temp.x = a.y * b.z - a.z * b.y; temp.y = a.z * b.x - a.x * b.z; temp.z = a.x * b.y - a.y * b.x; return temp; } static float Dot(Position a,Position b) { float t = (a.x * a.x) + (a.y * a.y); return t; } }; //ベクトルの大きさを出す float Vector_scalar(Position p); float Vector_scalar(Position p) { float r = (p.x * p.x) + (p.y * p.y) + (p.z * p.z); return r; } //スケール変換 void Scale_change(float Sx,float Sy,float Sz,float pos_x,float pos_y,float pos_z); void Scale_change(float Sx,float Sy,float Sz, float pos_x,float pos_y,float pos_z){ //Scale行列 float ScaleMatrix[4][4] = { {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,1}, }; //行列に大きさを設定 ScaleMatrix[0][0] = Sx; ScaleMatrix[1][1] = Sy; ScaleMatrix[2][2] = Sz; //座標を行列に設定 float position[4]; position[0] = pos_x; position[1] = pos_y; position[2] = pos_z; position[3] = 1; float t = 0; t = (position[0] * ScaleMatrix[0][0]) + (position[1] * ScaleMatrix[0][1]) + (position[2] * ScaleMatrix[0][2]) + (position[3] * ScaleMatrix[0][3]); printf("%f\n",t); t = (position[0] * ScaleMatrix[1][0]) + (position[1] * ScaleMatrix[1][1]) + (position[2] * ScaleMatrix[1][2]) + (position[3] * ScaleMatrix[1][3]); printf("%f\n",t); t = (position[0] * ScaleMatrix[2][0]) + (position[1] * ScaleMatrix[2][1]) + (position[2] * ScaleMatrix[2][2]) + (position[3] * ScaleMatrix[2][3]); printf("%f\n",t); t = (position[0] * ScaleMatrix[3][0]) + (position[1] * ScaleMatrix[3][1]) + (position[2] * ScaleMatrix[3][2]) + (position[3] * ScaleMatrix[3][3]); printf("%f\n",t); } class Quaternion { public: float x; float y; float z; float w; public: Quaternion(float xx = 0,float yy = 0,float zz = 0, float ww = 0) { x = xx; y = yy; z = zz; w = ww; } }; int main() { Position s(1,1,0);//今の方向 Position p(-1,1,0);//新しい方向ベクトル Position newFacing;//新しい座標に向かうベクトルを計算して正規化 Position t = p - s; float len = sqrt(Vector_scalar(t)); newFacing.x = t.x / len; newFacing.y = t.y / len; newFacing.z = t.z / len; printf("方向ベクトル x: %f\n",newFacing.x); printf("方向ベクトル y: %f\n",newFacing.y); printf("方向ベクトル z: %f\n\n",newFacing.z); Position pa = Position::Cross(Position(0,0,1),newFacing); float sp = sqrt(Vector_scalar(pa)); Position a;//回転軸 a.x = pa.x / sp; a.y = pa.y / sp; a.z = pa.z / sp; float r = acos( Position::Dot(Position(0,0,1),newFacing) ); printf("回転軸 x: %f\n",a.x); printf("回転軸 y: %f\n",a.y); printf("回転軸 z: %f\n\n",a.z); printf("回転角 θ: %f\n",r); Quaternion q; q.w = cos(r / 2); q.x = newFacing.x * cos( r / 2); q.y = newFacing.y * sin(r / 2); q.z = newFacing.z * sin(r / 2); ////////////////////////////////////////////////////////// printf("q w: %f\n",q.w); printf("q x: %f\n",q.x); printf("q y: %f\n",q.y); printf("q z: %f\n",q.z); ///////////////////////////////////////////////////////// return 0; }
> なぜ数値が0.0いくつかという数字時なるのでしょうか?
いくつになってほしかったんですか?
> またクォータニオンの計算式は数式上での説明が多くプログラム上でどうなっているかわかりません
質問はなんですか? わりと書けてると思いますが。
> ※座標ではなく向きということは理解しています
何がです?
このプログラムは現在の向き(s)から向きたい座標(p)に向かって向きたい向き?が知りたいのでその数値がこんな数値のはずない。と感じましたどうなのでしょうか?
ご自身で「?」をつけているように、「向かって向きたい向き」とかわけのわからん量ではありません。
回転軸と回転量を定義どおりに計算した値が回転を表すクォータニオンです。
回答1件
あなたの回答
tips
プレビュー