- Home /
Explanation of slerp example in reference
Hey, the Vector3 slerp example in the Script reference contains the following. I've commented what I understand from it and reading wikipedia on slerp.
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Transform sunrise;
public Transform sunset;
void Update() {
// Is this first line a typo? When I tried this I divided the sum of
// both positions instead of doing what they do here and it seemed
// to work like it was supposed to. E.g. the object arced y-axis. In
// contrast, using the code here caused it to arc on the z-axis. Anyway
// this should be the midpoint between both positions.
Vector3 center = sunrise.position + sunset.position * 0.5F;
// Offset the midpoint so we now have the center of our arc. However, it's
// offset in the negative y direction, whereas you'd think it would be offset
// in the positive y direction.
center -= new Vector3(0, 1, 0);
// Sunrise position relative to the center, so this will be in the positive
// y direction.
Vector3 riseRelCenter = sunrise.position - center;
// Sunset position relative to the center, in +y direction.
Vector3 setRelCenter = sunset.position - center;
// Magic. Reference says 'interpolates from toward to by amount t'. The t
// argument isn't confusing, I get that they are just taking advantage of
// using the decimal values during the first second. But what are the first
// two parameters supposed to be exactly? Are they supposed to be start and
// end positions relative to our center? Again though, why is the center
// located below where the actual center of the arc is (at least from what
// I saw by running the example).
transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, Time.time);
// No idea.
transform.position += center;
}
}
I tried the above just having a cube arc from one position from another, with the only change being the center being originally calculated as (sunrise.position + sunset.position) 0.5 rather than sunrise.position + (sunset.position 0.5) as above. The cube in the +y direction from one point to another. If I left the example was it was without changing the first statement it arced in the positive z direction.
Just looking for an explanation of what's going on. Particularly the reason for calculating center in that way, and adding center to the position at the end.
Answer by aldonaletto · Dec 23, 2011 at 11:25 PM
1- You're right about the center calculation: it's a typo in the C# example - the javascript version is ok.
2- The reason to move the center a little down is to force the movement to occur above the two points - slerp probably goes in the shortest direction, thus shifting the center a little below the line between the two points makes slerp "choose" the arc above them.
3- Apparently, slerp follows an arc centered at (0,0,0); since the calculated center may be anywhere, the smart Unity guys shifted the whole thing to (0,0,0) by subtracting the center coordinates from sunrise and sunset: they calculate slerp using these shifted from and to points, then add the center coordinates again to move the calculated point to where it should be - that's the purpose of the mysterious last line.
4- The 3rd parameter is a number between 0 and 1, where 0 returns from position, 1 returns to position, and any value between these values return a proportional position in the arc.
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Launching local Unity API Reference from MonoDevelop 7 Answers
Using C# how can I setup a "database" script? 1 Answer
Error message "variable not assigned" ? 1 Answer
build for iphone - "function is not a member of object" 1 Answer