Навигация в трехмерном пространстве от первого лица
Автор: serrc • Май 27, 2023 • Лабораторная работа • 2,689 Слов (11 Страниц) • 172 Просмотры
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение
высшего образования «Ижевский государственный технический университет
имени М.Т. Калашникова»
Институт «Информатика и вычислительная техника»
Кафедра «Автоматизированные системы обработки информации и управления»
Отчет
по лабораторной работе №4
по дисциплине «Компьютерная графика»
на тему «Навигация в трехмерном пространстве от первого лица. Часть 2».
Выполнил: студент гр. Б20-782-2 | Р. А. Соловьев |
Принял: к.т.н., доцент кафедры АСОИУ | А. Н. Соловьева |
Ижевск 2023
- Постановка задачи
Для выполнения лабораторной работы используется библиотека Three.js и элемент управления PointerLockControls, предоставляющий доступ к Pointer Lock API. Трехмерная сцена содержит горизонтальную поверхность, на которой размещены несколько параллелепипедов. Камера размещена над центром поверхности. Перемещение мыши задает поворот камеры. Нажатие пробела запускает прыжок.
- Перемещение камеры
- Прыжок камеры
Входные данные: координаты камеры, время delta, g, состояние isJumping, состояние isOnFloor, Vy = 20.
Выходные параметры: новые координаты камеры.
Шаги алгоритма:
- пересчитать соотношение сторон;
- isJumping = true?
2.1 если да, то:
2.1.1 вычислить новую координату y = Vy*delta – 1/2*g*delta^2
3. проверить, находится ли камера на полу;
3.1 если да, то:
3.1.1 Vy = 20;
3.1.2 y = -10;
3.1.3 isJumping = false
- Перемещение камеры
Входные данные: координаты камеры, время delta, ray_origin, dir, raycaster
Выходные параметры: новые координаты камеры
Шаги алгоритма:
1. ray_origin = текущая позиция камеры
2. dir = направление взгляда камеры
3. если движение вперед:
3.1 преобразовать dir для движения вперед вектором (x, 0, z)
4. если движение назад
4.1 преобразовать dir для движения назад вектором (-x, 0, -z)
5. если движение вправо
5.1 преобразовать dir для движения назад вектором (-z, 0, x)
6. если движение влево
6.1 преобразовать dir для движения назад вектором (z, 0, -x)
7. установить объекту raycaster векторы ray_origin и dir
8. найти ближайшее пересечение
9. если расстояние до объекта > 2.5:
9.1 переместить камеру в нужном направлении
- Текст программы
На листинге 3.1 приведен текст программы, написанной на языке JavaScript.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>Лабораторная работа №4</title>
</head>
<body>
<canvas id="c" width="600" height="400"
></canvas>
<!-- Для совместимости с браузерами, в которых не поддерживаются карты импортов (import map) -->
<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
<script type="importmap">{
"imports": {
"three": "https://threejs.org/build/three.module.js",
"three/addons/": "https://threejs.org/examples/jsm/"
}
}</script>
</body>
<script type="module">
import * as THREE from 'three';
import {PointerLockControls} from
...