23 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr) :
24 kMarginColor(GetColor(0, 255, 0)),
25 kMarginErrorColor(GetColor(255, 0, 0)),
27 converter_ptr_(converter_ptr)
36 std::vector<Vector3> polygon;
48 polygon.back() +=
Vector3{ 0, 0, 5 };
50 polygon_xy.
AddVertex(polygon.back().ProjectedXY());
52 polygon_sum += polygon.back();
57 const Vector3 center = polygon_sum /
static_cast<float>(polygon.size());
61 for (
size_t i = 0; i < polygon.size(); ++i)
63 const VECTOR poly[3] = {
69 SetDrawBlendMode(DX_BLENDMODE_ALPHA, kAlpha);
73 DrawTriangle3D(poly[0], poly[1], poly[2], kMarginColor, TRUE);
77 DrawTriangle3D(poly[0], poly[1], poly[2], kMarginErrorColor, TRUE);
81 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
89 DrawSphere3D(projected_center_pos, 5, 10, 10, GetColor(255, 255, 255), TRUE);
static constexpr int kLegNum
StabilityMarginRenderer(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr)
void Draw() const override
描画処理を行う. const 関数にしているのは, 描画処理の中でメンバ変数を変更しないようにするため.
VECTOR ConvertToDxlibVec(const Vector3 &vec)
Dxlibの座標を示すVECTORと,このプログラムで使用しているVectorを変換する. ロボット座標系は右手座標系, Dxlibは左手座標系(工学は右手・ゲームライブラリは左手が多い)なのでyを...
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
bool IsInside(const Vector2 &point) const
点が多角形の内部にあるかどうか調べる関数. 多角形が凸でない場合は正しく判定できない.
constexpr void AddVertex(const Vector2 &v)
頂点を追加する関数.
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] 姿勢を表すクォータニオン.
constexpr Vector2 ProjectedXY() const noexcept
XY平面に射影したベクトルを返す.