open_toontown_panda3d/panda/src/physx/physxWheelShape.h

117 lines
3.5 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file physxWheelShape.h
* @author enn0x
* @date 2009-11-09
*/
#ifndef PHYSXWHEELSHAPE_H
#define PHYSXWHEELSHAPE_H
#include "pandabase.h"
#include "physxShape.h"
#include "physx_includes.h"
class PhysxWheelShapeDesc;
class PhysxSpringDesc;
/**
* A special shape used for simulating a car wheel. The -Y axis should be
* directed toward the ground.
*
* A ray is cast from the shape's origin along the -Y axis. When the ray
* strikes something, and the distance is:
*
* - less than wheelRadius from the shape origin: a hard contact is created -
* between wheelRadius and (suspensionTravel + wheelRadius): a soft suspension
* contact is created - greater than (suspensionTravel + wheelRadius): no
* contact is created.
*
* Thus at the point of greatest possible suspension compression the wheel
* axle will pass through at the shape's origin. At the point greatest
* suspension extension the wheel axle will be a distance of suspensionTravel
* from the shape's origin.
*
* The suspension's targetValue is 0 for real cars, which means that the
* suspension tries to extend all the way. Otherwise one can specify values
* [0,1] for suspensions which have a spring to pull the wheel up when it is
* extended too far. 0.5 will then fall halfway along suspensionTravel.
*
* The +Z axis is the 'forward' direction of travel for the wheel. -Z is
* backwards. The wheel rolls forward when rotating around the positive
* direction around the X axis.
*
* A positive wheel steering angle corresponds to a positive rotation around
* the shape's Y axis. (Castor angles are not modeled.)
*
* The coordinate frame of the shape is rigidly fixed on the car.
*/
class EXPCL_PANDAPHYSX PhysxWheelShape : public PhysxShape {
PUBLISHED:
INLINE PhysxWheelShape();
INLINE ~PhysxWheelShape();
void save_to_desc(PhysxWheelShapeDesc &shapeDesc) const;
void set_radius(float radius);
void set_suspension_travel(float travel);
void set_inverse_wheel_mass(float invMass);
void set_motor_torque(float torque);
void set_brake_torque(float torque);
void set_steer_angle(float angle);
void set_steer_angle_rad(float angle);
void set_axle_speed(float speed);
void set_wheel_flag(PhysxWheelShapeFlag flag, bool value);
void set_suspension(const PhysxSpringDesc &spring);
float get_radius() const;
float get_suspension_travel() const;
float get_inverse_wheel_mass() const;
float get_motor_torque() const;
float get_brake_torque() const;
float get_steer_angle() const;
float get_steer_angle_rad() const;
float get_axle_speed() const;
bool get_wheel_flag(PhysxWheelShapeFlag flag) const;
public:
INLINE NxShape *ptr() const { return (NxShape *)_ptr; };
void link(NxShape *shapePtr);
void unlink();
private:
NxWheelShape *_ptr;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
PhysxShape::init_type();
register_type(_type_handle, "PhysxWheelShape",
PhysxShape::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {
init_type();
return get_class_type();
}
private:
static TypeHandle _type_handle;
};
#include "physxWheelShape.I"
#endif // PHYSXWHEELSHAPE_H