Значение для похудения?

Я не слишком уверен в правильном названии для этого; Однако у меня возникла проблема с функцией масштабирования в моем приложении. По существу, прокручивая колесико мыши в направлении передней части мыши, я должен увеличивать изображение, а в противоположном направлении - наоборот. У меня есть эта часть вниз, но у меня проблема с тем, что значение слишком нервное, когда я подхожу ближе к объекту, который я просматриваю. Мой код пока достаточно прост:

float zoomDistance = 10000f;
if (e.Delta > 0) {
    zoomDistance *= -1f;
    while ((Position.X - TargetPosition.X) + zoomDistance < 1000)
        zoomDistance /= 10f;
}

Position += new Vector3(zoomDistance, 0, 0);

Масштаб отлично работает, когда вы движетесь к объекту и от него; но, как я уже сказал, зум становится скачкообразным (движется слишком быстро), когда вы приближаетесь к цели. zoomDistance значение в конечном итоге оказывается что-то вроде -9E, Расстояние масштабирования остается на 10000 пока расстояние от камеры до цели не достигнет 1000 метров. Я полагаю, что проблема здесь может быть связана с размером объекта и с тем, что эффект " похудения " желателен для предотвращения попадания камеры внутрь цели.

Обзор: По сути, камера должна увеличивать изображение с нормальной скоростью, пока она не окажется в пределах х метров от цели (в данном примере, скажем, 1000 метров). Как только он окажется в пределах 1000 метров от цели, он должен начать замедлять скорость масштабирования, пока эффект масштабирования не станет почти ничем. Это предотвращает приближение положения камеры к положению цели.

Вопрос: Как мне "уменьшить" значение, чтобы увеличить масштаб, когда я подхожу ближе к своему объекту.

Просто на всякий случай Дополнения: я использую правую систему координат и Up для моей камеры 0, 0, 1 (устаревший код). Я обменял это из некоторого кода, который я уже написал для масштабирования вместо масштабирования; однако единогласным решением было использовать вместо этого масштабирование, поскольку для его реализации требовалось меньше изменений:

float scale = 10000f;
if (delta < 0)
    while (target.Scale + (delta / scale) < 0)
        scale *= 10;
else
    while (target.Scale + (delta / scale) > 3)
        scale *= 10;

target.Scale += delta / scale;
target.World = Matrix.Scaling(target.Scale) * Matrix.Identity;

ПРИМЕЧАНИЕ. Если кто-то может придумать более подходящее название для этого, пожалуйста, предложите его или отредактируйте сообщение.

0 ответов

Другие вопросы по тегам