我只是想知道我是否正确使用了vector3.slerp,因为我遇到了一些问题。
我在场景中设置了一个立方体,我希望它从当前位置平滑移动到程序传递的位置。在我尝试使用slerp之前,我只是让我的立方体从当前点移动到这样的新点(正如我所说,数学都有效):
cubeFour.transform.localPosition = new Vector3((B2*C1 - B1*C2)/delta,0,(A1*C2 - A2*C1)/delta);
但是当我把它放入slerp调用时,我的立方体不再出现在屏幕上。这就是我所说的:
Vector3 targetPosition = new Vector3(lerpX, lerpY, lerpZ);
cubeFour.transform.localPosition = Vector3.Slerp(cubeFour.transform.localPosition, targetPosition, Time.deltaTime);
LerpX,LerpY& LerpZ是我设置为包含X,Y和amp;的局部变量。我在第一次尝试时创建的第一个Vector3的Z.
我是否正确设置了slerp或者我在某个地方做了一个kerfuffle?
答案 0 :(得分:2)
Slerp
最适合指示,Lerp
最适合职位。您可能应该使用Lerp
。而Time.deltaTime
几乎肯定是t
的错误选择。你应该给它一个在你希望立方体移动的时间从0移动到1的数字,例如。
float moveTimeInSeconds = 2;
cubeFour.transform.localPosition = Vector3.Lerp(cubeStartingPosition, targetPosition, (Time.time - startTime) / moveTimeInSeconds);
如果定义运动速度更有意义,并且无论起点如何都朝向目标移动,而不是通过开始和结束位置和时间,则使用MoveTowards
。
float step = speed * Time.deltaTime;
cubeFour.transform.localPosition = Vector3.MoveTowards(cubeFour.transform.localPosition, targetPosition, step);
答案 1 :(得分:0)
Lerp使用百分比来制作动画!
这意味着你必须插入一个百分比,而不是每帧接近同一个值的值。
示例Update():
var animationSpeedInSeconds=1;
var animationCounter:float=0;
function Update(){
if(animationCounter>=0 && animationCounter<=1){
animationCounter+=Time.deltaTime/animationSpeedInSeconds;
cubeFour.transform.localPosition = Vector3.MoveTowards(cubeFour.transform.localPosition, targetPosition, animationCounter);
}
}
我希望这有帮助!