Czwartorzędowość może opisywać nie tylko obrót, ale także orientację, tj. Obrót od początkowej (zerowej) pozycji.Płynna rotacja z kwaterami
Chciałem modelować płynne obracanie z jednej orientacji na drugą. Obliczyłem orientację początkową startOrientation
i orientację końcową endOrientation
i chciałem opisać orientacje pośrednie jako startOrientation*(1-argument) + endOrientation*argument
, podczas gdy zmienia się z 0
do.
kod dla funkcji aktualizacji silnika małpa jest następujący: oczekuje
@Override
public void simpleUpdate(float tpf) {
if(endOrientation != null) {
if(!started) {
started = true;
}
else {
fraction += tpf * speed;
argument = (float) ((1 - Math.cos(fraction * Math.PI))/2);
orientation = startOrientation.mult(1-argument).add(endOrientation.mult(argument));
//orientation = startOrientation.mult(1-fraction).add(endOrientation.mult(fraction));
log.debug("tpf = {}, fraction = {}, argument = {}", tpf, fraction, argument);
//log.debug("orientation = {}", orientation);
rootNode.setLocalRotation(orientation);
if(fraction >= 1) {
rootNode.setLocalRotation(endOrientation);
log.debug("Stopped rotating");
startOrientation = endOrientation = null;
fraction = 0;
started = false;
}
}
}
}
Wzór cosinus został model gładka przyspieszenie na początku i na koniec zwalnia.
Kod działa, ale nie zgodnie z oczekiwaniami: płynna rotacja zaczyna się i kończy na długo przed osiągnięciem i argument
wartości 1
i nie rozumiem, dlaczego.
Dlaczego wartość orientation
osiąga wartość endOrientation
tak szybko?
Widocznie 'slerp' zachowuje się tak samo jak mojej funkcji: rotacja wizualnie osiągnie ostateczną orientację znacznie przed' '1 'interpolation' osiągnie. – Dims
Również nie widzę 'slerp' z twoim prototypem: ani it void, ani takes 3 quaternions. – Dims
@Dims Masz poprawne podpisanie metody slerp. Wydaje się, że niektóre dokumenty JMonkey są nieaktualne, edytowane. –