Popatrz co zrobiłeś:
void AfineTransformations::updateBox(osg::Matrix & transformation, double previousTime, double currentTime)
{
osg::Vec3f wektor;
// tu liczysz przesunięcie od stożka, ok! Ale ta wartość będzie ci się zmieniać przy każdym obrocie
wektor = coneTransform->getMatrix().getTrans() - transformation.getTrans();
// tu do zmieniającego się wektora (w zamierzeniu rotującego) dodajesz stałą wartość, raczej nie to chciałeś uzyskać
wektor += osg::Vec3f(0.0, 1.0, 0.0);
// tu AKTUALIZUJESZ macierz a nie ustalasz jej nową wartość, poprzednią iteracja ma wpływ na bierzacą iterację!
transformation *= osg::Matrix::translate(wektor);
transformation *= osg::Matrix::translate(-1.0, -1.0, 0.0);
transformation *= osg::Matrix::rotate(0.04, 0.0, 0.0, 1.0);
transformation *= osg::Matrix::translate(1.0, 1.0, 0.0);
}
Czyli pomieszałeś małe aktualizowanie macierzy z jej liczeniem od początku.
Bezpieczniej jak zrobisz tak (obliczenie całkowitego obrotu na podstawie czasu):
void AfineTransformations::updateBox(osg::Matrix & transformation, double previousTime, double currentTime)
{
const float BoxDistance= 1.0;
const float RotationSpeed = 0.01;
// wartość początkowa ustal odległość od stożka dla czasu 0 (obecnie odległość od początku układu wspł)
transformation = osg::Matrix::translate(BoxDistance, 0, 0);
// całkowity obrót obliczony na podstawie czasu
transformation *= osg::Matrix::rotate(RotationSpeed * currentTime, 0.0, 0.0, 1.0);
// przesuń do pozycji stożka
transformation *= coneTransform->getMatrix().getTrans();
}