Browse Source

Physics: specify AABB by its minimal and maximal dimensions.

Center + size was confusing for entering and also with bad
performance for computing collisions.
pull/7/head
Vladimír Vondruš 13 years ago
parent
commit
2269919a99
  1. 4
      src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp
  2. 4
      src/Physics/AxisAlignedBox.cpp
  3. 40
      src/Physics/AxisAlignedBox.h
  4. 10
      src/Physics/Test/AxisAlignedBoxTest.cpp

4
src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp

@ -27,8 +27,8 @@ template<std::uint8_t dimensions> AxisAlignedBoxRenderer<dimensions>::AxisAligne
template<std::uint8_t dimensions> void AxisAlignedBoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) { template<std::uint8_t dimensions> void AxisAlignedBoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) {
/* Half scale, because the box is 2x2(x2) */ /* Half scale, because the box is 2x2(x2) */
typename DimensionTraits<dimensions>::MatrixType transformation = typename DimensionTraits<dimensions>::MatrixType transformation =
DimensionTraits<dimensions>::MatrixType::translation(axisAlignedBox.transformedPosition())* DimensionTraits<dimensions>::MatrixType::translation((axisAlignedBox.transformedMin()+axisAlignedBox.transformedMax())/2)*
DimensionTraits<dimensions>::MatrixType::scaling(axisAlignedBox.transformedSize()/2); DimensionTraits<dimensions>::MatrixType::scaling((axisAlignedBox.transformedMax()-axisAlignedBox.transformedMin())/2);
this->shader->setTransformationProjectionMatrix(projectionMatrix*transformation) this->shader->setTransformationProjectionMatrix(projectionMatrix*transformation)
->setColor(options->color()) ->setColor(options->color())
->use(); ->use();

4
src/Physics/AxisAlignedBox.cpp

@ -21,8 +21,8 @@
namespace Magnum { namespace Physics { namespace Magnum { namespace Physics {
template<std::uint8_t dimensions> void AxisAlignedBox<dimensions>::applyTransformationMatrix(const typename DimensionTraits<dimensions>::MatrixType& matrix) { template<std::uint8_t dimensions> void AxisAlignedBox<dimensions>::applyTransformationMatrix(const typename DimensionTraits<dimensions>::MatrixType& matrix) {
_transformedPosition = (matrix*typename DimensionTraits<dimensions>::PointType(_position)).vector(); _transformedMin = (matrix*typename DimensionTraits<dimensions>::PointType(_min)).vector();
_transformedSize = matrix.rotationScaling()*_size; _transformedMax = (matrix*typename DimensionTraits<dimensions>::PointType(_max)).vector();
} }
template class AxisAlignedBox<2>; template class AxisAlignedBox<2>;

40
src/Physics/AxisAlignedBox.h

@ -34,7 +34,7 @@ namespace Magnum { namespace Physics {
template<std::uint8_t dimensions> class MAGNUM_PHYSICS_EXPORT AxisAlignedBox: public AbstractShape<dimensions> { template<std::uint8_t dimensions> class MAGNUM_PHYSICS_EXPORT AxisAlignedBox: public AbstractShape<dimensions> {
public: public:
/** @brief Constructor */ /** @brief Constructor */
inline explicit AxisAlignedBox(const typename DimensionTraits<dimensions>::VectorType& position, const typename DimensionTraits<dimensions>::VectorType& size): _position(position), _transformedPosition(position), _size(size), _transformedSize(size) {} inline explicit AxisAlignedBox(const typename DimensionTraits<dimensions>::VectorType& min, const typename DimensionTraits<dimensions>::VectorType& max): _min(min), _max(max), _transformedMin(min), _transformedMax(max) {}
inline typename AbstractShape<dimensions>::Type type() const override { inline typename AbstractShape<dimensions>::Type type() const override {
return AbstractShape<dimensions>::Type::AxisAlignedBox; return AbstractShape<dimensions>::Type::AxisAlignedBox;
@ -42,37 +42,37 @@ template<std::uint8_t dimensions> class MAGNUM_PHYSICS_EXPORT AxisAlignedBox: pu
void applyTransformationMatrix(const typename DimensionTraits<dimensions>::MatrixType& matrix) override; void applyTransformationMatrix(const typename DimensionTraits<dimensions>::MatrixType& matrix) override;
/** @brief Position */ /** @brief Minimal coordinates */
inline typename DimensionTraits<dimensions>::VectorType position() const { inline typename DimensionTraits<dimensions>::VectorType min() const {
return _position; return _min;
} }
/** @brief Set position */ /** @brief Set minimal coordinates */
inline void setPosition(const typename DimensionTraits<dimensions>::VectorType& position) { inline void setMin(const typename DimensionTraits<dimensions>::VectorType& min) {
_position = position; _min = min;
} }
/** @brief Size */ /** @brief Maximal coordinates */
inline typename DimensionTraits<dimensions>::VectorType size() const { return _size; } inline typename DimensionTraits<dimensions>::VectorType max() const { return _max; }
/** @brief Set size */ /** @brief Set maximal coordinates */
inline void setSize(const typename DimensionTraits<dimensions>::VectorType& size) { inline void setMax(const typename DimensionTraits<dimensions>::VectorType& max) {
_size = size; _max = max;
} }
/** @brief Transformed position */ /** @brief Transformed minimal coordinates */
inline typename DimensionTraits<dimensions>::VectorType transformedPosition() const { inline typename DimensionTraits<dimensions>::VectorType transformedMin() const {
return _transformedPosition; return _transformedMin;
} }
/** @brief Transformed size */ /** @brief Transformed maximal coordinates */
inline typename DimensionTraits<dimensions>::VectorType transformedSize() const { inline typename DimensionTraits<dimensions>::VectorType transformedMax() const {
return _transformedSize; return _transformedMax;
} }
private: private:
typename DimensionTraits<dimensions>::VectorType _position, _transformedPosition, typename DimensionTraits<dimensions>::VectorType _min, _max,
_size, _transformedSize; _transformedMin, _transformedMax;
}; };
/** @brief Two-dimensional axis-aligned box */ /** @brief Two-dimensional axis-aligned box */

10
src/Physics/Test/AxisAlignedBoxTest.cpp

@ -35,13 +35,9 @@ AxisAlignedBoxTest::AxisAlignedBoxTest() {
void AxisAlignedBoxTest::applyTransformation() { void AxisAlignedBoxTest::applyTransformation() {
Physics::AxisAlignedBox3D box({-1.0f, -2.0f, -3.0f}, {1.0f, 2.0f, 3.0f}); Physics::AxisAlignedBox3D box({-1.0f, -2.0f, -3.0f}, {1.0f, 2.0f, 3.0f});
box.applyTransformationMatrix(Matrix4::scaling({2.0f, -1.0f, 1.5f})); box.applyTransformationMatrix(Matrix4::translation(Vector3(1.0f))*Matrix4::scaling({2.0f, -1.0f, 1.5f}));
CORRADE_COMPARE(box.transformedPosition(), Vector3(-2.0f, 2.0f, -4.5f)); CORRADE_COMPARE(box.transformedMin(), Vector3(-1.0f, 3.0f, -3.5f));
CORRADE_COMPARE(box.transformedSize(), Vector3(2.0f, -2.0f, 4.5f)); CORRADE_COMPARE(box.transformedMax(), Vector3(3.0f, -1.0f, 5.5f));
box.applyTransformationMatrix(Matrix4::translation(Vector3(1.0f))*Matrix4::rotation(deg(90.0f), Vector3::xAxis()));
CORRADE_COMPARE(box.transformedPosition(), Vector3(0.0f, 4.0f, -1.0f));
CORRADE_COMPARE(box.transformedSize(), Vector3(1.0f, -3.0f, 2.0f));
} }
}}} }}}

Loading…
Cancel
Save