155QVector3D QCharacterController::getDisplacement(
float deltaTime)
158 QVector3D displacement = sceneRotation() * m_movement * deltaTime;
161 const auto g = m_gravity;
169 auto isGrounded = [
this](){
170 if (m_collisions == Collision::None)
174 if (m_gravity.y() < 0) {
175 if (m_collisions & Collision::Down)
177 if ((m_collisions & Collision::Up) && m_freeFallVelocity.y() > 0)
182 if (m_gravity.y() > 0) {
183 if (m_collisions & Collision::Up)
185 if ((m_collisions & Collision::Down) && m_freeFallVelocity.y() < 0)
193 if ((m_gravity.x() != 0 || m_gravity.z() != 0) && m_collisions & Collision::Side)
199 bool freeFalling = !isGrounded();
201 if (!m_midAirControl)
204 displacement += m_freeFallVelocity * deltaTime;
205 m_freeFallVelocity += g * deltaTime;
207 m_freeFallVelocity = displacement / deltaTime + g * deltaTime;
210 QVector3D::dotProduct(m_freeFallVelocity, g.normalized()) * g.normalized();
212 const QVector3D gravityAcceleration = 0.5 * deltaTime * deltaTime * g;
213 displacement += gravityAcceleration;
255void QCharacterController::setCollisions(
const Collisions &newCollisions)
257 if (m_collisions == newCollisions)
259 m_collisions = newCollisions;
260 emit collisionsChanged();