49 std::is_same<S, float>::value || std::is_same<S, double>::value,
50 "Height field needs to be double or float");
57 return getStaticType();
64 static const std::string
type
65 =
"HeightmapShape (" + std::string(
typeid(
S).
name()) +
")";
73 assert(scale[0] > 0.0);
74 assert(scale[1] > 0.0);
75 assert(scale[2] > 0.0);
77 mIsBoundingBoxDirty =
true;
78 mIsVolumeDirty =
true;
93 const std::size_t& width,
94 const std::size_t& depth,
95 const std::vector<S>& heights)
97 assert(heights.size() == width * depth);
98 if ((width * depth) != heights.size())
100 dterr <<
"Size of height field needs to be width*depth=" << width * depth
106 dtwarn <<
"Empty height field makes no sense." << std::endl;
110 for (
size_t r = 0; r < depth; ++r)
112 for (
size_t c = 0; c < width; ++c)
114 mHeights(r, c) = heights[r * width + c];
119 mMinHeight = std::numeric_limits<S>::max();
120 mMaxHeight = -std::numeric_limits<S>::max();
121 for (
auto it = heights.begin(); it != heights.end(); ++it)
123 if (*it < mMinHeight)
125 if (*it > mMaxHeight)
128 mIsBoundingBoxDirty =
true;
129 mIsVolumeDirty =
true;
135 template <
typename S>
142 template <
typename S>
149 template <
typename S>
152 mHeights = mHeights.colwise().reverse().eval();
156 template <
typename S>
163 template <
typename S>
170 template <
typename S>
173 return mHeights.cols();
177 template <
typename S>
180 return mHeights.rows();
184 template <
typename S>
187 if (mIsBoundingBoxDirty)
195 template <
typename S>
197 Eigen::Vector3d& min, Eigen::Vector3d& max)
const
199 const double dimX = getWidth() * mScale.x();
200 const double dimY = getDepth() * mScale.y();
201 const double dimZ = (mMaxHeight - mMinHeight) * mScale.z();
202 min = Eigen::Vector3d(-dimX * 0.5, -dimY * 0.5, mMinHeight * mScale.z());
203 max = min + Eigen::Vector3d(dimX, dimY, dimZ);
207 template <
typename S>
212 computeBoundingBox(min, max);
213 mBoundingBox.setMin(min);
214 mBoundingBox.setMax(max);
215 mIsBoundingBoxDirty =
false;
219 template <
typename S>
223 const Eigen::Vector3d size = mBoundingBox.getMax() - mBoundingBox.getMin();
224 mVolume = size.x() * size.y() * size.z();
225 mIsVolumeDirty =
false;
#define dterr
Output an error message.
Definition: Console.hpp:49
#define dtwarn
Output a warning message.
Definition: Console.hpp:46
std::string type
Definition: SdfParser.cpp:82
std::string * name
Definition: SkelParser.cpp:1642
static Eigen::Matrix3d computeInertia(const Eigen::Vector3d &size, double mass)
Compute moments of inertia of a box.
Definition: BoxShape.cpp:75
const HeightField & getHeightField() const
Returns the height field.
Definition: HeightmapShape-impl.hpp:136
const Eigen::Vector3d & getScale() const
Returns scale of this heightmap.
Definition: HeightmapShape-impl.hpp:85
std::size_t getWidth() const
Returns the width dimension of the height field.
Definition: HeightmapShape-impl.hpp:171
void setScale(const Eigen::Vector3d &scale)
Sets scale of this heightmap.
Definition: HeightmapShape-impl.hpp:71
Eigen::Matrix3d computeInertia(double mass) const override
Computes the inertia.
Definition: HeightmapShape-impl.hpp:185
S_ S
Definition: HeightmapShape.hpp:49
void computeBoundingBox(Eigen::Vector3d &min, Eigen::Vector3d &max) const
Computes the bounding box of the height field.
Definition: HeightmapShape-impl.hpp:196
void updateVolume() const override
Updates volume.
Definition: HeightmapShape-impl.hpp:220
static const std::string & getStaticType()
Returns shape type for this class.
Definition: HeightmapShape-impl.hpp:62
HeightField & getHeightFieldModifiable() const
Returns the modified height field. See also setHeightField().
Definition: HeightmapShape-impl.hpp:143
void flipY() const
Flips the y values in the height field.
Definition: HeightmapShape-impl.hpp:150
void updateBoundingBox() const override
Updates bounding box.
Definition: HeightmapShape-impl.hpp:208
HeightmapShape()
Constructor.
Definition: HeightmapShape-impl.hpp:46
const std::string & getType() const override
Returns a string representing the shape type.
Definition: HeightmapShape-impl.hpp:55
Eigen::Matrix< S, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > HeightField
Definition: HeightmapShape.hpp:52
std::size_t getDepth() const
Returns the height dimension of the height field.
Definition: HeightmapShape-impl.hpp:178
S getMinHeight() const
Returns the minimum height set by setHeightField()
Definition: HeightmapShape-impl.hpp:164
S getMaxHeight() const
Returns the maximum height set by setHeightField()
Definition: HeightmapShape-impl.hpp:157
void setHeightField(const std::size_t &width, const std::size_t &depth, const std::vector< S > &heights)
Sets the height field.
Definition: HeightmapShape-impl.hpp:92
Definition: BulletCollisionDetector.cpp:63