参考サイトなどを見て計算式をプログラムに落とし込んだが何が原因でカメラが注視点を中心に回転しくれないのかわからない。”地球を中心に回る月のような月”
rotate();関数の引数は(座標,ラジアン,中心点,回転軸)ようになっています。"座標"を"中心点"を中心とした"回転軸"に"ラジアン"回転するということを目的としています。
質問1、rotate関数ですがクォータニオンの計算をしてカメラを回転させたいがクォータニオン同士の掛け算や
ベクトルの外積、内積の計算が正しいのか、注視点はいいのか?
質問2、"回転軸ベクトル"とは何をすれば算出されるのでしょうか?
質問3、どうすればクォータニオンによる中心点を中心にラジアン度 カメラ回転を実装できるのか知りたい。
やりたいこと 周回軌道のようなモン〇ンのような3アクションゲームのカメラのようなカメラ動作をしてほしい。
参考サイト1 : http://marupeke296.com/DXG_No10_Quaternion.html
参考サイト2 : http://marupeke296.com/COL_Basic_No1_InnerAndOuterProduct.html
参考サイト3 :https://home.hiroshima-u.ac.jp/kyoshida/MathExercise/2015(1stSemester)/exercise1(no03).pdf
以下rotete_x();関数部です。引数にカメラ座標と注視点座標とラジアンを入れて回転させる予定
/*回転 回転する座標、ラジアン、中心、軸*/ /*回転する座標、ラジアン、中心、軸*/ void Game::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; pos->y = result.v.y; pos->z = result.v.z; } void Game::Update() { /*カメラ回転*/ if (Input::keyboard(KEY_INPUT_LEFT) > 0) { // rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ,); } else if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { // rotate(&cameraX, &cameraZ, -ROTATE_SPEED, targetX, targetZ); } else if (Input::keyboard(KEY_INPUT_UP) > 0) { // rotate_X(&cameraX, &cameraY,&cameraZ, -ROTATE_SPEED, targetX, targetY,targetZ); DrawFormatString(100,100,GetColor(255,255,255),"UP"); } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { // rotate_X(&cameraX, &cameraY, &cameraZ, +ROTATE_SPEED, targetX, targetY, targetZ); DrawFormatString(100, 100, GetColor(255, 255, 255), "Down"); } if (Input::keyboard(KEY_INPUT_W) > 0) { } else if (Input::keyboard(KEY_INPUT_S) > 0) { } /*色 変更*/ if(Input::keyboard(KEY_INPUT_SPACE) == 1) { ModeChange = !ModeChange; } /* false spcカラーを変更*/ if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == false) { color_spc.r += -1; color_spc.g += -1; color_spc.b += -1; } else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == false) { color_spc.r += 1; color_spc.g += 1; color_spc.b += 1; /*true difカラー変更*/ }else if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == true) { color_dif.r += -1; color_dif.g += -1; color_dif.b += -1; } else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == true) { color_dif.r += 1; color_dif.g += 1; color_dif.b += 1; } if (Input::keyboard(KEY_INPUT_F1) == 1) { TextureMode = !TextureMode; } }
ヘッダー部
#ifndef ___Vector_H #define ___Vector_H //template<typename type> class Vector { private: public: float x; float y; float z; Vector(float xx, float yy, float zz); Vector(); static Vector cross(Vector a, Vector b);//外積 static float dot(Vector a, Vector b);//内積 static Vector mul_scalar(float a, Vector v);//スカラーとベクトルの掛け算 Vector operator = (Vector v); Vector operator + (Vector v); }; //template<typename type> class Quaternion { public: /*実部*/ float a; /*虚部*/ // Vector<type> v; Vector v; Quaternion(float aa, Vector vv); Quaternion(); Quaternion operator * (Quaternion t); }; #endif
ソースファイル
#include "Vector.hpp" /*ベクトル x スカラーの掛け算*/ Vector Vector::mul_scalar(float a, Vector v) { return Vector(a * v.x,a * v.y,a * v.z); } /*外積 ベクトル x ベクトル*/ Vector Vector::cross(Vector a,Vector b) { return Vector( (a.y * b.z) - (a.z * b.y), (a.z * b.x) - (a.x * b.z), (a.x * b.y) - (a.y * b.x)); } /*内積*/ float Vector::dot(Vector a, Vector b) { return (a.x * b.x) + (a.y * b.y) + (a.z * a.z); } /*コンストラクタ*/ Vector::Vector(float xx,float yy,float zz) { x = xx; y = yy; z = zz; } /*コンストラクタ*/ Vector::Vector() { x = 0.0f; y = 0.0f; z = 0.0f; } /*オペレーター = */ Vector Vector::operator = (Vector v) { this->x = v.x; this->y = v.y; this->z = v.z; return *this; } /*オペレーター + */ Vector Vector::operator + (Vector v) { Vector t; t.x = this->x + v.x; t.y = this->y + v.y; t.z = this->z + v.z; return t; } /*コンストラクタ 実部、虚部(Vector) */ Quaternion::Quaternion(float aa, Vector vv) { a = aa;//実部 /*虚部*/ v = vv; } /*コンストラクタ 引数なし*/ Quaternion::Quaternion() { a = 0.0f;//実部 /*虚部*/ v.x = 0.0f; v.y = 0.0f; v.z = 0.0f; } /*クォータニオン同士の掛け算 A = (a; U) B = (b; V) AB = (ab - U・V; aV + bU + U×V) */ Quaternion Quaternion::operator * ( Quaternion t ) { return Quaternion(this->a * t.a - Vector::dot(this->v,t.v),Vector(Vector::mul_scalar(this->a,t.v) + Vector::mul_scalar(t.a,this->v) + Vector::cross(this->v,t.v))); }
回答2件
あなたの回答
tips
プレビュー