因此,我有一个matrix3x3脚本,该脚本是我制作的一个平移和旋转脚本,还有一个我在场景中渲染的2D网格物体,我试图在两点之间反弹。
右为10,左为-10
当物体碰到点时,我希望它改变方向和旋转(平移和角度)
运行代码时,对象首先移至右侧(10),然后到达该点并开始抖动...就像它一直与两个值保持战斗,并且不会将方向或角度变回-10 < / p>
仅供参考:UpdateMesh用于渲染场景中对象的网格,顶点和颜色
我已经将其放在自己的方法中(而不是仅将其放在Update中),并尝试摆弄值,但是我仍然遇到相同的问题...
我希望有人可以指向正确的方向(我感觉这与我的编码顺序有关,但我不确定...)
void RotateAndTranslate()
{
UpdateMesh();
Vector3[] vertices = mesh.vertices;
//angle += rotationSpeed * Time.deltaTime;
//offset2 += 1 * Time.deltaTime * Speed;
offsetpos = offset2;
if (offset2 <= 10)
{
offset2 += 1 * Time.deltaTime * Speed;
angle -= rotationSpeed * Time.deltaTime;
}
else if (offset2 >= -10)
{
offset2 += -1 * Time.deltaTime * Speed;
angle += rotationSpeed * Time.deltaTime;
}
//Get The transformation matrix
Matrix3x3 T = Transform.Translate(offsetpos, 0);
Matrix3x3 R = Transform.Rotate(angle);
//Matrix3x3 T2 = Transform.Translate(-offset.x, -offset.y);
Matrix3x3 T2 = Transform.Translate(-offset.x, -offset.y);
Matrix3x3 M = T * R;
for (int i = 0; i < vertices.Length; i++)
{
vertices[i] = M.MultiplyPoint(vertices[i]);
}
mesh.vertices = vertices;
}
public void Update()
{
RotateAndTranslate();
}
答案 0 :(得分:1)
看看您的
if (offset2 <= 10)
{
offset2 += 1 * Time.deltaTime * Speed;
angle -= rotationSpeed * Time.deltaTime;
}
else if (offset2 >= -10)
{
offset2 += -1 * Time.deltaTime * Speed;
angle += rotationSpeed * Time.deltaTime;
}
这里发生了什么?假设您从0
开始。
因为0 <= 10
是true
,所以执行了第一个块。
有时您会达到10+x
或更高的值。
现在,由于10+x <= 10
为false
但10+x >= -10
为true
,因此执行第二个块。因此,在此框架中,您可以再次减小offset2
,因此在接下来的几帧中,它将很快很快再次达到值<= 10
。
→因此,由于每隔几帧甚至每隔一帧您就改变方向,因此它开始在值10
附近抖动。
对此的一种解决方案是使用简单的bool
标志:
private bool isGoingRight;
...
int offsetSign = isGoingRight ? 1 : -1;
int angleSign = isGoingRight ? -1 : 1;
if (isGoingRight && offset2 >= 10)
{
isGoingRight = false;
}
else if (!isGoingRight && offset2 <= -10)
{
isGoingRight = true;
}
offset2 += offsetSign * Speed * Time.deltaTime;
angle += angleSign * rotationSpeed * Time.deltaTime;
区别:现在,只有达到相应的限制时,这才反转一次。