24 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
25 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr) :
26 converter_ptr_(converter_ptr),
27 calculator_ptr_(calculator_ptr),
36 if (calculator_ptr_ ==
nullptr) {
return; }
38 draw_joint_state_ = calculator_ptr_->CalculateAllJointState(node);
59void PhantomXMkIIRendererModel::DrawBody()
const
64 if (body_model_handle == -1)
66 printfDx(
"モデルの読み込みに失敗しました.(body_model_handle)");
69 const VECTOR scale = VGet(10.f, 10.f, 10.f);
72 MV1SetScale(body_model_handle, scale);
75 MV1SetRotationMatrix(body_model_handle,
80 MV1DrawModel(body_model_handle);
84 const float sphere_radius = 30.f;
85 const int sphere_div_num = 16;
86 const unsigned int sphere_color = GetColor(255, 0, 0);
87 const unsigned int spec_color = GetColor(255, 255, 255);
89 DrawSphere3D(sphere_pos, sphere_radius, sphere_div_num, sphere_color, spec_color, TRUE);
92void PhantomXMkIIRendererModel::DrawCoxaLink(
const int leg_index)
const
96 if (coxa_model_handle == -1)
98 printfDx(
"モデルの読み込みに失敗しました.(coxa_model_handle)");
101 if (draw_joint_state_[leg_index].joint_pos_leg_coordinate.size() != 4)
105 if (draw_joint_state_[leg_index].joint_angle.size() != 3)
111 const VECTOR scale = VGet(10.f, 10.f, 10.f);
114 converter_ptr_->ConvertLegToGlobalCoordinate(
121 MV1SetScale(coxa_model_handle, scale);
126 MV1SetPosition(coxa_model_handle, coxa_joint_pos_global);
128 MV1DrawModel(coxa_model_handle);
131void PhantomXMkIIRendererModel::DrawFemurLink(
const int leg_index)
const
135 if (thign_model_handle == -1) { printfDx(
"モデルの読み込みに失敗しました.(thign_model_handle)"); }
137 if (draw_joint_state_[leg_index].joint_pos_leg_coordinate.size() != 4) {
return; }
138 if (draw_joint_state_[leg_index].joint_angle.size() != 3) {
return; }
141 const VECTOR scale = VGet(10.f, 10.f, 10.f);
144 converter_ptr_->ConvertLegToGlobalCoordinate(
147 const float coxa_angle = draw_joint_state_[leg_index].joint_angle[0];
148 const float femur_angle = draw_joint_state_[leg_index].joint_angle[1];
154 const Quaternion thign_def_quat =
166 MV1SetScale(thign_model_handle, scale);
172 MV1SetPosition(thign_model_handle, femur_joint_pos_global_coord + offset_pos);
174 MV1DrawModel(thign_model_handle);
177void PhantomXMkIIRendererModel::DrawTibiaLink(
const int leg_index)
const
186 if (tibia_model_handle == -1)
188 printfDx(
"モデルの読み込みに失敗しました.(tibia_model_handle)");
191 if (draw_joint_state_[leg_index].joint_pos_leg_coordinate.size() != 4)
195 if (draw_joint_state_[leg_index].joint_angle.size() != 3)
201 const VECTOR scale = VGet(0.01f, 0.01f, 0.01f);
204 converter_ptr_->ConvertLegToGlobalCoordinate(
207 const float coxa_angle = draw_joint_state_[leg_index].joint_angle[0];
209 const float femur_angle = draw_joint_state_[leg_index].joint_angle[1];
211 const float tibia_angle = draw_joint_state_[leg_index].joint_angle[2];
213 const Quaternion default_quat =
226 MV1SetScale(tibia_model_handle, scale);
232 MV1SetPosition(tibia_model_handle, tibia_joint_pos_global_coord + offset_pos);
234 MV1DrawModel(tibia_model_handle);
237void PhantomXMkIIRendererModel::DrawJointAxis(
const int leg_index)
const
239 if (draw_joint_state_[leg_index].joint_pos_leg_coordinate.size() != 4)
243 if (draw_joint_state_[leg_index].joint_angle.size() != 3)
248 const float axis_length = 100.f;
249 const float axis_radius = 2.f;
250 const int axis_div_num = 16;
252 const unsigned int coxa_axis_color = GetColor(0, 0, 255);
253 const unsigned int femur_axis_color = GetColor(0, 255, 0);
254 const unsigned int tibia_axis_color = femur_axis_color;
255 const unsigned int spec_color = GetColor(255, 255, 255);
257 const float coxa_angle = draw_joint_state_[leg_index].joint_angle[0];
262 converter_ptr_->ConvertLegToGlobalCoordinate(
268 DrawCapsule3D(coxa_joint_pos_global_coord - axis_vec, coxa_joint_pos_global_coord + axis_vec, axis_radius, axis_div_num, coxa_axis_color, spec_color, TRUE);
274 converter_ptr_->ConvertLegToGlobalCoordinate(
282 DrawCapsule3D(femur_joint_pos_global_coord - axis_vec, femur_joint_pos_global_coord + axis_vec, axis_radius, axis_div_num, femur_axis_color, spec_color, TRUE);
288 converter_ptr_->ConvertLegToGlobalCoordinate(
296 DrawCapsule3D(tibia_joint_pos_global_coord - axis_vec, tibia_joint_pos_global_coord + axis_vec, axis_radius, axis_div_num, tibia_axis_color, spec_color, TRUE);
static constexpr int kLegNum
int GetModelHandle(const std::string &file_path)
Dxlibは3Dモデルを描画する際に,モデルのハンドルを指定する. モデルがまだ読み込まれていない場合は, モデルを読み込んでから,ハンドル番号を返す. すでに読み込みずみのモデルを読み込んだ場...
static constexpr float kCoxaBaseOffsetX
coxa linkの付け根までの長さ(上方向)[mm].
void Draw() const override
描画処理を行う. const 関数にしているのは, 描画処理の中でメンバ変数を変更しないようにするため.
PhantomXMkIIRendererModel(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr)
void SetNode(const RobotStateNode &node) override
ノードをセットする.
static ModelLoader * GetIns()
インスタンスを取得する. このクラスを継承したクラスは クラス名::getIns()-> の形式でメンバ関数を呼び出す.
void SetZBufferEnable()
デフォルトだと描画処理を書いた順に描画されるが, これをZバッファを使用して奥行きを考慮して描画するようにする. 毎フレーム実行する必要がある.
MATRIX ConvertToDxlibMat(const RotationMatrix3x3 &mat)
このプログラムで使用しているMatrixを, Dxlibの行列を示すMATRIXに変換する.
VECTOR ConvertToDxlibVec(const Vector3 &vec)
Dxlibの座標を示すVECTORと,このプログラムで使用しているVectorを変換する. ロボット座標系は右手座標系, Dxlibは左手座標系(工学は右手・ゲームライブラリは左手が多い)なのでyを...
constexpr T ConvertDegToRad(const T deg) noexcept
角度を [deg] から [rad] に変換する関数.
Vector3 RotateVector3(const Vector3 &vec, const EulerXYZ &rot)
回転させたベクトルを返す.三角関数の処理が多く重たいので注意.
RotationMatrix3x3 ToRotationMatrix(const Quaternion &q)
クォータニオンから回転角行列への変換.
static Quaternion MakeByAngleAxis(float rad_angle, const Vector3 &axis)
回転軸と回転角からクォータニオンを作成する. q = cos(θ/2) * w + sin(θ/2) * { v.x + v.y + v.z } となる. ノルムは必ず1になる.
constexpr Quaternion ToLeftHandCoordinate() const noexcept
左手座標系への変換を行う. 言うまでもないが,機械工学では通例右手座標系を使う. しかし,dxlib は左手座標系なので,dxlib で描画するときは, この関数を使って左手座標系に変換する必要があ...
グラフ構造のためのノード(頂点).旧名 LNODE
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
static constexpr Vector3 GetUpVec() noexcept
上に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetUpVec() と呼び出せる.
static constexpr Vector3 GetFrontVec() noexcept
正面に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetFrontVec() と呼び出せる.
static constexpr Vector3 GetLeftVec() noexcept
左に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetLeftVec() と呼び出せる.