- **CylinderShape**: Añadido sistema de tumbling ocasional - Volteretas de 90° en eje X cada 3-5 segundos - Interpolación suave con ease-in-out (1.5s) - Rotación Y continua + tumbling X ocasional = más dinámico - **WaveGridShape**: Reemplazada rotación por pivoteo sutil - Eliminada rotación completa en eje Y - Pivoteo en esquinas (oscilación lenta 0.3/0.5 rad/s) - Grid paralelo a pantalla con efecto "sábana ondeando" - Ondas sinusoidales + pivoteo = movimiento más orgánico 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
29 lines
1.3 KiB
C++
29 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "shape.h"
|
|
|
|
// Figura: Cilindro 3D rotante
|
|
// Comportamiento: Superficie cilíndrica con rotación en eje Y + tumbling ocasional en X/Z
|
|
// Ecuaciones: x = r*cos(u), y = v, z = r*sin(u)
|
|
class CylinderShape : public Shape {
|
|
private:
|
|
float angle_y_ = 0.0f; // Ángulo de rotación en eje Y (rad)
|
|
float angle_x_ = 0.0f; // Ángulo de rotación en eje X (tumbling ocasional)
|
|
float radius_ = 0.0f; // Radio del cilindro (píxeles)
|
|
float height_ = 0.0f; // Altura del cilindro (píxeles)
|
|
int num_points_ = 0; // Cantidad de puntos generados
|
|
|
|
// Sistema de tumbling ocasional
|
|
float tumble_timer_ = 0.0f; // Temporizador para próximo tumble
|
|
float tumble_duration_ = 0.0f; // Duración del tumble actual
|
|
bool is_tumbling_ = false; // ¿Estamos en modo tumble?
|
|
float tumble_target_ = 0.0f; // Ángulo objetivo del tumble
|
|
|
|
public:
|
|
void generatePoints(int num_points, float screen_width, float screen_height) override;
|
|
void update(float delta_time, float screen_width, float screen_height) override;
|
|
void getPoint3D(int index, float& x, float& y, float& z) const override;
|
|
const char* getName() const override { return "CYLINDER"; }
|
|
float getScaleFactor(float screen_height) const override;
|
|
};
|