22 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
23 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr,
26 kColorBody(GetColor(23, 58, 235)),
27 kColorLeg(GetColor(23, 58, 235)),
28 kColorLiftedLeg(GetColor(240, 30, 60)),
29 kColorJoint(GetColor(100, 100, 200)),
30 kColorLiftedJoint(GetColor(200, 100, 100)),
31 kColorLegBase(GetColor(100, 200, 100)),
32 kColorErrorText(GetColor(32, 32, 32)),
33 kColorErrorJoint(GetColor(180, 180, 64)),
38 converter_ptr_(converter_ptr),
39 calculator_ptr_(calculator_ptr),
40 display_quality_(display_quality)
50 if (!calculator_ptr_) {
return; }
52 draw_joint_state_ = calculator_ptr_->CalculateAllJointState(node);
63void PhantomXRendererSimple::DrawHexapodNormal()
const
66 std::array<VECTOR, HexapodConst::kLegNum> vertex;
71 converter_ptr_->ConvertLegToGlobalCoordinate(
72 draw_joint_state_[i].joint_pos_leg_coordinate[0],
93 if (draw_joint_state_[i].joint_pos_leg_coordinate.size() != 4) {
continue; }
94 if (draw_joint_state_[i].joint_angle.size() != 3) {
continue; }
97 for (
int j = 0; j < 3; j++)
100 converter_ptr_->ConvertLegToGlobalCoordinate(
101 draw_joint_state_[i].joint_pos_leg_coordinate[j],
110 converter_ptr_->ConvertLegToGlobalCoordinate(
111 draw_joint_state_[i].joint_pos_leg_coordinate[j + 1],
119 if (draw_joint_state_[i].is_in_range)
121 DrawCapsule3D(start, end, kLegRadius, kCapsuleDivNum, kLegBaseColor, kLegBaseColor, TRUE);
125 DrawCapsule3D(start, end, kLegRadius, kCapsuleDivNum, kColorErrorJoint, kColorErrorJoint, TRUE);
131 for (
int j = 0; j < 4; j++)
133 unsigned int color = kJointColor;
140 converter_ptr_->ConvertLegToGlobalCoordinate(
141 draw_joint_state_[i].joint_pos_leg_coordinate[j],
149 DrawSphere3D(pos, kJointRadius, kSphereDivNum, color, color, TRUE);
static constexpr int kLegNum
static constexpr bool IsValidCoxaAngle(const int leg_index, const float angle)
第1関節の角度が有効な範囲内かどうかを判定する.
static constexpr float kBodyHeight
static constexpr bool IsValidFemurAngle(const float angle)
第2関節の角度が有効な範囲内かどうかを判定する.
static constexpr bool IsValidTibiaAngle(const float angle)
第3関節の角度が有効な範囲内かどうかを判定する.
PhantomXRendererSimple(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr, DisplayQuality display_quality)
void Draw() const override
描画処理を行う. const 関数にしているのは, 描画処理の中でメンバ変数を変更しないようにするため.
void SetNode(const RobotStateNode &node) override
ノードをセットする.
VECTOR ConvertToDxlibVec(const Vector3 &vec)
Dxlibの座標を示すVECTORと,このプログラムで使用しているVectorを変換する. ロボット座標系は右手座標系, Dxlibは左手座標系(工学は右手・ゲームライブラリは左手が多い)なのでyを...
void DrawHexagonalPrism(const std::array< VECTOR, 6 > &vertex, const float height, const unsigned int color)
3D空間に六角柱を描画する.
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
DisplayQuality
描画の品質設定を示す列挙体.
グラフ構造のためのノード(頂点).旧名 LNODE
std::array< Vector3, HexapodConst::kLegNum > leg_pos
[4 * 3 * 6 = 72 byte] 脚先の座標.(coxa(脚の付け根)を原点とする)
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
std::array< Vector3, HexapodConst::kLegNum > leg_reference_pos