Hello, I am changing the rotation of the circle in the example with animation on the y-axis. While the old value of rotation.y is 6, the new value is 0. Everything happens successfully, but instead of moving to the left, the circle moves to the right and makes a full circle around it. What I want is for the newcomer to go to the new rotation.y value from the direction closest to him instead of going full circle. I hope I was able to explain. Sorry for the English translation :). Thank you in advance for your help.
what do you mean by full circle around and turning closest ???
The playground is expected, you are doing almost a full rotation 6 is close-ish to 2 * PI and you animate the euler Y so a rotation around the sphere local vertical axis. I am not sure to understand what the issue is.
I am not sure what you mean with “instead of turning closest.” I asked GPT and tried to recreate his answer. In my defence
a) all functions are present and b) there is no error message. But the question is if the answer is also what you are looking for.
GPT:
The issue with your code is that you are animating the rotation of the sphere along the y-axis, but you are using a constant interpolation mode BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT. This means that the animation will not interpolate between the starting and ending keyframe values, but rather, it will jump directly to the end value.
To make the sphere rotate smoothly from 0 to 6, you should change the interpolation mode to BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE. This will cause the animation to loop continuously and interpolate smoothly between the starting and ending keyframe values.
Here’s the updated code:
phpCopy code
function sphereAnimation() {
sphere.animations = [];
let keys = [];
let yRotationAnim = new BABYLON.Animation('yRotation', 'rotation.y', 60, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
// Animation keys
keys.push(
{
frame: 0,
value: 0
},
{
frame: 60,
value: 6
}
);
// Set keys and push animation
yRotationAnim.setKeys(keys);
sphere.animations.push(yRotationAnim);
// Start animation
return scene.beginAnimation(sphere, 0, 60, true);
}
Changes made:
BABYLON.Animation.ANIMATIONTYPE_FLOAT is used instead of BABYLON.Animation.ANIMATIONTYPE_VECTOR3 because we are only animating the y-rotation.
rotation.y is used instead of rotation to specify that we are only animating the y-rotation.
BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE is used as the interpolation mode.
I think I understand your problem. I hope so.
Point is if you want to make a full revolution, 6 is an incorrect value. The correct value is Math.PI*2 (~3.141593 * 2).
Something like this (may be):
Sorry for the English translation and grateful for your answers. I have explained the problem in more detail in a neater way. I hope I was able to explain this time :).
Yes, that’s a lot clearer. So the simple answer is, add a minus in front of the value to rotate the other way round. Something like this:
Edit: And if you want to reach the closest of the two points from the actual rotation, the rest is a matter of maths. Calculate the offset for the two points, pick the smallest one and use positive or negative value depending on whether it is clockwise or counter-clockwise.
Your answer makes sense but unfortunately it’s not the solution for me. Values should not change. 0 and 6 should remain. The reason for this is related to the values that came to me in my project
Thanks for the answer. Your answer does not solve my problem, but you have achieved the desired result :). The current problem is that the rotation.y value does not change. The rotation.y value of the sphere needs to be changed. I don’t need to do this in EndAnim because the animation will run continuously. Any idea of this solution with a modified rotation.y value? I hope I was able to explain with my English :).
I don’t think it’s your english. Your english is good enough for me
I believe it’s the logic I (personally) do not quite understand here. I didn’t propose an animation interpolation because (correct me if I’m wrong) I was assuming that the reason why the sphere would eventually stop in between two ‘steps’ (let’s call them 'steps, from 0 to 6)… the reason would be because the user can somehow interact with it and next (on end of whatever interaction) the sphere would ‘lock’ again to the closest ‘step’ in rotation. That’s the way I understand it so far.
In any case, there’s one thing you cannot change and that’s the value of the rotation. You can have it expressed and handled in different ways, but the value will always be the one of the current rotation.
The only way I see to actually translate this value into 0 to 6 (steps) is, as I said, by using a variable and use this variable (and not the value of rotation) in your function. For whatever function it is and does? May be you could enhance the PG with more parts of your logic so we would get a better understanding of it?