C# Unity3D Scale 使用带夹具的加速度计
C# Unity3D Scale using Accelerometer with Clamp
我正在尝试将 phone 的 roll(y) 转换为对象的比例,但有大小限制。
我已经成功缩放到无穷大 +- 使用以下代码:
void Update () {
float accelY = Input.acceleration.y;
transform.localScale += new Vector3(0, accelY, 0);
}
我遇到的问题是秤的最大和最小限制。
我尝试按以下方式使用 Clamp,但最终只限制了缩放方向,其中 -y(向自己滚动)等于 0,因此不会发生收缩,而 +y(向外滚动)无限放大假设最大速率为 0.045f。
transform.localScale += new Vector3(0, Mathf.Clamp(accelY, 0f, 0.045f), 0);
在理想情况下,我希望最小比例为 y = 1,最大比例为 y = 100,当您来回滚动 phone 时,它会在两种尺寸之间进行补间。
我可以找到用于平移和旋转的代码片段,但找不到用于缩放的代码片段。请帮忙。
void Update () {
float accelY = Input.acceleration.y;
transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, 1f,
100f), 0)
}
您应该添加 Time.deltaTime,因为更新是 frames/sec 相关的:
[SerializeField]
float speed = 10f;
[SerializeField]
float minSize = 1f;
[SerializeField]
float maxSize = 100f;
void Update () {
float accelY = Input.acceleration.y * Time.deltaTime * speed;
transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, minSize ,
maxSize ), 0)
}
我相信您想将值从一个范围(加速度计)缩放到另一个 0 - 100。如果是这种情况,那么最好不要使用 clamp 函数来完成。您可以使用 map 函数来完成:
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}
传递加速度计值(Input.acceleration.y
)作为主要值。 inValueMin
值应该是您喜欢的最小加速度计值。 inValueMax
值应该是您喜欢的最大加速度计值。这完全由您决定。
outValueMin
和 outValueMax
值是输出的范围。在你的例子中,那是 0
和 100
.
像下面这样的东西应该让你开始:
//Scale Min and max
public float scaleMin = 0;
public float scaleMax = 100f;
//Accelerometer min/max. Find this with Debug.Log(Input.acceleration.y);
public float accelYMin = -10;
public float accelYMax = 10;
void Update()
{
float accelY = Input.acceleration.y;
float scaledVal = mapValue(accelY, accelYMin, accelYMax, scaleMin, scaleMax);
transform.localScale = new Vector3(0, scaledVal, 0);
}
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}
我正在尝试将 phone 的 roll(y) 转换为对象的比例,但有大小限制。
我已经成功缩放到无穷大 +- 使用以下代码:
void Update () {
float accelY = Input.acceleration.y;
transform.localScale += new Vector3(0, accelY, 0);
}
我遇到的问题是秤的最大和最小限制。
我尝试按以下方式使用 Clamp,但最终只限制了缩放方向,其中 -y(向自己滚动)等于 0,因此不会发生收缩,而 +y(向外滚动)无限放大假设最大速率为 0.045f。
transform.localScale += new Vector3(0, Mathf.Clamp(accelY, 0f, 0.045f), 0);
在理想情况下,我希望最小比例为 y = 1,最大比例为 y = 100,当您来回滚动 phone 时,它会在两种尺寸之间进行补间。
我可以找到用于平移和旋转的代码片段,但找不到用于缩放的代码片段。请帮忙。
void Update () {
float accelY = Input.acceleration.y;
transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, 1f,
100f), 0)
}
您应该添加 Time.deltaTime,因为更新是 frames/sec 相关的:
[SerializeField]
float speed = 10f;
[SerializeField]
float minSize = 1f;
[SerializeField]
float maxSize = 100f;
void Update () {
float accelY = Input.acceleration.y * Time.deltaTime * speed;
transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, minSize ,
maxSize ), 0)
}
我相信您想将值从一个范围(加速度计)缩放到另一个 0 - 100。如果是这种情况,那么最好不要使用 clamp 函数来完成。您可以使用 map 函数来完成:
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}
传递加速度计值(Input.acceleration.y
)作为主要值。 inValueMin
值应该是您喜欢的最小加速度计值。 inValueMax
值应该是您喜欢的最大加速度计值。这完全由您决定。
outValueMin
和 outValueMax
值是输出的范围。在你的例子中,那是 0
和 100
.
像下面这样的东西应该让你开始:
//Scale Min and max
public float scaleMin = 0;
public float scaleMax = 100f;
//Accelerometer min/max. Find this with Debug.Log(Input.acceleration.y);
public float accelYMin = -10;
public float accelYMax = 10;
void Update()
{
float accelY = Input.acceleration.y;
float scaledVal = mapValue(accelY, accelYMin, accelYMax, scaleMin, scaleMax);
transform.localScale = new Vector3(0, scaledVal, 0);
}
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}