mirror of
https://github.com/ConjureETS/LOG750-LAB2.git
synced 2026-03-24 03:21:19 +00:00
Animated rotation
This commit is contained in:
parent
dbc433dbf7
commit
1bf9169f09
@ -75,7 +75,17 @@ namespace
|
|||||||
bool active;
|
bool active;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RotateAnimation {
|
||||||
|
SceneGroup* target;
|
||||||
|
QVector3D axis;
|
||||||
|
float angle;
|
||||||
|
float currentAngle;
|
||||||
|
int length;
|
||||||
|
double startFrame;
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<std::vector<Particle>> particleSystems;
|
std::vector<std::vector<Particle>> particleSystems;
|
||||||
|
std::vector<RotateAnimation*> cubeSpinQueue;
|
||||||
|
|
||||||
ToolAnimation swing;
|
ToolAnimation swing;
|
||||||
|
|
||||||
@ -1274,6 +1284,23 @@ void Viewer::animate(){
|
|||||||
double dt = 1/0.006;//time - startTime;
|
double dt = 1/0.006;//time - startTime;
|
||||||
frame += dt * 0.006 * frame_mult; // 60fps
|
frame += dt * 0.006 * frame_mult; // 60fps
|
||||||
startTime = time;
|
startTime = time;
|
||||||
|
|
||||||
|
if(cubeSpinQueue.size() > 0) {
|
||||||
|
RotateAnimation* current = cubeSpinQueue.front();
|
||||||
|
float angleIncrement = (dt * frame_mult) * 2 / current->angle;
|
||||||
|
bool clean = false;
|
||||||
|
if(fabs(current->currentAngle + angleIncrement) >= fabs(current->angle)) {
|
||||||
|
angleIncrement = (fabs(current->angle) - fabs(current->currentAngle)) * current->angle / fabs(current->angle);
|
||||||
|
clean = true;
|
||||||
|
}
|
||||||
|
current->currentAngle = angleIncrement + current->currentAngle;
|
||||||
|
current->target->transform.rotate(angleIncrement, current->axis);
|
||||||
|
|
||||||
|
if(clean) {
|
||||||
|
cubeSpinQueue.erase(cubeSpinQueue.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1303,26 +1330,39 @@ void Viewer::animationSpeedChange(int val) {
|
|||||||
void Viewer::rotateSelected(RotateDirection dir) {
|
void Viewer::rotateSelected(RotateDirection dir) {
|
||||||
if(selectedObj.shape == nullptr || selectedObj.shape->getParent() == nullptr) return;
|
if(selectedObj.shape == nullptr || selectedObj.shape->getParent() == nullptr) return;
|
||||||
|
|
||||||
|
RotateAnimation* r = new RotateAnimation();
|
||||||
|
r->target = selectedObj.shape->getParent();
|
||||||
|
r->currentAngle = 0;
|
||||||
|
|
||||||
switch(dir) {
|
switch(dir) {
|
||||||
case X_CCW:
|
case X_CCW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(90, 1, 0, 0);
|
r->angle = 90;
|
||||||
|
r->axis = QVector3D(1,0,0);
|
||||||
break;
|
break;
|
||||||
case X_CW:
|
case X_CW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(-90, 1, 0, 0);
|
r->angle = -90;
|
||||||
|
r->axis = QVector3D(1,0,0);
|
||||||
break;
|
break;
|
||||||
case Y_CCW:
|
case Y_CCW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(90, 0, 1, 0);
|
r->angle = 90;
|
||||||
|
r->axis = QVector3D(0,1,0);
|
||||||
break;
|
break;
|
||||||
case Y_CW:
|
case Y_CW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(-90, 0, 1, 0);
|
r->angle = -90;
|
||||||
|
r->axis = QVector3D(0,1,0);
|
||||||
break;
|
break;
|
||||||
case Z_CCW:
|
case Z_CCW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(90, 0, 0, 1);
|
r->angle = 90;
|
||||||
|
r->axis = QVector3D(0,0,1);
|
||||||
break;
|
break;
|
||||||
case Z_CW:
|
case Z_CW:
|
||||||
selectedObj.shape->getParent()->transform.rotate(-90, 0, 0, 1);
|
r->angle = -90;
|
||||||
|
r->axis = QVector3D(0,0,1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cubeSpinQueue.push_back(r);
|
||||||
|
startSwingAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
PickedGeom Viewer::pickGeom(int x, int y){
|
PickedGeom Viewer::pickGeom(int x, int y){
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user