как плавно превратить сферу в полусферу - PullRequest
3 голосов
/ 07 октября 2010

Я использую сторонний объект «ротатор», который обеспечивает плавное, случайное вращение вдоль поверхности сферы. Вращатель используется для управления камерой (см. Rotator.h / c в исходном коде для xscreensaver ).

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

Я бы предпочел не изменять сам ротатор. Таким образом, я мог бы взять вывод широты и использовать его абсолютное значение. Однако плавное движение ротатора по экватору не приведет к плавному движению камеры: оно подпрыгнет.

Полагаю, я мог бы масштабировать выходную широту ротатора от его текущего диапазона до моего целевого диапазона: например, f (lat) = (lat + 1) / 2 отобразит диапазон (0, 1) в (0,5, 1). То есть сопоставить весь «глобус» с северным полушарием. Движение все равно будет плавным. Но то, что вращатель вращал как «южный полюс», стало бы «экватором» для моей камеры. Не приведет ли это к странному движению? Может быть, разрывы? Я не уверен.

Есть ли другой способ плавно отобразить сферу (широту и долготу) на полусферу?

Обновление:

Спасибо за ваше внимание и ответы. Несколько человек попросили разъяснений по поводу «гладкой». Я имею в виду не рывок: небольшое изменение скорости вращения должно быть сопоставлено с небольшим изменением скорости камеры. Если бы я просто взял абсолютное значение широты, нулевое изменение скорости ротатора при его пересечении экватором привело бы к резкому изменению скорости движения камеры (например, отскок).

IIRC это эквивалентно требованию, чтобы первая производная скорости была непрерывной. Непрерывная вторая производная может быть хорошей, но я не думаю, что это важно.

Ответы [ 4 ]

4 голосов
/ 07 октября 2010

Скорость является производной от позиции. Просто «отражая» значение широты, вы создаете «угол» в функции положения при ударе по экватору. Таким образом, чтобы получить плавный переход, вам необходимо отобразить линейное положение (т. Е. Широту как функцию времени) на функцию, которая медленно изменяется вблизи экватора, а первая производная равна 0 на экваторе.

tom10 предложение для отображения lat '(lat) = (lat) ^ 2 является хорошим примером такой функции. Однако вам нужно нормализовать результат, чтобы вы получили lat '(90deg) = 90deg . Итак, правильное отображение должно быть:

широта (широта) = 90 * (широта / 90) ^ 2

Альтернативой параболе является функция sin () с соответствующим смещением и нормализацией. В зависимости от того, насколько вы хотите, чтобы скорость была близка к исходной скорости, когда «вдали» от экватора, вы можете иметь значения экспоненты более высокого или более низкого порядка, например:

широта (широта) = 90 * (| широта / / 90) ^ K

1 голос
/ 07 октября 2010

Вместо абсолютного значения широты вы можете сделать что-то плавное, например (latitiude) 2 .

1 голос
/ 07 октября 2010

Сфера и полушарие топологически различны, поэтому нет способа плавно отобразить между ними таким образом, чтобы это соответствовало вашим критериям.

0 голосов
/ 07 октября 2010

Я не совсем уверен, что понимаю ваш вопрос, поэтому я изложу его на всякий случай:

Вы хотите иметь возможность преобразовать любую точку (заданную широтой и долготой) и преобразовать ее в точку на полушарии, чтобы «движение было плавным» (т. Е. Небольшое движение на сфере превращается в небольшое движение на полусфера)

В этом случае я считаю, что вы можете просто «сложить сферу обратно на себя» (например, взять модуль широты относительно экватора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...