Значение для похудения?
Я не слишком уверен в правильном названии для этого; Однако у меня возникла проблема с функцией масштабирования в моем приложении. По существу, прокручивая колесико мыши в направлении передней части мыши, я должен увеличивать изображение, а в противоположном направлении - наоборот. У меня есть эта часть вниз, но у меня проблема с тем, что значение слишком нервное, когда я подхожу ближе к объекту, который я просматриваю. Мой код пока достаточно прост:
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;
ПРИМЕЧАНИЕ. Если кто-то может придумать более подходящее название для этого, пожалуйста, предложите его или отредактируйте сообщение.