Как делает изменение масштаба, панорамирование и вращение работы?

Установите явные расстояния для каждого цвета для начала и остановки, затем установите средний цвет в двух положениях, чтобы сделать его твердым для этой области.

div {
  height: 90vh;
  margin: 5vh;
  background: linear-gradient(white 0%, red 10%, red 90%, white 100%);
}
<div></div>

6
задан KingNestor 25 February 2009 в 05:06
поделиться

3 ответа

Они достигаются путем применения серии glTranslate, glRotate команды (которые представляют положение камеры и ориентацию) прежде, чем потянуть сцену. (технически, Вы поворачиваете целую сцену!)

Существуют служебные функции как gluLookAt который вид краткого обзора некоторые детали об этом.

К simplyify вещам предположите, что у Вас есть два вектора, представляющие Вашу камеру: положение и направление.

gluLookAt занимает позицию, место назначения и вектор.

Если Вы реализуете векторный класс, destinaion = position + direction должен дать Вам пункт назначения.

Снова для создания вещей простыми можно предположить вектор всегда быть (0,1,0)

Затем прежде, чем представить что-либо в Вашей сцене, загрузите единичную матрицу и назовите gluLookAt

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

Затем начните тянуть свои объекты

Можно позволить пользователю охватить, меняя положение немного направо или налево. Вращение немного более сложно, поскольку необходимо повернуть вектор направления. Предположение, что то, что Вы поворачиваете, является камерой, не некоторым объектом в сцене.

Одна проблема, если у Вас только есть вектор направления "вперед", как Вы перемещаете ее? где правое и левое?

Мой подход в этом случае должен просто взять векторное произведение "направления" и (0,1,0).

Теперь можно переместить камеру налево и к праву с помощью чего-то как:

position = position + right * amount; //amount < 0 moves to the left

Можно продвинуться с помощью "вектора направления", но IMO, лучше ограничить перемещение горизонтальной плоскостью, поэтому добираются, вперед векторизовали тот же способ, которым мы получили правильный вектор:

forward = cross( up, right )

Честно говоря, это - своего рода подход hackish.

Надлежащий подход должен использовать более "сложную" структуру данных для представления "ориентации" камеры, не только прямого направления. Однако, так как Вы только начинаете, хорошо взять вещи один шаг за один раз.

7
ответ дан 9 December 2019 в 20:49
поделиться

Все эти "действия" могут быть достигнуты с помощью функций матричного преобразования образцового представления. Необходимо читать о glTranslatef (панорамирование), glScalef (масштабирование), glRotatef (вращение). Также необходимо должны быть прочитать некоторое основное учебное руководство о OpenGL, Вы могли бы найти эту ссылку полезной.

4
ответ дан 9 December 2019 в 20:49
поделиться

Обычно существует три шага, которые применяются каждый раз, когда Вы ссылаетесь на любую точку в 3-м пространстве в opengl.

Учитывая Локальную точку

  • Локальный-> Мировое Преобразование
  • Мир-> Камера Преобразовывают
  • Камера-> Экран Преобразовывает (обычно проекция. зависит от того, если Вы используете перспективу или ортогональные),

Каждое из этих преобразований берет Вашу 3-ю точку и умножается матрицей.

При вращении камеры она обычно изменяет мир->, камера преобразовывает путем умножения матрицы преобразования на аффинное преобразование вращения/панорамирования/масштабирования. Так как все Ваши точки повторно представляются каждым кадром, к новой матрице относятся Ваши точки, и это дает появление вращения.

1
ответ дан 9 December 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: