質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1671閲覧

自機の方向を回転させるための式でプログラムでの計算式が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/09/04 04:34

編集2020/09/04 04:36

参考サイト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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/09/04 05:14 編集

> なぜ数値が0.0いくつかという数字時なるのでしょうか? いくつになってほしかったんですか? > またクォータニオンの計算式は数式上での説明が多くプログラム上でどうなっているかわかりません 質問はなんですか? わりと書けてると思いますが。 > ※座標ではなく向きということは理解しています 何がです?
退会済みユーザー

退会済みユーザー

2020/09/04 05:46

このプログラムは現在の向き(s)から向きたい座標(p)に向かって向きたい向き?が知りたいのでその数値がこんな数値のはずない。と感じましたどうなのでしょうか?
ozwk

2020/09/04 05:51

ご自身で「?」をつけているように、「向かって向きたい向き」とかわけのわからん量ではありません。 回転軸と回転量を定義どおりに計算した値が回転を表すクォータニオンです。
guest

回答1

0

ベストアンサー

なぜ数値が0.0いくつかという数字時なるのでしょうか?

cosとかsinが入ってますね?これらの絶対値は1以下です。
それらに回転軸の成分を掛けたりしますね?回転軸は単位ベクトルにしてありますから成分は1以下です。
なので回転を表すクォータニオンの各成分の大きさは1以下です。


  • 回転は回転軸と回転角度で表すことができる
  • 回転軸と回転角度をアレやコレや計算して求めるのが回転を表すクォータニオン
  • なんのためにそんな訳のわからん量を計算するのかというと、その後の取り扱いが楽だから

投稿2020/09/04 06:07

ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/04 07:00

質問ですがこれでスケール、回転は実装されていますでしょうか?w
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問