167QVector3D QCharacterController::getDisplacement(
float deltaTime)
170 QVector3D displacement = sceneRotation() * m_movement * deltaTime;
173 const auto g = m_gravity;
181 auto isGrounded = [
this](){
182 if (m_collisions == Collision::None)
186 if (m_gravity.y() < 0) {
187 if (m_collisions & Collision::Down)
189 if ((m_collisions & Collision::Up) && m_freeFallVelocity.y() > 0)
194 if (m_gravity.y() > 0) {
195 if (m_collisions & Collision::Up)
197 if ((m_collisions & Collision::Down) && m_freeFallVelocity.y() < 0)
205 if ((m_gravity.x() != 0 || m_gravity.z() != 0) && m_collisions & Collision::Side)
211 bool freeFalling = !isGrounded();
213 if (!m_midAirControl)
216 displacement += m_freeFallVelocity * deltaTime;
217 m_freeFallVelocity += g * deltaTime;
219 m_freeFallVelocity = displacement / deltaTime + g * deltaTime;
222 QVector3D::dotProduct(m_freeFallVelocity, g.normalized()) * g.normalized();
224 const QVector3D gravityAcceleration = 0.5 * deltaTime * deltaTime * g;
225 displacement += gravityAcceleration;
273void QCharacterController::setCollisions(
const Collisions &newCollisions)
275 if (m_collisions == newCollisions)
277 m_collisions = newCollisions;
278 emit collisionsChanged();