GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
approximated_motion_range_render.cpp
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
9
10#include <DxLib.h>
11
12#include "dxlib_util.h"
13
14
15namespace designlab
16{
17
19 const std::shared_ptr<const IHexapodPostureValidator>& validator,
20 const std::shared_ptr<const IHexapodCoordinateConverter>& converter) :
21 validator_(validator),
22 converter_(converter)
23{
24 InitPosState();
25}
26
28{
29 // 描画を行うもののみを描画する.
30 for (int i = 0; i < kDivNum; ++i)
31 {
32 for (int j = 0; j < kDivNum; ++j)
33 {
34 for (int k = 220; k < kDivNum; ++k)
35 {
36 if (pos_state_[i][j][k] == PosState::kInRangeDrawable)
37 {
38 const Vector3 pos = Vector3(
39 center_.x + (i - kDivNum / 2) * EdgeLength / kDivNum,
40 center_.y + (j - kDivNum / 2) * EdgeLength / kDivNum,
41 center_.z + (k - kDivNum / 2) * EdgeLength / kDivNum);
42
43 const Vector3 global_pos = converter_->ConvertLegToGlobalCoordinate(pos, kLegIndex, node_.center_of_mass_global_coord,
44 node_.posture, true);
45
46 dxlib_util::DrawCube3D(dxlib_util::ConvertToDxlibVec(global_pos), EdgeLength / kDivNum, GetColor(255, 0, 0));
47 }
48 }
49 }
50 }
51}
52
54{
55 node_ = node;
56}
57
58void ApproximatedMotionRangeRender::InitPosState()
59{
60 // まずは全ての点を範囲外に設定.
61 for (int i = 0; i < kDivNum; ++i)
62 {
63 for (int j = 0; j < kDivNum; ++j)
64 {
65 for (int k = 0; k < kDivNum; ++k)
66 {
67 pos_state_[i][j][k] = PosState::kNotInRange;
68 }
69 }
70 }
71
72 // center_ を中心として,近似された脚の動作範囲内であるかどうかを判定する.
73
74 center_ = Vector3(0.f, -150.f, -100.f);
75
76 for (int i = 0; i < kDivNum; ++i)
77 {
78 for (int j = 0; j < kDivNum; ++j)
79 {
80 for (int k = 0; k < kDivNum; ++k)
81 {
82 const Vector3 pos = Vector3(
83 center_.x + (i - kDivNum / 2) * EdgeLength / kDivNum,
84 center_.y + (j - kDivNum / 2) * EdgeLength / kDivNum,
85 center_.z + (k - kDivNum / 2) * EdgeLength / kDivNum);
86
87 if (validator_->IsLegInRange(kLegIndex, pos))
88 {
89 pos_state_[i][j][k] = PosState::kInRange;
90 }
91 }
92 }
93 }
94
95 // 範囲内の点のうち,描画可能な点を設定する.
96 for (int i = 0; i < kDivNum; ++i)
97 {
98 for (int j = 0; j < kDivNum; ++j)
99 {
100 for (int k = 0; k < kDivNum; ++k)
101 {
102 // 自身と隣接する 8 + 9 + 9 = 26 点を調べ,範囲内が5点以下なら描画可能とする.
103 if (pos_state_[i][j][k] == PosState::kNotInRange) { continue; }
104
105 int in_range_num = 0;
106
107 for (int di = -1; di <= 1; ++di)
108 {
109 for (int dj = -1; dj <= 1; ++dj)
110 {
111 for (int dk = -1; dk <= 1; ++dk)
112 {
113 if (i + di < 0 || i + di >= kDivNum ||
114 j + dj < 0 || j + dj >= kDivNum ||
115 k + dk < 0 || k + dk >= kDivNum)
116 {
117 continue;
118 }
119
120 if (pos_state_[i + di][j + dj][k + dk] == PosState::kInRange ||
121 pos_state_[i + di][j + dj][k + dk] == PosState::kInRangeDrawable)
122 {
123 ++in_range_num;
124 }
125 }
126 }
127 }
128
129 if (in_range_num <= 25)
130 {
131 pos_state_[i][j][k] = PosState::kInRangeDrawable;
132 }
133 }
134 }
135 }
136
137}
138
139} // namespace designlab
140
void SetNode(const RobotStateNode &node) override
ノードをセットする.
void Draw() const override
描画処理を行う. const 関数にしているのは, 描画処理の中でメンバ変数を変更しないようにするため.
ApproximatedMotionRangeRender(const std::shared_ptr< const IHexapodPostureValidator > &validator, const std::shared_ptr< const IHexapodCoordinateConverter > &converter)
VECTOR ConvertToDxlibVec(const Vector3 &vec)
Dxlibの座標を示すVECTORと,このプログラムで使用しているVectorを変換する. ロボット座標系は右手座標系, Dxlibは左手座標系(工学は右手・ゲームライブラリは左手が多い)なのでyを...
Definition dxlib_util.h:35
void DrawCube3D(const VECTOR &center_pos, const float side_len, const unsigned int color)
3D空間に立方体を描画する.
グラフ構造のためのノード(頂点).旧名 LNODE
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
3次元の位置ベクトルを表す構造体.
float x
ロボットの正面方向に正.
float z
ロボットの上向きに正.
float y
ロボットの左向きに正.