トップページ > 記事閲覧
クォータニオンによるプレイヤを中心にカメラ回転を実装したい。
名前:たそたん 日時: 2020/04/17 12:10

やりたいこと 「コンソール出力にて値を確認しています。 原点(0,0,0)を中心点とするクォータニオンによる回転はできるのですが中心点を原点とするクォータニオンによる回転の実装方法が 知りたいです。 上に移動することは出来ました?が 横に周回するときにtargetPosとcameraPosのY軸が値が違うときにY軸も動いてしまい動作がおかしいです。」 Vectorは三次元の座標です、Quaternionクラスはaが実部で三つは虚部(Vector)です,Vectorは自作クラスですcross,dotが関数として実装されていますが動作を確認したので正しいです。 #include "Vector.hpp" #include <iostream> using namespace std; #define PI_F 3.14159265358979323846264338327950288f /*単位化する関数*/ void normalize(Vector* v) { float magnitude = sqrt(Vector::dot(*v, *v)); v->x /= magnitude; v->y /= magnitude; v->z /= magnitude; } /*軸方向回転*/ Vector get_axis(Vector camera, Vector target,Vector y) { Vector rel = Vector( camera.x - target.x, camera.y - target.y, camera.z - target.z ); //Vector y = Vector(0, 1, 0); // Vector y = Vector(1, 0, 1); Vector n = Vector::cross(y, rel); normalize(&n); return n; } /*回転する座標、ラジアン、中心、軸*/ Vector rotate(Vector pos, const float ang, const Vector targetV, const Vector axis) { //Quaternion Prev(0, Vector(*x - mx, *y - my, *z - mz)); // Quaternion P(0, Vector(pos.x, pos.y, pos.z));//回転させる点 Quaternion P2(0, Vector(pos.x - targetV.x, pos.y - targetV.y, pos.z - targetV.z));//回転させる点 // Quaternion PP(0, Vector(targetV.x - pos->x, targetV.y - pos->y, targetV.z - pos->z));//回転させる点 // Quaternion PP3(0, Vector(targetV.x, targetV.y, targetV.z));//回転させる点 Quaternion Q(cos(ang / 2), Vector(axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2))); Quaternion R(cos(ang / 2), Vector(-axis.x * sin(ang / 2), -axis.y * sin(ang / 2), -axis.z * sin(ang / 2))); Quaternion result = (R * P2) * Q;//順番が大事 /* ofs << "pos.x:" << pos->x << std::endl; ofs << "pos.y:" << pos->y << std::endl; ofs << "pos.z:" << pos->z << "\n" << std::endl; ofs << "result.x:" << result.v.x << std::endl; ofs << "result.y:" << result.v.y << std::endl; ofs << "result.z:" << result.v.z << "\n\n\n" << std::endl; */ pos.x = result.v.x + targetV.x; pos.y = result.v.y + targetV.y; pos.z = result.v.z + targetV.z; return pos; } Vector cameraPos(-6, 20, -6.0f);//カメラ座標 //Vector targetPos(0, 5, 12.5f);//注視点座標 Vector targetPos(3, 5, 4);//注視点座標 //Vector targetPos(0,0,0);//注視点座標 const float ROTATE_SPEED = PI_F / 90;//回転スピード Vector v = cameraPos; int main() { printf("cemeraPos 初期座標: %.2f , %.2f , %.2f \n", cameraPos.x, cameraPos.y, cameraPos.z); for(int i = 0; i < 100; i++){ Vector axis = get_axis(v, targetPos,Vector(1,0,1)); v = rotate(v, ROTATE_SPEED, targetPos, axis); // v = rotate(v,ROTATE_SPEED,targetPos,Vector(0,-1,0)); printf("cameraPos 移動後座標: %d , %d , %d \n",(int)v.x, (int)v.y, (int)v.z); } int _ch = getchar(); return 0; }
メンテ

Page: 1 |

Re: クォータニオンによるカメラ回転を実装したい。 ( No.1 )
名前:Fizz 日時:2020/04/07 22:04

クォータニオンによる中心点を中心にラジアン度カメラを回転する視点移動を実装したい。 ttps://teratail.com/questions/251067 何故こっちへ?向こうの回答者さんは何か駄目ですか?
メンテ
Re: クォータニオンによるカメラ回転を実装したい。 ( No.2 )
名前:たそたん 日時:2020/04/08 10:23

意味が解決法がわからなかったためこっちを使いました。
メンテ
Re: クォータニオンによるカメラ回転を実装したい。 ( No.3 )
名前:kanamaru 日時:2020/04/08 14:42

質問者さんの意図がいまいちわからないのですが、 勘違いでなければ、 SetCameraPositionAndTarget_UpVecY SetCameraPositionAndTargetAndUpVec (違いがよくわからない…。) のどちらかを使えばクォータニオンを使わなくてもいいと思います。 wikipediaで球面座標系を調べてみてください。 上記関数を使うのに役立つ式が載っています。 勘違いだったらすいません。
メンテ
Re: クォータニオンによるプレイヤを中心にカメラ回転を実装したい。 ( No.4 )
名前:たそたん 日時:2020/04/09 16:08

int SetCameraPositionAndAngleを使えばできそうなので自己解決です。
メンテ
Re: クォータニオンによるプレイヤを中心にカメラ回転を実装したい。 ( No.5 )
名前:たそたん 日時:2020/04/17 13:34

今更ですが未解決です。
メンテ
Re: クォータニオンによるプレイヤを中心にカメラ回転を実装したい。 ( No.6 )
名前:名無三 日時:2020/04/18 01:54

普通にベクトルで計算すれば良いのでは無いでしょうか? VGet( cos(xrad)*sin(yrad), sin(xrad), cos(xrad)*cos(yrad) ); 自分は上の形しか使ったことがないのですが、これではダメなのですか?
メンテ
Re: クォータニオンによるプレイヤを中心にカメラ回転を実装したい。 ( No.7 )
名前:たそたん 日時:2020/04/18 20:14

もう少しでできそうなのでこのままのやり方でなんとか実現したいです ja.stackoverflow.com/questions/65364/%e3%82%af%e3%82%a9%e3%83%bc%e3%82%bf%e3%83%8b%e3%82%aa%e3%83%b3%e3%81%ab%e3%82%88%e3%82%8b%e4%b8%ad%e5%bf%83%e7%82%b9%e3%82%92%e4%b8%ad%e5%bf%83%e3%81%ab%e3%83%a9%e3%82%b8%e3%82%a2%e3%83%b3%e5%ba%a6%e3%82%ab%e3%83%a1%e3%83%a9%e3%82%92%e5%9b%9e%e8%bb%a2%e3%81%99%e3%82%8b%e8%a6%96%e7%82%b9%e7%a7%bb%e5%8b%95%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%97%e3%81%9f%e3%81%84/65650?noredirect=1#comment72026_65650
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存