С# Unity3D Scale с использованием акселерометра с зажимом

Я пытаюсь перевести рулон (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, и когда вы катите телефон вперед и назад, он будет колебаться между двумя размерами.

Я могу найти фрагменты кода для перевода и поворота, но ничего для масштабирования. Пожалуйста, помогите.


person user2360140    schedule 09.07.2017    source источник
comment
Ok. Вы хотите, чтобы масштаб модели был между 1 и 100. Как насчет значения ускорения? Каковы мин и макс этого? Вы можете проверить это с помощью Debug.Log.   -  person Programmer    schedule 09.07.2017
comment
Я не уверен, диапазон, который я получаю из debug.log, составляет от -10 до +10. ну, я думаю, это больше связано с вращением телефона, если телефон лежит плоско на задней панели, то я ожидаю, что шкала y будет равна 1, а если задняя часть телефонов обращена наружу (-90 °), то я ожидаю, что шкала y равна нулю . Если я могу объяснить проект немного больше. У меня есть некоторая местность, которую я хотел бы видеть плоской, если смотреть на нее сбоку (например, на бумажную карту), а затем, когда пользователь перемещает телефон в положение сверху вниз, он поднимает местность до масштаба 1 (полная высота) . Спасибо за ваш ответ.   -  person user2360140    schedule 09.07.2017


Ответы (2)


void Update () {
   float accelY = Input.acceleration.y;
   transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, 1f, 
   100f), 0)
}

Вы должны добавить Time.deltaTime, потому что обновление зависит от кадров в секунду:

[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)
}
person kamyker    schedule 09.07.2017
comment
Spot on @kamyker Он делает именно то, что я хотел, я очень ценю помощь! Для справки другим: я изменил векторы X и Z на 1 вместо 0, моя ошибка в исходном коде, поэтому теперь модель верна по ширине и глубине, это влияет только на высоту. Моими окончательными значениями после тестирования были float speed = 50f; поплавок minSize = 0,01f; поплавок maxSize = 2f; - person user2360140; 09.07.2017

Я считаю, что вы хотите масштабировать значение от одного диапазона (акселерометр) до другого от 0 до 100. Если это так, то это не лучше всего делать с помощью функции зажима. Вы можете сделать это с помощью функции 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;
}
person Programmer    schedule 09.07.2017