Quaternion có thể mô tả không chỉ xoay, mà còn là một định hướng, tức là xoay từ vị trí ban đầu (số không).Xoay trơn tru với quaternions
Tôi muốn mô hình xoay trơn tru từ hướng này sang hướng khác. Tôi đã tính định hướng bắt đầu startOrientation
và hướng kết thúc endOrientation
và muốn mô tả định hướng trung gian là startOrientation*(1-argument) + endOrientation*argument
trong khi argument
thay đổi từ 0
thành 1
.
Mã cho chức năng cập nhật cơ khỉ là sau:
@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;
}
}
}
}
Công thức cosin đã được dự kiến để mô hình mịn tăng tốc ngay từ đầu và giảm tốc ở cuối.
Mã hoạt động nhưng không như mong đợi: vòng quay trơn tru bắt đầu và kết thúc lâu trước khi các giá trị fraction
và argument
đạt được 1
và tôi không hiểu, tại sao.
Tại sao giá trị orientation
đạt đến endOrientation
quá nhanh?
Rõ ràng 'slerp' cư xử giống như chức năng của tôi: xoay trực quan đạt định hướng thức nhiều trước khi 'interpolation' đạt' 1'. – Dims
Ngoài ra tôi không thấy 'slerp' với mẫu thử nghiệm của bạn: it void hoặc takes 3 quaternions. – Dims
@Dims Bạn đúng về chữ ký phương thức slerp. Có vẻ một số tài liệu trên JMonkey đã lỗi thời, đã chỉnh sửa. –