156QVector3D QCharacterController::getDisplacement(
float deltaTime)
159 QVector3D displacement = sceneRotation() * m_movement * deltaTime;
162 const auto g = m_gravity;
170 auto isGrounded = [
this](){
171 if (m_collisions == Collision::None)
175 if (m_gravity.y() < 0) {
176 if (m_collisions & Collision::Down)
178 if ((m_collisions & Collision::Up) && m_freeFallVelocity.y() > 0)
183 if (m_gravity.y() > 0) {
184 if (m_collisions & Collision::Up)
186 if ((m_collisions & Collision::Down) && m_freeFallVelocity.y() < 0)
194 if ((m_gravity.x() != 0 || m_gravity.z() != 0) && m_collisions & Collision::Side)
200 bool freeFalling = !isGrounded();
202 if (!m_midAirControl)
205 displacement += m_freeFallVelocity * deltaTime;
206 m_freeFallVelocity += g * deltaTime;
208 m_freeFallVelocity = displacement / deltaTime + g * deltaTime;
211 QVector3D::dotProduct(m_freeFallVelocity, g.normalized()) * g.normalized();
213 const QVector3D gravityAcceleration = 0.5 * deltaTime * deltaTime * g;
214 displacement += gravityAcceleration;
256void QCharacterController::setCollisions(
const Collisions &newCollisions)
258 if (m_collisions == newCollisions)
260 m_collisions = newCollisions;
261 emit collisionsChanged();